From 86328f9881c2dd46dbf7ccf9ddc425cd27ecde1c Mon Sep 17 00:00:00 2001 From: Gerardo Marx Date: Thu, 16 Jul 2026 14:00:03 -0600 Subject: [PATCH] initial commit --- gpio_bitfield_cpu2/.ccsproject | 12 + gpio_bitfield_cpu2/.clangd | 8 + gpio_bitfield_cpu2/.cproject | 185 + gpio_bitfield_cpu2/.project | 33 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 2 + gpio_bitfield_cpu2/2837xD_FLASH_lnk_cpu2.cmd | 148 + gpio_bitfield_cpu2/2837xD_RAM_lnk_cpu2.cmd | 104 + ...D_CodeStartBranch.asm.4EE093348ADEE433.idx | Bin 0 -> 1028 bytes .../index/device.c.0B89A1F1F3993A3F.idx | Bin 0 -> 11806 bytes .../index/device.h.FC78F7DABF8D1C4D.idx | Bin 0 -> 3236 bytes .../index/driverlib.h.BEE08E1C139315B9.idx | Bin 0 -> 862 bytes .../gpio_bitfield_cpu2.c.3F85F893C12398EA.idx | Bin 0 -> 578 bytes .../CPU2_RAM/.clangd/compile_commands.json | 17 + .../device/F2837xD_CodeStartBranch.asm | 112 + gpio_bitfield_cpu2/device/device.c | 706 ++ gpio_bitfield_cpu2/device/device.h | 394 + gpio_bitfield_cpu2/device/driverlib.h | 87 + gpio_bitfield_cpu2/device/driverlib/adc.c | 342 + gpio_bitfield_cpu2/device/driverlib/adc.h | 2098 +++++ gpio_bitfield_cpu2/device/driverlib/asysctl.c | 43 + gpio_bitfield_cpu2/device/driverlib/asysctl.h | 160 + gpio_bitfield_cpu2/device/driverlib/can.c | 1122 +++ gpio_bitfield_cpu2/device/driverlib/can.h | 1924 +++++ .../device/driverlib/ccs/Debug/driverlib.lib | Bin 0 -> 698 bytes .../driverlib/ccs/Debug/driverlib_coff.lib | Bin 0 -> 575952 bytes .../driverlib/ccs/Debug/driverlib_eabi.lib | Bin 0 -> 1003104 bytes .../driverlib/ccs/Release/driverlib.lib | Bin 0 -> 698 bytes .../driverlib/ccs/Release/driverlib_coff.lib | Bin 0 -> 375766 bytes .../driverlib/ccs/Release/driverlib_eabi.lib | Bin 0 -> 654036 bytes .../driverlib/ccs/driverlib.projectspec | 46 + gpio_bitfield_cpu2/device/driverlib/cla.c | 89 + gpio_bitfield_cpu2/device/driverlib/cla.h | 984 +++ gpio_bitfield_cpu2/device/driverlib/clb.c | 145 + gpio_bitfield_cpu2/device/driverlib/clb.h | 1290 +++ gpio_bitfield_cpu2/device/driverlib/cmpss.c | 223 + gpio_bitfield_cpu2/device/driverlib/cmpss.h | 1325 +++ gpio_bitfield_cpu2/device/driverlib/cpu.h | 172 + .../device/driverlib/cputimer.c | 61 + .../device/driverlib/cputimer.h | 509 ++ gpio_bitfield_cpu2/device/driverlib/dac.c | 93 + gpio_bitfield_cpu2/device/driverlib/dac.h | 604 ++ gpio_bitfield_cpu2/device/driverlib/dcsm.c | 377 + gpio_bitfield_cpu2/device/driverlib/dcsm.h | 669 ++ gpio_bitfield_cpu2/device/driverlib/debug.h | 91 + gpio_bitfield_cpu2/device/driverlib/dma.c | 370 + gpio_bitfield_cpu2/device/driverlib/dma.h | 1171 +++ .../driver_inclusive_terminology_mapping.h | 109 + gpio_bitfield_cpu2/device/driverlib/ecap.c | 61 + gpio_bitfield_cpu2/device/driverlib/ecap.h | 1164 +++ gpio_bitfield_cpu2/device/driverlib/emif.c | 46 + gpio_bitfield_cpu2/device/driverlib/emif.h | 1369 +++ gpio_bitfield_cpu2/device/driverlib/epwm.c | 363 + gpio_bitfield_cpu2/device/driverlib/epwm.h | 7496 +++++++++++++++++ gpio_bitfield_cpu2/device/driverlib/eqep.c | 149 + gpio_bitfield_cpu2/device/driverlib/eqep.h | 1691 ++++ gpio_bitfield_cpu2/device/driverlib/flash.c | 175 + gpio_bitfield_cpu2/device/driverlib/flash.h | 1671 ++++ gpio_bitfield_cpu2/device/driverlib/gpio.c | 489 ++ gpio_bitfield_cpu2/device/driverlib/gpio.h | 1047 +++ gpio_bitfield_cpu2/device/driverlib/hrpwm.c | 47 + gpio_bitfield_cpu2/device/driverlib/hrpwm.h | 1657 ++++ .../driverlib/hw_reg_inclusive_terminology.h | 29 + gpio_bitfield_cpu2/device/driverlib/i2c.c | 351 + gpio_bitfield_cpu2/device/driverlib/i2c.h | 1386 +++ .../device/driverlib/inc/hw_adc.h | 911 ++ .../device/driverlib/inc/hw_asysctl.h | 145 + .../device/driverlib/inc/hw_can.h | 514 ++ .../device/driverlib/inc/hw_cla.h | 241 + .../device/driverlib/inc/hw_clb.h | 661 ++ .../device/driverlib/inc/hw_clbxbar.h | 1272 +++ .../device/driverlib/inc/hw_cmpss.h | 235 + .../device/driverlib/inc/hw_cputimer.h | 112 + .../device/driverlib/inc/hw_dac.h | 122 + .../device/driverlib/inc/hw_dcsm.h | 442 + .../device/driverlib/inc/hw_dma.h | 165 + .../device/driverlib/inc/hw_ecap.h | 157 + .../device/driverlib/inc/hw_emif.h | 259 + .../device/driverlib/inc/hw_epwm.h | 1050 +++ .../device/driverlib/inc/hw_epwmxbar.h | 1192 +++ .../device/driverlib/inc/hw_eqep.h | 225 + .../device/driverlib/inc/hw_flash.h | 286 + .../device/driverlib/inc/hw_gpio.h | 4018 +++++++++ .../device/driverlib/inc/hw_hic.h | 344 + .../device/driverlib/inc/hw_hrpwm.h | 1058 +++ .../device/driverlib/inc/hw_i2c.h | 208 + .../device/driverlib/inc/hw_inputxbar.h | 92 + .../device/driverlib/inc/hw_ints.h | 212 + .../device/driverlib/inc/hw_ipc.h | 323 + .../device/driverlib/inc/hw_mcbsp.h | 286 + .../device/driverlib/inc/hw_memcfg.h | 870 ++ .../device/driverlib/inc/hw_memmap.h | 208 + .../device/driverlib/inc/hw_nmi.h | 134 + .../device/driverlib/inc/hw_otp.h | 63 + .../device/driverlib/inc/hw_outputxbar.h | 1340 +++ .../device/driverlib/inc/hw_pie.h | 636 ++ .../device/driverlib/inc/hw_sci.h | 209 + .../device/driverlib/inc/hw_sdfm.h | 431 + .../device/driverlib/inc/hw_spi.h | 157 + .../device/driverlib/inc/hw_sysctl.h | 1428 ++++ .../device/driverlib/inc/hw_types.h | 166 + .../device/driverlib/inc/hw_upp.h | 306 + .../device/driverlib/inc/hw_usb.h | 4614 ++++++++++ .../device/driverlib/inc/hw_xbar.h | 271 + .../device/driverlib/inc/hw_xint.h | 108 + .../device/driverlib/interrupt.c | 425 + .../device/driverlib/interrupt.h | 497 ++ gpio_bitfield_cpu2/device/driverlib/ipc.c | 445 + gpio_bitfield_cpu2/device/driverlib/ipc.h | 880 ++ gpio_bitfield_cpu2/device/driverlib/mcbsp.c | 1621 ++++ gpio_bitfield_cpu2/device/driverlib/mcbsp.h | 3340 ++++++++ gpio_bitfield_cpu2/device/driverlib/memcfg.c | 701 ++ gpio_bitfield_cpu2/device/driverlib/memcfg.h | 1266 +++ gpio_bitfield_cpu2/device/driverlib/pin_map.h | 894 ++ .../device/driverlib/pin_map_legacy.h | 95 + gpio_bitfield_cpu2/device/driverlib/sci.c | 421 + gpio_bitfield_cpu2/device/driverlib/sci.h | 1646 ++++ gpio_bitfield_cpu2/device/driverlib/sdfm.c | 188 + gpio_bitfield_cpu2/device/driverlib/sdfm.h | 1178 +++ gpio_bitfield_cpu2/device/driverlib/spi.c | 661 ++ gpio_bitfield_cpu2/device/driverlib/spi.h | 1743 ++++ gpio_bitfield_cpu2/device/driverlib/sysctl.c | 1469 ++++ gpio_bitfield_cpu2/device/driverlib/sysctl.h | 3531 ++++++++ gpio_bitfield_cpu2/device/driverlib/upp.c | 298 + gpio_bitfield_cpu2/device/driverlib/upp.h | 1574 ++++ gpio_bitfield_cpu2/device/driverlib/usb.c | 4018 +++++++++ gpio_bitfield_cpu2/device/driverlib/usb.h | 560 ++ gpio_bitfield_cpu2/device/driverlib/version.c | 54 + gpio_bitfield_cpu2/device/driverlib/version.h | 101 + gpio_bitfield_cpu2/device/driverlib/xbar.c | 255 + gpio_bitfield_cpu2/device/driverlib/xbar.h | 1294 +++ gpio_bitfield_cpu2/gpio_bitfield_cpu2.c | 0 .../targetConfigs/TMS320F28377D.ccxml | 22 + gpio_bitfield_cpu2/targetConfigs/readme.txt | 9 + gpio_driverlib_cpu1/.ccsproject | 12 + gpio_driverlib_cpu1/.clangd | 8 + gpio_driverlib_cpu1/.cproject | 185 + gpio_driverlib_cpu1/.project | 33 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 9 + gpio_driverlib_cpu1/2837xD_FLASH_lnk_cpu1.cmd | 176 + gpio_driverlib_cpu1/2837xD_RAM_lnk_cpu1.cmd | 141 + ...D_CodeStartBranch.asm.9982C06611A2C0D7.idx | Bin 0 -> 1024 bytes .../index/device.c.E7CB02094E34E1A6.idx | Bin 0 -> 11802 bytes .../index/device.h.E9CAB133E05C7633.idx | Bin 0 -> 3210 bytes .../index/driverlib.h.87B503574AD85612.idx | Bin 0 -> 860 bytes ...gpio_driverlib_cpu1.c.23D1B9BF748D0959.idx | Bin 0 -> 790 bytes .../CPU1_RAM/.clangd/compile_commands.json | 17 + gpio_driverlib_cpu1/CPU1_RAM/ccsObjs.opt | 6 + .../device/F2837xD_CodeStartBranch.obj | Bin 0 -> 3828 bytes gpio_driverlib_cpu1/CPU1_RAM/device/device.d | 267 + .../CPU1_RAM/device/device.obj | Bin 0 -> 28520 bytes .../CPU1_RAM/device/subdir_rules.mk | 18 + .../CPU1_RAM/device/subdir_vars.mk | 38 + .../CPU1_RAM/gpio_driverlib_cpu1.d | 267 + .../CPU1_RAM/gpio_driverlib_cpu1.map | 360 + .../CPU1_RAM/gpio_driverlib_cpu1.obj | Bin 0 -> 7992 bytes .../CPU1_RAM/gpio_driverlib_cpu1.out | Bin 0 -> 57756 bytes .../CPU1_RAM/gpio_driverlib_cpu1_linkInfo.xml | 4696 +++++++++++ gpio_driverlib_cpu1/CPU1_RAM/makefile | 149 + gpio_driverlib_cpu1/CPU1_RAM/objects.mk | 8 + gpio_driverlib_cpu1/CPU1_RAM/sources.mk | 110 + gpio_driverlib_cpu1/CPU1_RAM/subdir_rules.mk | 12 + gpio_driverlib_cpu1/CPU1_RAM/subdir_vars.mk | 30 + .../device/F2837xD_CodeStartBranch.asm | 112 + gpio_driverlib_cpu1/device/device.c | 706 ++ gpio_driverlib_cpu1/device/device.h | 394 + gpio_driverlib_cpu1/device/driverlib.h | 87 + gpio_driverlib_cpu1/device/driverlib/adc.c | 342 + gpio_driverlib_cpu1/device/driverlib/adc.h | 2098 +++++ .../device/driverlib/asysctl.c | 43 + .../device/driverlib/asysctl.h | 160 + gpio_driverlib_cpu1/device/driverlib/can.c | 1122 +++ gpio_driverlib_cpu1/device/driverlib/can.h | 1924 +++++ .../device/driverlib/ccs/Debug/driverlib.lib | Bin 0 -> 698 bytes .../driverlib/ccs/Debug/driverlib_coff.lib | Bin 0 -> 575952 bytes .../driverlib/ccs/Debug/driverlib_eabi.lib | Bin 0 -> 1003104 bytes .../driverlib/ccs/Release/driverlib.lib | Bin 0 -> 698 bytes .../driverlib/ccs/Release/driverlib_coff.lib | Bin 0 -> 375766 bytes .../driverlib/ccs/Release/driverlib_eabi.lib | Bin 0 -> 654036 bytes .../driverlib/ccs/driverlib.projectspec | 46 + gpio_driverlib_cpu1/device/driverlib/cla.c | 89 + gpio_driverlib_cpu1/device/driverlib/cla.h | 984 +++ gpio_driverlib_cpu1/device/driverlib/clb.c | 145 + gpio_driverlib_cpu1/device/driverlib/clb.h | 1290 +++ gpio_driverlib_cpu1/device/driverlib/cmpss.c | 223 + gpio_driverlib_cpu1/device/driverlib/cmpss.h | 1325 +++ gpio_driverlib_cpu1/device/driverlib/cpu.h | 172 + .../device/driverlib/cputimer.c | 61 + .../device/driverlib/cputimer.h | 509 ++ gpio_driverlib_cpu1/device/driverlib/dac.c | 93 + gpio_driverlib_cpu1/device/driverlib/dac.h | 604 ++ gpio_driverlib_cpu1/device/driverlib/dcsm.c | 377 + gpio_driverlib_cpu1/device/driverlib/dcsm.h | 669 ++ gpio_driverlib_cpu1/device/driverlib/debug.h | 91 + gpio_driverlib_cpu1/device/driverlib/dma.c | 370 + gpio_driverlib_cpu1/device/driverlib/dma.h | 1171 +++ .../driver_inclusive_terminology_mapping.h | 109 + gpio_driverlib_cpu1/device/driverlib/ecap.c | 61 + gpio_driverlib_cpu1/device/driverlib/ecap.h | 1164 +++ gpio_driverlib_cpu1/device/driverlib/emif.c | 46 + gpio_driverlib_cpu1/device/driverlib/emif.h | 1369 +++ gpio_driverlib_cpu1/device/driverlib/epwm.c | 363 + gpio_driverlib_cpu1/device/driverlib/epwm.h | 7496 +++++++++++++++++ gpio_driverlib_cpu1/device/driverlib/eqep.c | 149 + gpio_driverlib_cpu1/device/driverlib/eqep.h | 1691 ++++ gpio_driverlib_cpu1/device/driverlib/flash.c | 175 + gpio_driverlib_cpu1/device/driverlib/flash.h | 1671 ++++ gpio_driverlib_cpu1/device/driverlib/gpio.c | 489 ++ gpio_driverlib_cpu1/device/driverlib/gpio.h | 1047 +++ gpio_driverlib_cpu1/device/driverlib/hrpwm.c | 47 + gpio_driverlib_cpu1/device/driverlib/hrpwm.h | 1657 ++++ .../driverlib/hw_reg_inclusive_terminology.h | 29 + gpio_driverlib_cpu1/device/driverlib/i2c.c | 351 + gpio_driverlib_cpu1/device/driverlib/i2c.h | 1386 +++ .../device/driverlib/inc/hw_adc.h | 911 ++ .../device/driverlib/inc/hw_asysctl.h | 145 + .../device/driverlib/inc/hw_can.h | 514 ++ .../device/driverlib/inc/hw_cla.h | 241 + .../device/driverlib/inc/hw_clb.h | 661 ++ .../device/driverlib/inc/hw_clbxbar.h | 1272 +++ .../device/driverlib/inc/hw_cmpss.h | 235 + .../device/driverlib/inc/hw_cputimer.h | 112 + .../device/driverlib/inc/hw_dac.h | 122 + .../device/driverlib/inc/hw_dcsm.h | 442 + .../device/driverlib/inc/hw_dma.h | 165 + .../device/driverlib/inc/hw_ecap.h | 157 + .../device/driverlib/inc/hw_emif.h | 259 + .../device/driverlib/inc/hw_epwm.h | 1050 +++ .../device/driverlib/inc/hw_epwmxbar.h | 1192 +++ .../device/driverlib/inc/hw_eqep.h | 225 + .../device/driverlib/inc/hw_flash.h | 286 + .../device/driverlib/inc/hw_gpio.h | 4018 +++++++++ .../device/driverlib/inc/hw_hic.h | 344 + .../device/driverlib/inc/hw_hrpwm.h | 1058 +++ .../device/driverlib/inc/hw_i2c.h | 208 + .../device/driverlib/inc/hw_inputxbar.h | 92 + .../device/driverlib/inc/hw_ints.h | 212 + .../device/driverlib/inc/hw_ipc.h | 323 + .../device/driverlib/inc/hw_mcbsp.h | 286 + .../device/driverlib/inc/hw_memcfg.h | 870 ++ .../device/driverlib/inc/hw_memmap.h | 208 + .../device/driverlib/inc/hw_nmi.h | 134 + .../device/driverlib/inc/hw_otp.h | 63 + .../device/driverlib/inc/hw_outputxbar.h | 1340 +++ .../device/driverlib/inc/hw_pie.h | 636 ++ .../device/driverlib/inc/hw_sci.h | 209 + .../device/driverlib/inc/hw_sdfm.h | 431 + .../device/driverlib/inc/hw_spi.h | 157 + .../device/driverlib/inc/hw_sysctl.h | 1428 ++++ .../device/driverlib/inc/hw_types.h | 166 + .../device/driverlib/inc/hw_upp.h | 306 + .../device/driverlib/inc/hw_usb.h | 4614 ++++++++++ .../device/driverlib/inc/hw_xbar.h | 271 + .../device/driverlib/inc/hw_xint.h | 108 + .../device/driverlib/interrupt.c | 425 + .../device/driverlib/interrupt.h | 497 ++ gpio_driverlib_cpu1/device/driverlib/ipc.c | 445 + gpio_driverlib_cpu1/device/driverlib/ipc.h | 880 ++ gpio_driverlib_cpu1/device/driverlib/mcbsp.c | 1621 ++++ gpio_driverlib_cpu1/device/driverlib/mcbsp.h | 3340 ++++++++ gpio_driverlib_cpu1/device/driverlib/memcfg.c | 701 ++ gpio_driverlib_cpu1/device/driverlib/memcfg.h | 1266 +++ .../device/driverlib/pin_map.h | 894 ++ .../device/driverlib/pin_map_legacy.h | 95 + gpio_driverlib_cpu1/device/driverlib/sci.c | 421 + gpio_driverlib_cpu1/device/driverlib/sci.h | 1646 ++++ gpio_driverlib_cpu1/device/driverlib/sdfm.c | 188 + gpio_driverlib_cpu1/device/driverlib/sdfm.h | 1178 +++ gpio_driverlib_cpu1/device/driverlib/spi.c | 661 ++ gpio_driverlib_cpu1/device/driverlib/spi.h | 1743 ++++ gpio_driverlib_cpu1/device/driverlib/sysctl.c | 1469 ++++ gpio_driverlib_cpu1/device/driverlib/sysctl.h | 3531 ++++++++ gpio_driverlib_cpu1/device/driverlib/upp.c | 298 + gpio_driverlib_cpu1/device/driverlib/upp.h | 1574 ++++ gpio_driverlib_cpu1/device/driverlib/usb.c | 4018 +++++++++ gpio_driverlib_cpu1/device/driverlib/usb.h | 560 ++ .../device/driverlib/version.c | 54 + .../device/driverlib/version.h | 101 + gpio_driverlib_cpu1/device/driverlib/xbar.c | 255 + gpio_driverlib_cpu1/device/driverlib/xbar.h | 1294 +++ gpio_driverlib_cpu1/gpio_driverlib_cpu1.c | 0 .../targetConfigs/TMS320F28377D.ccxml | 22 + gpio_driverlib_cpu1/targetConfigs/readme.txt | 9 + 284 files changed, 185385 insertions(+) create mode 100644 gpio_bitfield_cpu2/.ccsproject create mode 100644 gpio_bitfield_cpu2/.clangd create mode 100644 gpio_bitfield_cpu2/.cproject create mode 100644 gpio_bitfield_cpu2/.project create mode 100644 gpio_bitfield_cpu2/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 gpio_bitfield_cpu2/.settings/org.eclipse.core.resources.prefs create mode 100644 gpio_bitfield_cpu2/2837xD_FLASH_lnk_cpu2.cmd create mode 100644 gpio_bitfield_cpu2/2837xD_RAM_lnk_cpu2.cmd create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.4EE093348ADEE433.idx create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/device.c.0B89A1F1F3993A3F.idx create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/device.h.FC78F7DABF8D1C4D.idx create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/driverlib.h.BEE08E1C139315B9.idx create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/gpio_bitfield_cpu2.c.3F85F893C12398EA.idx create mode 100644 gpio_bitfield_cpu2/CPU2_RAM/.clangd/compile_commands.json create mode 100644 gpio_bitfield_cpu2/device/F2837xD_CodeStartBranch.asm create mode 100644 gpio_bitfield_cpu2/device/device.c create mode 100644 gpio_bitfield_cpu2/device/device.h create mode 100644 gpio_bitfield_cpu2/device/driverlib.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/adc.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/adc.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/asysctl.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/asysctl.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/can.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/can.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib_coff.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib_eabi.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_coff.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_eabi.lib create mode 100644 gpio_bitfield_cpu2/device/driverlib/ccs/driverlib.projectspec create mode 100644 gpio_bitfield_cpu2/device/driverlib/cla.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/cla.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/clb.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/clb.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/cmpss.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/cmpss.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/cpu.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/cputimer.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/cputimer.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/dac.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/dac.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/dcsm.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/dcsm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/debug.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/dma.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/dma.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/driver_inclusive_terminology_mapping.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/ecap.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/ecap.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/emif.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/emif.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/epwm.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/epwm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/eqep.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/eqep.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/flash.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/flash.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/gpio.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/gpio.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/hrpwm.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/hrpwm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/hw_reg_inclusive_terminology.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/i2c.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/i2c.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_adc.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_asysctl.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_can.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_cla.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_clb.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_clbxbar.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_cmpss.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_cputimer.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_dac.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_dcsm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_dma.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_ecap.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_emif.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_epwm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_epwmxbar.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_eqep.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_flash.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_gpio.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_hic.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_hrpwm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_i2c.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_inputxbar.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_ints.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_ipc.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_mcbsp.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_memcfg.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_memmap.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_nmi.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_otp.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_outputxbar.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_pie.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_sci.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_sdfm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_spi.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_sysctl.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_types.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_upp.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_usb.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_xbar.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/inc/hw_xint.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/interrupt.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/interrupt.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/ipc.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/ipc.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/mcbsp.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/mcbsp.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/memcfg.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/memcfg.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/pin_map.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/pin_map_legacy.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/sci.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/sci.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/sdfm.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/sdfm.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/spi.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/spi.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/sysctl.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/sysctl.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/upp.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/upp.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/usb.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/usb.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/version.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/version.h create mode 100644 gpio_bitfield_cpu2/device/driverlib/xbar.c create mode 100644 gpio_bitfield_cpu2/device/driverlib/xbar.h create mode 100644 gpio_bitfield_cpu2/gpio_bitfield_cpu2.c create mode 100644 gpio_bitfield_cpu2/targetConfigs/TMS320F28377D.ccxml create mode 100644 gpio_bitfield_cpu2/targetConfigs/readme.txt create mode 100644 gpio_driverlib_cpu1/.ccsproject create mode 100644 gpio_driverlib_cpu1/.clangd create mode 100644 gpio_driverlib_cpu1/.cproject create mode 100644 gpio_driverlib_cpu1/.project create mode 100644 gpio_driverlib_cpu1/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 gpio_driverlib_cpu1/.settings/org.eclipse.core.resources.prefs create mode 100644 gpio_driverlib_cpu1/2837xD_FLASH_lnk_cpu1.cmd create mode 100644 gpio_driverlib_cpu1/2837xD_RAM_lnk_cpu1.cmd create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.9982C06611A2C0D7.idx create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/device.c.E7CB02094E34E1A6.idx create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/device.h.E9CAB133E05C7633.idx create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/driverlib.h.87B503574AD85612.idx create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/gpio_driverlib_cpu1.c.23D1B9BF748D0959.idx create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/.clangd/compile_commands.json create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/ccsObjs.opt create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/device/F2837xD_CodeStartBranch.obj create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/device/device.d create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/device/device.obj create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/device/subdir_rules.mk create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/device/subdir_vars.mk create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.d create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.map create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.obj create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.out create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1_linkInfo.xml create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/makefile create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/objects.mk create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/sources.mk create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/subdir_rules.mk create mode 100644 gpio_driverlib_cpu1/CPU1_RAM/subdir_vars.mk create mode 100644 gpio_driverlib_cpu1/device/F2837xD_CodeStartBranch.asm create mode 100644 gpio_driverlib_cpu1/device/device.c create mode 100644 gpio_driverlib_cpu1/device/device.h create mode 100644 gpio_driverlib_cpu1/device/driverlib.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/adc.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/adc.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/asysctl.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/asysctl.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/can.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/can.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib_coff.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib_eabi.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_coff.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_eabi.lib create mode 100644 gpio_driverlib_cpu1/device/driverlib/ccs/driverlib.projectspec create mode 100644 gpio_driverlib_cpu1/device/driverlib/cla.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/cla.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/clb.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/clb.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/cmpss.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/cmpss.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/cpu.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/cputimer.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/cputimer.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/dac.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/dac.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/dcsm.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/dcsm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/debug.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/dma.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/dma.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/driver_inclusive_terminology_mapping.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/ecap.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/ecap.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/emif.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/emif.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/epwm.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/epwm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/eqep.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/eqep.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/flash.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/flash.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/gpio.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/gpio.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/hrpwm.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/hrpwm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/hw_reg_inclusive_terminology.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/i2c.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/i2c.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_adc.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_asysctl.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_can.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_cla.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_clb.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_clbxbar.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_cmpss.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_cputimer.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_dac.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_dcsm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_dma.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_ecap.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_emif.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_epwm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_epwmxbar.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_eqep.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_flash.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_gpio.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_hic.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_hrpwm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_i2c.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_inputxbar.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_ints.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_ipc.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_mcbsp.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_memcfg.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_memmap.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_nmi.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_otp.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_outputxbar.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_pie.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_sci.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_sdfm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_spi.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_sysctl.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_types.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_upp.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_usb.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_xbar.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/inc/hw_xint.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/interrupt.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/interrupt.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/ipc.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/ipc.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/mcbsp.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/mcbsp.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/memcfg.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/memcfg.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/pin_map.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/pin_map_legacy.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/sci.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/sci.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/sdfm.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/sdfm.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/spi.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/spi.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/sysctl.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/sysctl.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/upp.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/upp.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/usb.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/usb.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/version.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/version.h create mode 100644 gpio_driverlib_cpu1/device/driverlib/xbar.c create mode 100644 gpio_driverlib_cpu1/device/driverlib/xbar.h create mode 100644 gpio_driverlib_cpu1/gpio_driverlib_cpu1.c create mode 100644 gpio_driverlib_cpu1/targetConfigs/TMS320F28377D.ccxml create mode 100644 gpio_driverlib_cpu1/targetConfigs/readme.txt diff --git a/gpio_bitfield_cpu2/.ccsproject b/gpio_bitfield_cpu2/.ccsproject new file mode 100644 index 0000000..e089904 --- /dev/null +++ b/gpio_bitfield_cpu2/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gpio_bitfield_cpu2/.clangd b/gpio_bitfield_cpu2/.clangd new file mode 100644 index 0000000..657a761 --- /dev/null +++ b/gpio_bitfield_cpu2/.clangd @@ -0,0 +1,8 @@ +# This is an auto-generated file - do not add it to source-control + +CompileFlags: + CompilationDatabase: CPU2_RAM/.clangd + +Diagnostics: + Suppress: '*' + diff --git a/gpio_bitfield_cpu2/.cproject b/gpio_bitfield_cpu2/.cproject new file mode 100644 index 0000000..377ea92 --- /dev/null +++ b/gpio_bitfield_cpu2/.cproject @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_bitfield_cpu2/.project b/gpio_bitfield_cpu2/.project new file mode 100644 index 0000000..e46a80f --- /dev/null +++ b/gpio_bitfield_cpu2/.project @@ -0,0 +1,33 @@ + + + gpio_bitfield_cpu2 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + + + + driverlib.lib + 1 + COM_TI_C2000WARE_INSTALL_DIR/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib + + + + + C2000WARE_DLIB_ROOT + $%7BCOM_TI_C2000WARE_INSTALL_DIR%7D/driverlib/f2837xd/driverlib + + + diff --git a/gpio_bitfield_cpu2/.settings/org.eclipse.cdt.codan.core.prefs b/gpio_bitfield_cpu2/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..f653028 --- /dev/null +++ b/gpio_bitfield_cpu2/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/gpio_bitfield_cpu2/.settings/org.eclipse.core.resources.prefs b/gpio_bitfield_cpu2/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/gpio_bitfield_cpu2/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/gpio_bitfield_cpu2/2837xD_FLASH_lnk_cpu2.cmd b/gpio_bitfield_cpu2/2837xD_FLASH_lnk_cpu2.cmd new file mode 100644 index 0000000..8c6a609 --- /dev/null +++ b/gpio_bitfield_cpu2/2837xD_FLASH_lnk_cpu2.cmd @@ -0,0 +1,148 @@ + +MEMORY +{ +PAGE 0 : + /* BEGIN is used for the "boot to SARAM" bootloader mode */ + + BEGIN : origin = 0x080000, length = 0x000002 + RAMM0 : origin = 0x0000A2, length = 0x00035E + RAMD0 : origin = 0x00B000, length = 0x000800 + RAMLS0 : origin = 0x008000, length = 0x000800 + RAMLS1 : origin = 0x008800, length = 0x000800 + RAMLS2 : origin = 0x009000, length = 0x000800 + RAMLS3 : origin = 0x009800, length = 0x000800 + RAMLS4 : origin = 0x00A000, length = 0x000800 + RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS15 : origin = 0x01B000, length = 0x000FF8 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + +// RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + + RESET : origin = 0x3FFFC0, length = 0x000002 + + /* Flash sectors */ + FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ + FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ + FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ + FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ + FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ + FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ + FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ + FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ + FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ + FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ + FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ + FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ + FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ + FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */ + +// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + +PAGE 1 : + + BOOT_RSVD : origin = 0x000002, length = 0x0000A0 /* Part of M0, BOOT rom will use this for stack */ + RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */ +// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + RAMD1 : origin = 0x00B800, length = 0x000800 + + RAMLS5 : origin = 0x00A800, length = 0x000800 + + RAMGS0 : origin = 0x00C000, length = 0x001000 + RAMGS1 : origin = 0x00D000, length = 0x001000 + RAMGS2 : origin = 0x00E000, length = 0x001000 + CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 + CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 +} + +SECTIONS +{ + /* Allocate program areas: */ + .cinit : > FLASHB PAGE = 0, ALIGN(8) + .text : > FLASHB PAGE = 0, ALIGN(8) + codestart : > BEGIN PAGE = 0, ALIGN(8) + + /* Allocate uninitalized data sections: */ + .stack : > RAMM1 PAGE = 1 + + /* Initalized sections go in Flash */ + .switch : > FLASHB PAGE = 0, ALIGN(8) + .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ + +#if defined(__TI_EABI__) + .init_array : > FLASHB, PAGE = 0, ALIGN(8) + .bss : > RAMLS5, PAGE = 1 + .bss:output : > RAMLS3, PAGE = 0 + .bss:cio : > RAMLS5, PAGE = 1 + .data : > RAMLS5, PAGE = 1 + .sysmem : > RAMLS5, PAGE = 1 + /* Initalized sections go in Flash */ + .const : > FLASHF, PAGE = 0, ALIGN(8) +#else + .pinit : > FLASHB, PAGE = 0, ALIGN(8) + .ebss : >> RAMLS5 | RAMGS0 | RAMGS1, PAGE = 1 + .esysmem : > RAMLS5, PAGE = 1 + .cio : > RAMLS5, PAGE = 1 + /* Initalized sections go in Flash */ + .econst : >> FLASHF PAGE = 0, ALIGN(8) +#endif + + SHARERAMGS0 : > RAMGS0, PAGE = 1 + SHARERAMGS1 : > RAMGS1, PAGE = 1 + SHARERAMGS2 : > RAMGS2, PAGE = 1 + +#ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + #if defined(__TI_EABI__) + .TI.ramfunc : {} LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(RamfuncsLoadStart), + LOAD_SIZE(RamfuncsLoadSize), + LOAD_END(RamfuncsLoadEnd), + RUN_START(RamfuncsRunStart), + RUN_SIZE(RamfuncsRunSize), + RUN_END(RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #else + .TI.ramfunc : {} LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(_RamfuncsLoadStart), + LOAD_SIZE(_RamfuncsLoadSize), + LOAD_END(_RamfuncsLoadEnd), + RUN_START(_RamfuncsRunStart), + RUN_SIZE(_RamfuncsRunSize), + RUN_END(_RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #endif + #else + ramfuncs : LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(_RamfuncsLoadStart), + LOAD_SIZE(_RamfuncsLoadSize), + LOAD_END(_RamfuncsLoadEnd), + RUN_START(_RamfuncsRunStart), + RUN_SIZE(_RamfuncsRunSize), + RUN_END(_RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #endif +#endif + + /* The following section definitions are required when using the IPC API Drivers */ + GROUP : > CPU2TOCPU1RAM, PAGE = 1 + { + PUTBUFFER + PUTWRITEIDX + GETREADIDX + } + + GROUP : > CPU1TOCPU2RAM, PAGE = 1 + { + GETBUFFER : TYPE = DSECT + GETWRITEIDX : TYPE = DSECT + PUTREADIDX : TYPE = DSECT + } +} + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/gpio_bitfield_cpu2/2837xD_RAM_lnk_cpu2.cmd b/gpio_bitfield_cpu2/2837xD_RAM_lnk_cpu2.cmd new file mode 100644 index 0000000..bca4726 --- /dev/null +++ b/gpio_bitfield_cpu2/2837xD_RAM_lnk_cpu2.cmd @@ -0,0 +1,104 @@ + +MEMORY +{ +PAGE 0 : + /* BEGIN is used for the "boot to SARAM" bootloader mode */ + + BEGIN : origin = 0x000000, length = 0x000002 + RAMM0 : origin = 0x0000A2, length = 0x00035E + RAMD0 : origin = 0x00B000, length = 0x000800 + RAMLS0 : origin = 0x008000, length = 0x000800 + RAMLS1 : origin = 0x008800, length = 0x000800 + RAMLS2 : origin = 0x009000, length = 0x000800 + RAMLS3 : origin = 0x009800, length = 0x000800 + RAMLS4 : origin = 0x00A000, length = 0x000800 + RESET : origin = 0x3FFFC0, length = 0x000002 + + /* Flash sectors */ + FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ + FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ + FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ + FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ + FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ + FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ + FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ + FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ + FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ + FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ + FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ + FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ + FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ + FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */ + +// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + + +PAGE 1 : + + BOOT_RSVD : origin = 0x000002, length = 0x0000A0 /* Part of M0, BOOT rom will use this for stack */ + RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */ +// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + RAMD1 : origin = 0x00B800, length = 0x000800 + + RAMLS5 : origin = 0x00A800, length = 0x000800 + + CANA_MSG_RAM : origin = 0x049000, length = 0x000800 + CANB_MSG_RAM : origin = 0x04B000, length = 0x000800 + + CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 + CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 +} + + +SECTIONS +{ + codestart : > BEGIN, PAGE = 0 + .text : >>RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0 + .cinit : > RAMM0, PAGE = 0 + .switch : > RAMM0, PAGE = 0 + .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ + .stack : > RAMM1, PAGE = 1 + +#if defined(__TI_EABI__) + .bss : > RAMLS5, PAGE = 1 + .bss:output : > RAMLS3, PAGE = 0 + .init_array : > RAMM0, PAGE = 0 + .const : > RAMLS5, PAGE = 1 + .data : > RAMLS5, PAGE = 1 + .sysmem : > RAMLS5, PAGE = 1 +#else + .pinit : > RAMM0, PAGE = 0 + .ebss : > RAMLS5, PAGE = 1 + .econst : > RAMLS5, PAGE = 1 + .esysmem : > RAMLS5, PAGE = 1 +#endif + +#ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + .TI.ramfunc : {} > RAMM0, PAGE = 0 + #else + ramfuncs : > RAMM0 PAGE = 0 + #endif +#endif + + /* The following section definitions are required when using the IPC API Drivers */ + GROUP : > CPU2TOCPU1RAM, PAGE = 1 + { + PUTBUFFER + PUTWRITEIDX + GETREADIDX + } + + GROUP : > CPU1TOCPU2RAM, PAGE = 1 + { + GETBUFFER : TYPE = DSECT + GETWRITEIDX : TYPE = DSECT + PUTREADIDX : TYPE = DSECT + } +} + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.4EE093348ADEE433.idx b/gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.4EE093348ADEE433.idx new file mode 100644 index 0000000000000000000000000000000000000000..ac2e12e92e699fe5e566c23cc005a2750902e021 GIT binary patch literal 1028 zcmWIYbaVT|%)sEB;#rZKT9U}Zz`!63#Kk2=ncEo|7{Y)86?2XT-_L$*!1HbXrtc3m z&Tfonug;i#??$Zm@lBWZvK|i$GFCU6cKO@C-^I7y-gsbf!&y>-Q|0I6Kea}W=M=8n zb8pe}wV@Ta=gc>r=Pw_&_{FE2DW%7M*!Ijdj_O*F>n>n&LdQ3F249)3&9s}TGnXA_ zb~jn9y<+q0{P60pdY}AtJR_?n^2s%AZF9JFEwkA!ZD$UXeTnww?i3TRODX?C8s05= zDau!%?c{%9%c1uN->AGbBVH<*zqeUMwhBom$hh?EaIrygk(_x2rp2GV6cG&s!F_YIEk2lgECZ>$;$w zEBr9Vr-X60!-pSTt_C0UdS6IM+}+T>;=IwLnmyAWi}jXH{KKy7lw0e)L7*toM*W@X zhjq(N)c^IJT=kRZPwq8lZ9RX4C-Re1fLQNx6_tC-aXmO zGK67P4Gtb|!I{&^qFR13eAX#U&b`5}=0Q1*rrf@lq91m0)tPkO7(t3Kp0!EJT>NP(p%B zG(|B*9i|8tEu7qk^{1hmzRf$or9H)g_( literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/device.c.0B89A1F1F3993A3F.idx b/gpio_bitfield_cpu2/CPU2_RAM/.clangd/.cache/clangd/index/device.c.0B89A1F1F3993A3F.idx new file mode 100644 index 0000000000000000000000000000000000000000..d752241050ef7babb54eb94d990181f7e63d013f GIT binary patch literal 11806 zcmY+K30zLu|Hq$m@ApzqPjQj9n)q#jzxS-)bI$kN*;6J?>}@HLj9WHk+q&gj zoIxUy^u+&d-s0x!*F_>Zt}T&l3w}5M(}sR_-7E5cI6d+^UVmb_K@~SUvd0&*WXE6o z)+7vfU7p(I%BiNO&0~w6v^D7ObT-s;~2D~4;B35nj3&*a+tQN&a-9xwR<^sHT)RUCE#4sPN!sNb!k|R%yRkT zxbvsX=PpWUH4Q1hKCom)pNt-cp-cR=e!H-@z` zAu3~HjOsIAbFK5!T(xVuyKL2bIMqKsK<&cd?CqE4C%UTb7%=T<=H8gfvu!!EUiDt4 zHBC0geEj@X+S8UB?Ty!d;COeH{i?EoNl95dtT)})?NhZ%h2PUH?slaP zQ4=04a+sLbwr5F4fojUPSL^I{+n1_qXsn)9zBYT+t^%n>&>H7x{kJ(WE4n*9efcgY zChzEB3+Ef=4rTou{>W?8The&W=5MQR>fMHBIlV4;u2#9?nnsJu(zG=bHf?r49ku*h z%T1q-j0BzUSGupwa$`e+RfeJPZ?YshByu1kh~J78v6Z`bQc*K#Az zQ^;*xctqU$dwwq#TDleZ_6^s5X{F;8Y5cUpOM7@;)v~TOL$apIS0%bMz6jmf{-$Py zip%|Wv-vX{+;?R=uU_C%vT8#8fU(yfOsPHp!&Uv?E{Q{bt=RT4?rPy8t>R4~y&mQ! zb@BJ^_UY5o+#^5Uo$?#D!jKI!iHzbGXjc7FRI+(?WAouC9Akg^2CQb)jxR68u@-z`YE^J zZOLk<=5O7(W!~HQD=jUy`fCZd94|OoE*u?mQG3O`YyX@uvT;wJ*VZ(-eX7gjDV*S{ zUsn5k(^kDh!6DwC9^aq&(q41?FDGZL8TO%NV}^Qin*Imlm-?f7J#Xq)1z+z(XH~3l zyxe>~#ihIB{m-p-3+EJ+_4fJ{t>))^`tbLNduqNz60}bIsL2|mbMETAL(I+b20Pj; zzgqh7VfrrTbMLJ3o9$xQdSY1d(9&7k?ME~O+q#sS%W{G@zEP3o+bx}+AOCB4{iuEK z%<}^$WXG-=dj0N|%^%j<_B^1w@Zq>nS^TG-|6}jJ@hw}}W2%lNYUy`GcH@czs*`RHJJGbhD#ziI z)PJJITdwd(__3zOs<{JI8c&!*vb1*KUuRPPZs4+2GPOr7G;a1L5&{{ayCk=(1 zx_vOvWamNq_2Uoz^QLdrFwNyzS5oxy0yIn~bM<56L*I+zC* zID6|UIPNt~f0;3l_$1CPI5*g5Uhtu$%rEBG0(vk1vOCRB^YCZp(1a<5(p1S|oB0EB zy$(d5OV_y=%T3q1+kewvg9k6qTF&NAs=a+VKu>>>)$Wf4Ss~J6zuZZB$GI2p{P5jq z!s2f04wnV1?wf8>tG2Z9>$#7OUIo#a*%RY?t^FW7G^+UJ@RT;YdcRZaha2yTbbpi; z(d)vdNqLt|2PQ}-eft>b@w)Y_`Iu7EKO6pjHs*4w)hOL!huCko2Em`Lb5lm1Z0tSv zWwh_)ZBA(=CvF;z|2xmlp!wy%4H?ZlUR+(D)e*IEz=^ha@9M)v_x68X@Wib#uVLOZ zhf9^m&o0f3*4w?z`;UEHT?UQ0vh?Yv6}~HHy&OGr(biFov!=xixw>L!pLH#bBU)F3I=p2lxXp1ggGUGONQ=CiwVR{rsBz$5$1ZC0aG&*^SxYLINO z-2T3e8*R}rO|p6Wx}_{5k))rBuC19Wa59OpL?Z7%TnFl99nQ$Y89j+A%XS%RDH#%b zSnKg?gWfWU1va_CaW^piS&4{N9}kzkYk-)1#N{1I;?lbB zCLyN|nXhqwVkwjK#U|m13rBsePcyR9jH$w;EB119;Glc69cre?B>l0;ByLi7>jRAJ z0HdWakYR%$2YsiYcCVQ-i2*ifV7LaRpLIDSD`(6VCTiFuV6olNt6KsW$Rq=?Ni@er za~f7QG8;{aDj@ZtmdJ{8PGXXrR=shSNsO>b2*ZUime$u8*)_&i;YEtQEc%xFOUB{M z73vZbY%)@Hq^5Nf>fVF|i7H;pZ3jvE#E$y?p?tTuOfmo)+~T-fxJ|rSnKx;ZRev8? zJNCksK$)ZuHo416?y}viTbS-GjDbXzV>E0ANrrVCTb*W}6fTqWQ+Q#xTeu`Sj4Vf4 z5>;H1rZd8*RmYRE)g`9bWQ6JnUF)x?`&WdUURjdViVFP)|9mTvNer>ULxy|E7+V)H zvLa@nqBbhn$G++D$!Q(dmFf~RY~rZusP*6f@bk)_+wv8grMUZ#UJl9KZnsi`Wb!;D z$h@m;|_E&uy7 z$VY{d$-@}kFx>e+e=_-PM)x*hhPXubmc6`JFLkEb~i_(YmhfKQ?M z3Gh#7E(N}n=C`2v7A(p8KLG!M*6V<;qqz({~;yYE(HL&m*37<(n1#BwyvE9|H8;iS~?U%<|iLPYw zV%EBt9Yy#ZYx0gAB66SRQ*U2BTu=d{E=z(ce4%ov9G+BH=D6!^EP1kKY`f zHL-9LjBbLp=<2xh%vY6m(%x7oKtciOX)*BNL8Od2;uG?5h2H*7`HCl!kdQ>)vBc># z6gV4=1c}MX)a)N3mAjWc`h$x^a>dx!gty3 zcUf&RxbCxXpOuLWxMTS|wztTNj@2q=4MYaahQ+K2;diX&J64x)EvsJ3_8?rxs@KuH zANc*y=^x|=fImQU6!1|rKL-9W&H2FR)9laj{v72mkW&fd)XDpUIF%rpLphaD!ZIB6 zjib3i;zF=wPIaMOyQ3Z+;l7NnFJml*CYk&@n0^Oq(XmYK%^7=hgGJ7nZ=o4EpV#jq zlkW$u{eVNX@+ZSJ)H*4ia+6 zXbwrpxxM&=qz@L7k&sLTA*I97xNV>T4uOZk;xIUhWyXeJkxV%En)(8xrd@rphcYlK zBePUou<_JVuGV7Z;+n2-%7GMW4+@JFE^aUBSJAk8tr$IyHY_-i!Z1pX$?slcbw zTnv0M&1Jxs(fkqkk2KcEc#FR zp$g#|7+r(TAld(}-LylwQ3|0B33Vjwnv7Gu;-$XU3=4srP9WF03W|#y?%CrAjw1tc zPbB@hWfBXsrz9z{dr6oT_K?qN=95(~wZ;FL+g&sm3-^$4kCgJW$*pQTByg6;R&Be39! z)I3o?u~XB^Y8FhD_Z)+TRxoNM3%RG;+BC=Ue~iU~52Nctg4UJ+PkddPBNakC65`3r zJzdnn@?lc;OThup@3f?%n-hydOI2A(KaeaTLvu!T2#@N294NBPMs7 zfIWI3YY#MD>|M9=)YB0o9VTI+0SOJHo`?2J6B{IclhhPpi9ZaTYl=)B0DJ(=(ZEO3 z90zGR;N67t#C-_-8a%f@USXfvN_+n$~N9uO)n1+e~Xi?9IuzMg@#z z0W(sps@PFDOe&5e;-8ml&e&?SI%+DmKMF=i$yVlKx<*a@PmXF2Q3hfQ#p(N*?ys)&M2uAC}_l~aYVa;gwkP8Gt+sX|yeRYVr2 z9F8<=Rn{7dHI@E6R*7a;-}uD11$xisWb)N2t2M+w%j9hgv@ue`?F_Wj+`&Kx%^oax zu$}hu@ptpz?hc!c+v6eS)Y$?xAeSg1roC27I$ZtP@MCoSNObskQ)8oS>`{e~1y)%wMy!Rn z8N%aOc_bF!>2)?Jv-M84;)!;~pq)gy+wHj((ELlzRUNEBR?qyP3wH_qk1BcIg~7%4V@3?KQdPSAV> ztgg@;4_5IsCxTTX%_(4&Lh}=_dO~w4Se4TJ7Hr%gjx<~FcuquGP+;2$=orK4P% z)?>j9+( zh@m+SK^)ET2;ynJf#3$s2?!EsPDGGM^GyUdX--0rMDr~Kw`fjAkW6z5f)tul5v0RO90WNuKS1z+=3E51 zG(SS{h~_*5c{JxE$fvmgK>^K$2nuN~LQq6=F@j>6OAwUM{1m}cnoALs(p-k1jOG^z zUeH{Qpq%Dc2wu@#fuMrsN(7ZOS0SjPxf($=%^whap!p+$k2KdHsG+$QK`qU72=7Su6kTVk_>iOlTGo3v9ZN>3q4_NIXf#%1g;)sq{E8Ve>frJdQa%qk4 z2-#>^r4T-X(MPh|*4<;@r^v8r2Nu$hkVc*eGxPAD(9(M+7V5#Mo;mcL{`U|VN=E)da~tjEW85#6$}*vrq<|2-7cz+J+a`= z8T)hgqF@`^aMIa_c;WE{;d7efzKS!AtphM)y2<18!1AH-qrC4daUn za{uwg&zB;hl$5b`NmcpiB9(oB)4VK%u>$G#a2CR8j$k2z=13MI3GZ1MJR&quz7M~l zj{px2`jUUgq7Jv!piI-;f(*Xi-eWgMZ(JLB4K5A zk+3pbNLZO2B&^I15>{ph2`jUMgq7Jr!piI*VP$rZurfPHSeYFptjrD)R%QnYE3<=y zmDxd&#pr=&g7QX26kbLA@aU2hbOw(aZ?N(v;RN>>Se>Ui8?3SkJHGsU;`NRnA$Sb9 z8oAnvf#7^f{3e@0-9zz)&6@#lMu(&weHiee*_Q!dn*A8?qj@g_duiUsz&@J41OJ_z zWlirTeLod3_dG7oBP2W`mpF;uqssJl#VUkUB&3p2yme>ws~dL?hG8L_6|&jRFi@CR zFzSA-OE_+mY9v&X34u>4jPRA7Nnxyh7@0}0H%84oY3Cb`J>Eyceex3bDwoh3C9^E<$hN@8-QH7-xWQ9T)E#B;|s`@`(3f4L9X2I5?1ba z2`l%zBD3RQf$No#mvGU`kWfbIT)*A=aNLf2mvBtD@Fg@q2mU$D zRiIe~rsVxKz}L`v1Mm$r{{a36%^kpZ5cbT^xRog%n}nODmhDqZhM*$q_o*ZNXZVb3 z>t{?)#Z6O=gmTh`w^uFF)cItUfjt}m;{zm(g;!57&L`|q7STUGH0w6@Z~+My$oy!| z+E|pO-vi@8<^Y=cbAM?AJ9{82N3^eJt!_boY@{xOmTm zV~payRO^uIpM?wDcE-xYrj;&g(z&U8S1pL1^ZWBhX!nU`*> z`-*N9nHRM-Mj+hIsI}AF!Kii6?7^yeu$}fNd%dmy;Tf8%sz}ON1b~Cshxp|uh*TL*M%}HREL~|OLrO{jhW+gN~2eaoi zSHYkvQeJ$o0A@9`-T-C|H2(mzA2fG>SqEV+7Jcr%Rge(v=Fqo6+?qBQA1Z_Kc?TtO6{Aayp^pYU$*o6(7y7ITijFw7>&( zZcr4NXz(QbS#Q8}KV9EK?4b$?Rb*ZbJ~LP|=;2L;Fde3M?sNZlAz5)oELBErf@L|7S#2rDBIVPzyDtc*m2m63?BG7=G1Mk2z>NJLl}i9}93P&jmX z_Lve}-&`c*lExQvPq--$F>r|KFD~fPpC4U_9-bd^HcxRn_6!?_GrHlVUvYObx|xJ) z%Jj@owr3s9 zft*Gl*PG};oJJ7Mp`1o2;UAVS#qnOMjB3YDkDv$IgOE~(VWgm(`n9Nq!~2dW~8@i&Sa#Sgr_+-tPg8{ z)}Ux()}ofR6AP++V>s-c8=G$&1clDPAY_ABovd`-fDV9zQ*iwGZq?=&`6&65;ipIQJzySZ%s@5`3K zKcB$=bbhxYVddNm3NSk$V zhi-|++KjQp72PB)CSl4l(fGfn`(5wz+~+>d?{|LZyyu+vT>ETx@6IC-#NwDuWPn$g zy8wb9YvCs}EX1!L{t+dPAdz`v441&a^(Efyc=+mwoijH{Ox#zECDYYi@Qcdv(rWwc z3>$*6E!f*=@9goVsFr`24q>C{!Km6>KTQ8q9(67B!zZ(e5A|jDuU9f^8%h%{&c$~{ zC>2KkuQY#z3!Yvc6fHTc(ZN*k$@qTELlX*c)jc6}8bFyADP;gF%QG32M;FlE3byKc1=F-D(DUSL` z*e*}%gPfoWM3W=jOxqao(9E)5p%u)%&CbFnhmx=@6$8yT z^mgvnc`ivbc8PE0CcF!hPTD0W(Kl$lMz1JxaV9uu;nTby8fp{m=tn#G*P-9s)tx;% zALk8?#d%-9kW;+Su=&fXwAtJ2X;uf@u6brNb-%>`PB2S~>57LD6AOo@SkkQ_k%&WL z0egk0oVOjT)fjw=pnKRdk*DE4VO^6~P$~+aTyz zYyXLLag>u1C*)uLPhbE0O9e>+k%E+J46DXuXt5L`mZG>!K_De%{)efXE)^RHL=sZi z7{KWeNsWGBq@t_Zf}b5C~kl zvR0Ut7%degQqlFx1Yti(f$+k-u-s z=+KFZBarowz``&Vyl@kPt8L&`JzJ4&?_?PK~k!fH2J;_oqRD z{|?z;AVjv62OJMIlPi?lD-8M10R9Z9^6W?qvbA#};4&2gZ2)frn@C`&r@6#3-eesF z=r~=0G?ViIBk-nzha8Hy`@}`{izMVn;1T?c+~~OiU4xZU0tCFR;AbF8mVtnM5S#&` zWP=D;(eLKaP5ffhm=p~rMem~P_RO-dOU{Y^qq4JpPEmyVodEA#Nt7H%m=SLXc^Oss z82s`4T+2r2(GBo!phDi^YSC=fkJ^bE5U|3n_^FaZ3x#;2%5#YAtE&;~E8GJ4{Q&O= zTBOkCoNYU5=pMQdr~`N%fDQU~j5pZMnOKYNfR}AtwDUZs2TCqAU!&SX zj~;;c07FuWd~ zY$gPFuZ#y&Yu!ZJ>Dj(eC=!q4m;7L`m+NWgwh(9@0Qdl~AS2A))geZXZis+@Gw#fv zzIoH_l-PzdXP}vZGx+9h7lcZ}tLLMjxfkHQE3+|fXk(t%6BZ4D7J#<^O;VqH^)ON1 zTjwE{&zb#l=k#xJ(4z$4B|w(+NHRHJ#;w**gg_&}8v)!F-_FNPQkvWM?l}(uC)|mj z6WI+IfwwAn{5SR9_|O&VWylZ21No(33_mj%#DC6(<{&(XZ+@H+sV$d#;3_n80L}rH zWY{|ufvY{7PhW?C4Q|8dho5=-qWbaqLTKg!oV(Ivaznv;*G8vHGw~sJc58NZp#ntn6pz1_Z)r#&Ea@B-%LJu z7?`*3cmbxwHHqoUrEbXg!F~9{MXo`}=Pf@T|4Lxi)FwlM1NnZqAD;3>9;>PK(WJG2m(W?sQv0 z>+AcquOwI5xv3c@m@=BTweGFmeAnwPbBPLzpwRrui8h}WPCuf5ZfE#al}53d>c!nV zE|~c~zNhz{U+c|n_WLH+PajoM*YmWxzTN+OfAyY9XTv+a?e)uV-8?jj;faHA(<~0B zw*ptzq;afUC-F*YCO3mDXX0H69pw#o)-pHE7Cg6i-5wvswPDli9!^S~b=hW4ty<_z zf%bi{&ntyA#V#&AJg&z30eI*~eZlJyy1z3)x=s zX#SM%b9MF>bnW9S&7GU!C-h@|$=YAMVe4cH7>X-%lYoKDP?VZhEDoe^3k5RDi~T#s z$fcsip#=(m2q;R;Nd&Qqi;|1i17m}MA0iGSxe!c{5m3MmV=yo%BA9##CO3j9hG4QH zn1TqV0)h!j7f>JsV=ypCBbXuxCNMd{fCP-ez#xZU$|INvzcNT6M3oRsP6U$;!4yR> zfe91_WMB*i21x`{7Qy62FhQXS1spI21A{VxDS%)y!I?}dUWX-8ja-Gy-U)R^K+^v1;G+yM9!DNxmR&6Q86g{WxVfdYftSJ*%fkXRzgX* zw{W&|Son+IN&8eeet!-5~SG!K-uJXAp5Bl6U-TYSDz3~;k_X1l-|$z}50~<{ z@qpq=$eh)j6HEYQAfPBUtymn$gsEfXLYL1;1gR`8N-kCg(#%4UMnbVa6kk1L5)@z% j07*fBAdJDlker*61Crt6<7Hy!U}a-r=H}w$VdMt@LL%(N literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/CPU2_RAM/.clangd/compile_commands.json b/gpio_bitfield_cpu2/CPU2_RAM/.clangd/compile_commands.json new file mode 100644 index 0000000..41fff5e --- /dev/null +++ b/gpio_bitfield_cpu2/CPU2_RAM/.clangd/compile_commands.json @@ -0,0 +1,17 @@ +[ + { + "directory" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/CPU2_RAM", + "command" : "clang++ -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2\" -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/device\" -I\"/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/\" -I\"/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1", + "file" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/device/F2837xD_CodeStartBranch.asm" + }, + { + "directory" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/CPU2_RAM", + "command" : "clang++ -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2\" -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/device\" -I\"/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/\" -I\"/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -xc", + "file" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/device/device.c" + }, + { + "directory" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/CPU2_RAM", + "command" : "clang++ -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2\" -I\"/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/device\" -I\"/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/\" -I\"/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include\" -DDEBUG -DCPU1 -xc", + "file" : "/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_bitfield_cpu2/gpio_bitfield_cpu2.c" + } +] diff --git a/gpio_bitfield_cpu2/device/F2837xD_CodeStartBranch.asm b/gpio_bitfield_cpu2/device/F2837xD_CodeStartBranch.asm new file mode 100644 index 0000000..1fdab30 --- /dev/null +++ b/gpio_bitfield_cpu2/device/F2837xD_CodeStartBranch.asm @@ -0,0 +1,112 @@ +;//########################################################################### +;// +;// FILE: F2837xD_CodeStartBranch.asm +;// +;// TITLE: Branch for redirecting code execution after boot. +;// +;// For these examples, code_start is the first code that is executed after +;// exiting the boot ROM code. +;// +;// The codestart section in the linker cmd file is used to physically place +;// this code at the correct memory location. This section should be placed +;// at the location the BOOT ROM will re-direct the code to. For example, +;// for boot to FLASH this code will be located at 0x3f7ff6. +;// +;// In addition, the example F2837xD projects are setup such that the codegen +;// entry point is also set to the code_start label. This is done by linker +;// option -e in the project build options. When the debugger loads the code, +;// it will automatically set the PC to the "entry point" address indicated by +;// the -e linker option. In this case the debugger is simply assigning the PC, +;// it is not the same as a full reset of the device. +;// +;// The compiler may warn that the entry point for the project is other then +;// _c_init00. _c_init00 is the C environment setup and is run before +;// main() is entered. The code_start code will re-direct the execution +;// to _c_init00 and thus there is no worry and this warning can be ignored. +;// +;//########################################################################### +;// +;// $Release Date: $ +;// $Copyright: +;// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +;// +;// Redistribution and use in source and binary forms, with or without +;// modification, are permitted provided that the following conditions +;// are met: +;// +;// Redistributions of source code must retain the above copyright +;// notice, this list of conditions and the following disclaimer. +;// +;// Redistributions in binary form must reproduce the above copyright +;// notice, this list of conditions and the following disclaimer in the +;// documentation and/or other materials provided with the +;// distribution. +;// +;// Neither the name of Texas Instruments Incorporated nor the names of +;// its contributors may be used to endorse or promote products derived +;// from this software without specific prior written permission. +;// +;// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +;// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +;// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +;// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +;// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +;// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +;// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +;// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +;// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +;// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;// $ +;//########################################################################### + +*********************************************************************** + +WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0 + + .ref _c_int00 + .global code_start + +*********************************************************************** +* Function: codestart section +* +* Description: Branch to code starting point +*********************************************************************** + + .sect "codestart" + .retain + +code_start: + .if WD_DISABLE == 1 + LB wd_disable ;Branch to watchdog disable code + .else + LB _c_int00 ;Branch to start of boot._asm in RTS library + .endif + +;end codestart section + +*********************************************************************** +* Function: wd_disable +* +* Description: Disables the watchdog timer +*********************************************************************** + .if WD_DISABLE == 1 + + .text +wd_disable: + SETC OBJMODE ;Set OBJMODE for 28x object code + EALLOW ;Enable EALLOW protected register access + MOVZ DP, #7029h>>6 ;Set data page for WDCR register + MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD + EDIS ;Disable EALLOW protected register access + LB _c_int00 ;Branch to start of boot._asm in RTS library + + .endif + +;end wd_disable + + .end + +;// +;// End of file. +;// diff --git a/gpio_bitfield_cpu2/device/device.c b/gpio_bitfield_cpu2/device/device.c new file mode 100644 index 0000000..b64b33d --- /dev/null +++ b/gpio_bitfield_cpu2/device/device.c @@ -0,0 +1,706 @@ +//############################################################################# +// +// FILE: device.c +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +// +// Included Files +// +#include "device.h" +#include "driverlib.h" +#include "inc/hw_ipc.h" + +#ifdef CMDTOOL +#include "device_cmd.h" +#endif + +#ifdef __cplusplus +using std::memcpy; +#endif + +#define PASS 0 +#define FAIL 1 + +uint32_t Example_Result = FAIL; +uint32_t Example_PassCount = 0; +uint32_t Example_Fail = 0; + +//***************************************************************************** +// +// Function to initialize the device. Primarily initializes system control to a +// known state by disabling the watchdog, setting up the SYSCLKOUT frequency, +// and enabling the clocks to the peripherals. +// +//***************************************************************************** +void Device_init(void) +{ + // + // Disable the watchdog + // + SysCtl_disableWatchdog(); + +#ifdef CMDTOOL + CMD_init(); +#endif + +#ifdef _FLASH +#ifndef CMDTOOL + // + // Copy time critical code and flash setup code to RAM. This includes the + // following functions: InitFlash(); + // + // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols + // are created by the linker. Refer to the device .cmd file. + // + memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize); +#endif + + // + // Call Flash Initialization to setup flash waitstates. This function must + // reside in RAM. + // + Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES); +#endif +#ifdef CPU1 + + // + // Configure Analog Trim in case of untrimmed or TMX sample + // + if((SysCtl_getDeviceParametric(SYSCTL_DEVICE_QUAL) == 0x0U) && + (HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMA) == 0x0U)) + { + Device_configureTMXAnalogTrim(); + } + + // + // Set up PLL control and clock dividers + // + SysCtl_setClock(DEVICE_SETCLOCK_CFG); + + // + // Make sure the LSPCLK divider is set to the default (divide by 4) + // + SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4); + + // + // These asserts will check that the #defines for the clock rates in + // device.h match the actual rates that have been configured. If they do + // not match, check that the calculations of DEVICE_SYSCLK_FREQ and + // DEVICE_LSPCLK_FREQ are accurate. Some examples will not perform as + // expected if these are not correct. + // + ASSERT(SysCtl_getClock(DEVICE_OSCSRC_FREQ) == DEVICE_SYSCLK_FREQ); + ASSERT(SysCtl_getLowSpeedClock(DEVICE_OSCSRC_FREQ) == DEVICE_LSPCLK_FREQ); + +#ifndef _FLASH + // + // Call Device_cal function when run using debugger + // This function is called as part of the Boot code. The function is called + // in the Device_init function since during debug time resets, the boot code + // will not be executed and the gel script will reinitialize all the + // registers and the calibrated values will be lost. + // Sysctl_deviceCal is a wrapper function for Device_Cal + // + SysCtl_deviceCal(); +#endif + +#endif + // + // Turn on all peripherals + // + Device_enableAllPeripherals(); + + // + // Initialize result parameter as FAIL + // + Example_Result = FAIL; +} + +//***************************************************************************** +// +// Function to turn on all peripherals, enabling reads and writes to the +// peripherals' registers. +// +// Note that to reduce power, unused peripherals should be disabled. +// +//***************************************************************************** +void Device_enableAllPeripherals(void) +{ + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2); +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM); +#endif + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); + +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF2); +#endif + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM8); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM9); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM10); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM11); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM12); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP6); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP3); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD2); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCID); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIC); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANB); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPB); + +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_USBA); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_UPPA); +#endif + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS6); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS7); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS8); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACC); +} + +//***************************************************************************** +// +// Function to disable pin locks on GPIOs. +// +//***************************************************************************** +void Device_initGPIO(void) +{ + // + // Disable pin locks. + // + GPIO_unlockPortConfig(GPIO_PORT_A, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_B, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_D, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_E, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_F, 0xFFFFFFFF); + + // + // Enable GPIO Pullups + // + Device_enableUnbondedGPIOPullups(); +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 176PTP package: +// GPIOs Grp Bits +// 95-132 C 31 +// D 31:0 +// E 4:0 +// 134-168 E 31:6 +// F 8:0 +// +//***************************************************************************** + +void Device_enableUnbondedGPIOPullupsFor176Pin(void) +{ + EALLOW; + HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0x80000000U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFDFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU; + EDIS; +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 100PZ package: +// GPIOs Grp Bits +// 0-1 A 1:0 +// 5-9 A 9:5 +// 22-40 A 31:22 +// B 8:0 +// 44-57 B 25:12 +// 67-68 C 4:3 +// 74-77 C 13:10 +// 79-83 C 19:15 +// 93-168 C 31:29 +// D 31:0 +// E 31:0 +// F 8:0 +// +//***************************************************************************** +void Device_enableUnbondedGPIOPullupsFor100Pin(void) +{ + EALLOW; + HWREG(GPIOCTRL_BASE + GPIO_O_GPAPUD) = ~0xFFC003E3U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPBPUD) = ~0x03FFF1FFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0xE10FBC18U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFFFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU; + EDIS; +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 100PZ or +// 176PTP package. +// +//***************************************************************************** +void Device_enableUnbondedGPIOPullups(void) +{ + // + // bits 8-10 have pin count + // + uint16_t pinCount = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + (uint32_t)SYSCTL_PARTIDL_PIN_COUNT_M) >> + SYSCTL_PARTIDL_PIN_COUNT_S); + + /* + * 5 = 100 pin + * 6 = 176 pin + * 7 = 337 pin + */ + if(pinCount == 5) + { + Device_enableUnbondedGPIOPullupsFor100Pin(); + } + else if(pinCount == 6) + { + Device_enableUnbondedGPIOPullupsFor176Pin(); + } + else + { + // + // Do nothing - this is 337 pin package + // + } +} + +#ifdef CPU1 +//***************************************************************************** +// +// Function to implement Analog trim of TMX devices +// +//***************************************************************************** +void Device_configureTMXAnalogTrim(void) +{ + // + // Enable ADC clock + // + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD); + + // + // Configure ADC reference trim for TMX devices + // + EALLOW; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMA) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMB) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMC) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMD) = 0x7BDDU; + + // + // Configure ADC offset trim. The user should generate the trim values + // by following the instructions in the "ADC Zero Offset Calibration" + // section in device TRM. The below lines needs to be uncommented and + // updated with the correct trim values. + // +// HWREGH(ADCA_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCB_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCC_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCD_BASE + ADC_O_OFFTRIM) = 0x0U; + + // + // Configure internal oscillator trim. If the internal oscillator trim + // contains all zeros, the user can adjust the lowest 10 bits of the + // oscillator trim register between 1 (minimum) and 1023 (maximum) + // while observing the system clock on the XCLOCKOUT pin. The below + // lines needs to be uncommented and updated with the correct trim values. + // +// if(HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC1TRIM) == 0x0U) +// { +// HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC1TRIM) = 0x0U; +// } +// if( HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC2TRIM) = 0x0U) +// { +// HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC2TRIM) = 0x0U; +// } + + EDIS; + + // + // Disable ADC clock + // + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCD); +} + +//***************************************************************************** +//! Executes a CPU02 control system bootloader. +//! +//! \param bootMode specifies which CPU02 control system boot mode to execute. +//! +//! This function will allow the CPU01 master system to boot the CPU02 control +//! system via the following modes: Boot to RAM, Boot to Flash, Boot via SPI, +//! SCI, I2C, or parallel I/O. This function blocks and waits until the +//! control system boot ROM is configured and ready to receive CPU01 to CPU02 +//! IPC INT0 interrupts. It then blocks and waits until IPC INT0 and +//! IPC FLAG31 are available in the CPU02 boot ROM prior to sending the +//! command to execute the selected bootloader. +//! +//! The \e bootMode parameter accepts one of the following values: +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SCI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SPI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_I2C +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_CAN +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_RAM +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH +//! +//! \return 0 (success) if command is sent, or 1 (failure) if boot mode is +//! invalid and command was not sent. +// +//***************************************************************************** +uint16_t +Device_bootCPU2(uint32_t bootMode) +{ + uint32_t bootStatus; + uint16_t pin; + uint16_t returnStatus = STATUS_PASS; + + // + // If CPU2 has already booted, return a fail to let the application + // know that something is out of the ordinary. + // + bootStatus = HWREG(IPC_BASE + IPC_O_BOOTSTS) & 0x0000000FU; + + if(bootStatus == C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK) + { + // + // Check if MSB is set as well + // + bootStatus = ((uint32_t)(HWREG(IPC_BASE + IPC_O_BOOTSTS) & + 0x80000000U)) >> 31U; + + if(bootStatus != 0) + { + returnStatus = STATUS_FAIL; + + return returnStatus; + } + } + + // + // Wait until CPU02 control system boot ROM is ready to receive + // CPU01 to CPU02 INT1 interrupts. + // + do + { + bootStatus = HWREG(IPC_BASE + IPC_O_BOOTSTS) & + C2_BOOTROM_BOOTSTS_SYSTEM_READY; + } while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY)); + + // + // Loop until CPU02 control system IPC flags 1 and 32 are available + // + while (((HWREG(IPC_BASE + IPC_O_FLG) & IPC_FLG_IPC0) != 0U) || + ((HWREG(IPC_BASE + IPC_O_FLG) & IPC_FLG_IPC31) != 0U)) + { + + } + + if (bootMode >= C1C2_BROM_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE) + { + returnStatus = STATUS_FAIL; + } + else + { + // + // Based on boot mode, enable pull-ups on peripheral pins and + // give GPIO pin control to CPU02 control system. + // + switch (bootMode) + { + case C1C2_BROM_BOOTMODE_BOOT_FROM_SCI: + + // + //SCIA connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL5_SCI, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU02 bootrom to take control of clock + //configuration registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = 0x0002U; + EDIS; + + GPIO_setDirectionMode(29, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(29, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_29_SCITXDA); + GPIO_setMasterCore(29, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(28, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(28, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_28_SCIRXDA); + GPIO_setMasterCore(28, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_SPI: + + // + //SPI-A connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL6_SPI, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU02 bootrom to take control of clock configuration + // registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + EDIS; + + GPIO_setDirectionMode(16, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_16_SPISIMOA); + GPIO_setMasterCore(16, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_17_SPISOMIA); + GPIO_setMasterCore(17, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(18, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_18_SPICLKA); + GPIO_setMasterCore(18, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(19, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_19_GPIO19); + GPIO_setMasterCore(19, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_I2C: + + // + //I2CA connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL7_I2C, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU2 bootrom to take control of clock + //configuration registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = 0x0002U; + EDIS; + + GPIO_setDirectionMode(32, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(32, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_32_SDAA); + GPIO_setMasterCore(32, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(33, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(33, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_33_SCLA); + GPIO_setMasterCore(33, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL: + + for(pin=58;pin<=65;pin++) + { + GPIO_setDirectionMode(pin, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC); + GPIO_setMasterCore(pin, GPIO_CORE_CPU2); + } + + GPIO_setDirectionMode(69, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(69, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_69_GPIO69); + GPIO_setMasterCore(69, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(70, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(70, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_70_GPIO70); + GPIO_setMasterCore(70, GPIO_CORE_CPU2); + + break; + + + case C1C2_BROM_BOOTMODE_BOOT_FROM_CAN: + // + //Set up the GPIO mux to bring out CANATX on GPIO71 + //and CANARX on GPIO70 + // + GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFFU); + + GPIO_setMasterCore(71, GPIO_CORE_CPU2); + GPIO_setPinConfig(GPIO_71_CANTXA); + GPIO_setQualificationMode(71, GPIO_QUAL_ASYNC); + + GPIO_setMasterCore(70, GPIO_CORE_CPU2); + GPIO_setPinConfig(GPIO_70_CANRXA); + GPIO_setQualificationMode(70, GPIO_QUAL_ASYNC); + + + GPIO_lockPortConfig(GPIO_PORT_C, 0xFFFFFFFFU); + + // + // Set CANA Bit-Clock Source Select = SYSCLK and enable CAN + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &= + SYSCTL_CLKSRCCTL2_CANABCLKSEL_M; + EDIS; + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA); + + break; + + } + + // + //CPU01 to CPU02 IPC Boot Mode Register + // + HWREG(IPC_BASE + IPC_O_BOOTMODE) = bootMode; + + // + // CPU01 To CPU02 IPC Command Register + // + HWREG(IPC_BASE + IPC_O_SENDCOM) = BROM_IPC_EXECUTE_BOOTMODE_CMD; + + // + // CPU01 to CPU02 IPC flag register + // + HWREG(IPC_BASE + IPC_O_SET) = 0x80000001U; + + } + return returnStatus; +} +#endif // #ifdef CPU1 +//***************************************************************************** +// +// Error handling function to be called when an ASSERT is violated +// +//***************************************************************************** +void __error__(const char *filename, uint32_t line) +{ + // + // An ASSERT condition was evaluated as false. You can use the filename and + // line parameters to determine what went wrong. + // + ESTOP0; +} + +void Example_setResultPass(void) +{ + Example_Result = PASS; +} + +void Example_setResultFail(void) +{ + Example_Result = FAIL; +} + +void Example_done(void) +{ + while(1); +} diff --git a/gpio_bitfield_cpu2/device/device.h b/gpio_bitfield_cpu2/device/device.h new file mode 100644 index 0000000..ec143e5 --- /dev/null +++ b/gpio_bitfield_cpu2/device/device.h @@ -0,0 +1,394 @@ +//############################################################################# +// +// FILE: device.h +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +// +// Included Files +// +#include "driverlib.h" + +#if (!defined(CPU1) && !defined(CPU2)) +#error "You must define CPU1 or CPU2 in your project properties. Otherwise, \ +the offsets in your header files will be inaccurate." +#endif + +#if (defined(CPU1) && defined(CPU2)) +#error "You have defined both CPU1 and CPU2 in your project properties. Only \ +a single CPU should be defined." +#endif + +//***************************************************************************** +// +// Defines for pin numbers and other GPIO configuration +// +//***************************************************************************** +// +// LEDs +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_PIN_LED1 31U // GPIO number for LD10 +#define DEVICE_GPIO_PIN_LED2 34U // GPIO number for LD9 +#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 // "pinConfig" for LD10 +#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 // "pinConfig" for LD9 +#else +#define DEVICE_GPIO_PIN_LED1 31U // GPIO number for LD2 +#define DEVICE_GPIO_PIN_LED2 34U // GPIO number for LD3 +#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 // "pinConfig" for LD2 +#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 // "pinConfig" for LD3 +#endif + + +// +// SCI for USB-to-UART adapter on FTDI chip +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_PIN_SCIRXDA 43U // GPIO number for SCI RX +#define DEVICE_GPIO_PIN_SCITXDA 42U // GPIO number for SCI TX +#define DEVICE_GPIO_CFG_SCIRXDA GPIO_43_SCIRXDA // "pinConfig" for SCI RX +#define DEVICE_GPIO_CFG_SCITXDA GPIO_42_SCITXDA // "pinConfig" for SCI TX +#else +#define DEVICE_GPIO_PIN_SCIRXDA 28U // GPIO number for SCI RX +#define DEVICE_GPIO_PIN_SCITXDA 29U // GPIO number for SCI TX +#define DEVICE_GPIO_CFG_SCIRXDA GPIO_28_SCIRXDA // "pinConfig" for SCI RX +#define DEVICE_GPIO_CFG_SCITXDA GPIO_29_SCITXDA // "pinConfig" for SCI TX +#endif + +// +// GPIO assignment for CAN-A and CAN-B +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_CFG_CANRXA GPIO_36_CANRXA // "pinConfig" for CANA RX +#define DEVICE_GPIO_CFG_CANTXA GPIO_37_CANTXA // "pinConfig" for CANA TX +#define DEVICE_GPIO_CFG_CANRXB GPIO_17_CANRXB // "pinConfig" for CANB RX +#define DEVICE_GPIO_CFG_CANTXB GPIO_12_CANTXB // "pinConfig" for CANB TX +#else +#define DEVICE_GPIO_CFG_CANRXA GPIO_30_CANRXA // "pinConfig" for CANA RX +#define DEVICE_GPIO_CFG_CANTXA GPIO_31_CANTXA // "pinConfig" for CANA TX +#define DEVICE_GPIO_CFG_CANRXB GPIO_10_CANRXB // "pinConfig" for CANB RX +#define DEVICE_GPIO_CFG_CANTXB GPIO_8_CANTXB // "pinConfig" for CANB TX + +//I2CA GPIO pins +#define DEVICE_GPIO_PIN_SDAA 104 +#define DEVICE_GPIO_PIN_SCLA 105 + +#define DEVICE_GPIO_CFG_SDAA GPIO_104_SDAA +#define DEVICE_GPIO_CFG_SCLA GPIO_105_SCLA + + +//I2CB GPIO pins +#define DEVICE_GPIO_PIN_SDAB 40 +#define DEVICE_GPIO_PIN_SCLB 41 + +#define DEVICE_GPIO_CFG_SDAB GPIO_40_SDAB +#define DEVICE_GPIO_CFG_SCLB GPIO_41_SCLB + +#endif + +//***************************************************************************** +// +// Defines related to clock configuration +// +//***************************************************************************** +// +// Launchpad Configuration +// +#ifdef _LAUNCHXL_F28379D + +// +// 10MHz XTAL on LaunchPad. For use with SysCtl_getClock(). +// +#define DEVICE_OSCSRC_FREQ 10000000U + +// +// Define to pass to SysCtl_setClock(). Will configure the clock as follows: +// PLLSYSCLK = 10MHz (XTAL_OSC) * 40 (IMULT) * 1 (FMULT) / 2 (PLLCLK_BY_2) +// +#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(40) | \ + SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) | \ + SYSCTL_PLL_ENABLE) + +// +// 200MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the +// code below if a different clock configuration is used! +// +#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40 * 1) / 2) + +// +// ControlCARD Configuration +// +#else + +// +// 20MHz XTAL on controlCARD. For use with SysCtl_getClock(). +// +#define DEVICE_OSCSRC_FREQ 20000000U + +// +// Define to pass to SysCtl_setClock(). Will configure the clock as follows: +// PLLSYSCLK = 20MHz (XTAL_OSC) * 20 (IMULT) * 1 (FMULT) / 2 (PLLCLK_BY_2) +// +#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(20) | \ + SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) | \ + SYSCTL_PLL_ENABLE) + +// +// 200MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the +// code below if a different clock configuration is used! +// +#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 20 * 1) / 2) + +#endif + +// +// 50MHz LSPCLK frequency based on the above DEVICE_SYSCLK_FREQ and a default +// low speed peripheral clock divider of 4. Update the code below if a +// different LSPCLK divider is used! +// +#define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ / 4) + +//***************************************************************************** +// +// Macro to call SysCtl_delay() to achieve a delay in microseconds. The macro +// will convert the desired delay in microseconds to the count value expected +// by the function. \b x is the number of microseconds to delay. +// +//***************************************************************************** +#define DEVICE_DELAY_US(x) SysCtl_delay(((((long double)(x)) / (1000000.0L / \ + (long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L) + +// +// The macros that can be used as parameter to the function Device_bootCPU2 +// +#define C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL 0x00000000U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_SCI 0x00000001U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_SPI 0x00000004U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_I2C 0x00000005U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_CAN 0x00000007U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_RAM 0x0000000AU +#define C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH 0x0000000BU + +// +// Other macros that are needed for the Device_bootCPU2 function +// +#define BROM_IPC_EXECUTE_BOOTMODE_CMD 0x00000013U +#define C1C2_BROM_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE 0x0000000CU +#define C2_BOOTROM_BOOTSTS_C2TOC1_IGNORE 0x00000000U +#define C2_BOOTROM_BOOTSTS_SYSTEM_START_BOOT 0x00000001U +#define C2_BOOTROM_BOOTSTS_SYSTEM_READY 0x00000002U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK 0x00000003U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_NAK_STATUS_NOT_SUPPORTED 0x00000004U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_NAK_STATUS_BUSY_WITH_BOOT 0x00000005U + +// +// Macros used as return value by the Device_bootCPU2 function +// +#define STATUS_FAIL 0x0001 +#define STATUS_PASS 0x0000 + +//***************************************************************************** +// +// Defines, Globals, and Header Includes related to Flash Support +// +//***************************************************************************** +#ifdef _FLASH +#include + +extern uint16_t RamfuncsLoadStart; +extern uint16_t RamfuncsLoadEnd; +extern uint16_t RamfuncsLoadSize; +extern uint16_t RamfuncsRunStart; +extern uint16_t RamfuncsRunEnd; +extern uint16_t RamfuncsRunSize; + +#define DEVICE_FLASH_WAITSTATES 3 + +#endif + +extern uint32_t Example_PassCount; +extern uint32_t Example_Fail; + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +//***************************************************************************** +// +//! \addtogroup device_api +//! @{ +// +//***************************************************************************** +//***************************************************************************** +// +//! @brief Function to initialize the device. Primarily initializes system control to a +//! known state by disabling the watchdog, setting up the SYSCLKOUT frequency, +//! and enabling the clocks to the peripherals. +//! +//! \param None. +//! \return None. +// +//***************************************************************************** +extern void Device_init(void); +//***************************************************************************** +//! +//! +//! @brief Function to turn on all peripherals, enabling reads and writes to the +//! peripherals' registers. +//! +//! Note that to reduce power, unused peripherals should be disabled. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableAllPeripherals(void); +//***************************************************************************** +//! +//! +//! @brief Function to disable pin locks on GPIOs. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_initGPIO(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the 176PTP package: +//! GPIOs Grp Bits +//! 95-132 C 31 +//! D 31:0 +//! E 4:0 +//! 134-168 E 31:6 +//! F 8:0 +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullupsFor176Pin(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the 100PZ package: +//! GPIOs Grp Bits +//! 0-1 A 1:0 +//! 5-9 A 9:5 +//! 22-40 A 31:22 +//! B 8:0 +//! 44-57 B 25:12 +//! 67-68 C 4:3 +//! 74-77 C 13:10 +//! 79-83 C 19:15 +//! 93-168 C 31:29 +//! D 31:0 +//! E 31:0 +//! F 8:0 +//! @param None +//! @return None +// +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullupsFor100Pin(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the +//! 176PTP package. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullups(void); +#ifdef CPU1 +//***************************************************************************** +//! +//! @brief Function to implement Analog trim of TMX devices +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_configureTMXAnalogTrim(void); +//***************************************************************************** +//! @brief Executes a CPU02 control system bootloader. +//! +//! \param bootMode specifies which CPU02 control system boot mode to execute. +//! +//! This function will allow the CPU01 master system to boot the CPU02 control +//! system via the following modes: Boot to RAM, Boot to Flash, Boot via SPI, +//! SCI, I2C, or parallel I/O. This function blocks and waits until the +//! control system boot ROM is configured and ready to receive CPU01 to CPU02 +//! IPC INT0 interrupts. It then blocks and waits until IPC INT0 and +//! IPC FLAG31 are available in the CPU02 boot ROM prior to sending the +//! command to execute the selected bootloader. +//! +//! The \e bootMode parameter accepts one of the following values: +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SCI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SPI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_I2C +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_CAN +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_RAM +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH +//! +//! \return 0 (success) if command is sent, or 1 (failure) if boot mode is +//! invalid and command was not sent. +// +//***************************************************************************** +extern uint16_t Device_bootCPU2(uint32_t ulBootMode); +#endif +//***************************************************************************** +//! +//! @brief Error handling function to be called when an ASSERT is violated +//! +//! @param *filename File name in which the error has occurred +//! @param line Line number within the file +//! @return None +// +//***************************************************************************** +extern void __error__(const char *filename, uint32_t line); +extern void Example_setResultPass(void); +extern void Example_setResultFail(void); +extern void Example_done(void); + +// +// End of file +// diff --git a/gpio_bitfield_cpu2/device/driverlib.h b/gpio_bitfield_cpu2/device/driverlib.h new file mode 100644 index 0000000..932ace6 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib.h @@ -0,0 +1,87 @@ +//############################################################################# +// +// FILE: driverlib.h +// +// TITLE: C28x Driverlib Header File +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# +#ifndef DRIVERLIB_H +#define DRIVERLIB_H + +#include "inc/hw_memmap.h" + +#include "adc.h" +#include "asysctl.h" +#include "can.h" +#include "cla.h" +#include "clb.h" +#include "cmpss.h" +#include "cpu.h" +#include "cputimer.h" +#include "dac.h" +#include "dcsm.h" +#include "debug.h" +#include "dma.h" +#include "ecap.h" +#include "emif.h" +#include "epwm.h" +#include "eqep.h" +#include "flash.h" +#include "gpio.h" +#include "hrpwm.h" +#include "i2c.h" +#include "interrupt.h" +#include "ipc.h" +#include "mcbsp.h" +#include "memcfg.h" +#include "pin_map.h" +#include "pin_map_legacy.h" +#include "sci.h" +#include "sdfm.h" +#include "spi.h" +#include "sysctl.h" +#include "upp.h" +#include "version.h" +#include "xbar.h" + +#include "driver_inclusive_terminology_mapping.h" + +#endif // end of DRIVERLIB_H definition + +// +// End of file +// diff --git a/gpio_bitfield_cpu2/device/driverlib/adc.c b/gpio_bitfield_cpu2/device/driverlib/adc.c new file mode 100644 index 0000000..9e74809 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/adc.c @@ -0,0 +1,342 @@ +//########################################################################### +// +// FILE: adc.c +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "adc.h" + +//***************************************************************************** +// +// Defines for locations of ADC calibration functions in OTP for use in +// ADC_setMode() ONLY. Not intended for use by application code. +// +//***************************************************************************** +// +// The following functions calibrate the ADC linearity. Use them in the +// ADC_setMode() function only. +// +#define ADC_calADCAINL 0x0703B4U +#define ADC_calADCBINL 0x0703B2U +#define ADC_calADCCINL 0x0703B0U +#define ADC_calADCDINL 0x0703AEU + +// +// This function looks up the ADC offset trim for a given condition. Use this +// in the ADC_setMode() function only. +// +#define ADC_getOffsetTrim 0x0703ACU + +//***************************************************************************** +// +// ADC_setMode +// +//***************************************************************************** +void +ADC_setMode(uint32_t base, ADC_Resolution resolution, + ADC_SignalMode signalMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Check for correct signal mode & resolution. In this device: + // Single ended signal conversions are supported in 12-bit mode only + // Differential signal conversions are supported in 16-bit mode only + // + if(signalMode == ADC_MODE_SINGLE_ENDED) + { + ASSERT(resolution == ADC_RESOLUTION_12BIT); + } + else + { + ASSERT(resolution == ADC_RESOLUTION_16BIT); + } + + + // + // Apply the resolution and signalMode to the specified ADC. + // + EALLOW; + HWREGH(base + ADC_O_CTL2) = (HWREGH(base + ADC_O_CTL2) & + ~(ADC_CTL2_RESOLUTION | ADC_CTL2_SIGNALMODE)) | + ((uint16_t)resolution | (uint16_t)signalMode); + EDIS; + + // + // Apply INL and offset trims + // + ADC_setINLTrim(base); + ADC_setOffsetTrim(base); +} + +//***************************************************************************** +// +// ADC_setINLTrim +// +//***************************************************************************** +void +ADC_setINLTrim(uint32_t base) +{ + ADC_Resolution resolution; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + resolution = (ADC_Resolution) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_RESOLUTION); + + EALLOW; + switch(base) + { + case ADCA_BASE: + if(HWREGH(ADC_calADCAINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCAINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCB_BASE: + if(HWREGH(ADC_calADCBINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCBINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCC_BASE: + if(HWREGH(ADC_calADCCINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCCINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCD_BASE: + if(HWREGH(ADC_calADCDINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCDINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + default: + // + // Invalid base address! Do nothing! + // + break; + } + + // + // Apply linearity trim workaround for 12-bit resolution + // + if(resolution == ADC_RESOLUTION_12BIT) + { + // + // 12-bit linearity trim workaround + // + HWREG(base + ADC_O_INLTRIM1) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM2) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM4) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM5) &= 0xFFFF0000U; + } + EDIS; +} + +//***************************************************************************** +// +// ADC_setOffsetTrim +// +//***************************************************************************** +void +ADC_setOffsetTrim(uint32_t base) +{ + uint16_t offsetIndex = 0U; + uint16_t offsetTrim = 0U; + ADC_Resolution resolution; + ADC_SignalMode signalMode; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + resolution = (ADC_Resolution) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_RESOLUTION); + signalMode = (ADC_SignalMode) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_SIGNALMODE); + + switch(base) + { + case ADCA_BASE: + offsetIndex = (uint16_t)(0U * 4U); + break; + case ADCB_BASE: + offsetIndex = (uint16_t)(1U * 4U); + break; + case ADCC_BASE: + offsetIndex = (uint16_t)(2U * 4U); + break; + case ADCD_BASE: + offsetIndex = (uint16_t)(3U * 4U); + break; + default: + // + // Invalid base address! + // + offsetIndex = 0U; + break; + } + + // + // Offset trim function is programmed into OTP, so call it + // + if(HWREGH(ADC_getOffsetTrim) != 0xFFFFU) + { + // + // Calculate the index into OTP table of offset trims and call + // function to return the correct offset trim + // + offsetIndex += ((signalMode == ADC_MODE_DIFFERENTIAL) ? 1U : 0U) + + (2U * ((resolution == ADC_RESOLUTION_16BIT) ? 1U : 0U)); + + offsetTrim = + (*((uint16_t (*)(uint16_t index))ADC_getOffsetTrim))(offsetIndex); + } + else + { + // + // Offset trim function is not populated, so set offset trim to 0 + // + offsetTrim = 0U; + } + + // + // Apply the offset trim. Offset Trim is not updated here in case of TMX or + // untrimmed devices. The default trims for TMX devices should be handled in + // Device_init(). Refer to Device_init() and Device_configureTMXAnalogTrim() + // APIs for more details. + // + if(offsetTrim > 0x0U) + { + EALLOW; + HWREGH(base + ADC_O_OFFTRIM) = offsetTrim; + EDIS; + } +} + + +//***************************************************************************** +// +// ADC_setPPBTripLimits +// +//***************************************************************************** +void +ADC_setPPBTripLimits(uint32_t base, ADC_PPBNumber ppbNumber, + int32_t tripHiLimit, int32_t tripLoLimit) +{ + uint32_t ppbHiOffset; + uint32_t ppbLoOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((tripHiLimit <= 65535) && (tripHiLimit >= -65536)); + ASSERT((tripLoLimit <= 65535) && (tripLoLimit >= -65536)); + + // + // Get the offset to the appropriate trip limit registers. + // + ppbHiOffset = (ADC_PPBxTRIPHI_STEP * (uint32_t)ppbNumber) + + ADC_O_PPB1TRIPHI; + ppbLoOffset = (ADC_PPBxTRIPLO_STEP * (uint32_t)ppbNumber) + + ADC_O_PPB1TRIPLO; + + EALLOW; + + // + // Set the trip high limit. + // + HWREG(base + ppbHiOffset) = + (HWREG(base + ppbHiOffset) & ~ADC_PPBTRIP_MASK) | + ((uint32_t)tripHiLimit & ADC_PPBTRIP_MASK); + + // + // Set the trip low limit. + // + HWREG(base + ppbLoOffset) = + (HWREG(base + ppbLoOffset) & ~ADC_PPBTRIP_MASK) | + ((uint32_t)tripLoLimit & ADC_PPBTRIP_MASK); + + EDIS; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/adc.h b/gpio_bitfield_cpu2/device/driverlib/adc.h new file mode 100644 index 0000000..136638d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/adc.h @@ -0,0 +1,2098 @@ +//########################################################################### +// +// FILE: adc.h +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef ADC_H +#define ADC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup adc_api ADC +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_adc.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define ADC_NUM_INTERRUPTS 4U + +#define ADC_SOCxCTL_OFFSET_BASE ADC_O_SOC0CTL +#define ADC_RESULTx_OFFSET_BASE ADC_O_RESULT0 +#define ADC_INTSELxNy_OFFSET_BASE ADC_O_INTSEL1N2 +#define ADC_PPBxRESULT_OFFSET_BASE ADC_O_PPB1RESULT + + +#define ADC_PPBxCONFIG_STEP (ADC_O_PPB2CONFIG - ADC_O_PPB1CONFIG) +#define ADC_PPBxTRIPHI_STEP (ADC_O_PPB2TRIPHI - ADC_O_PPB1TRIPHI) +#define ADC_PPBxTRIPLO_STEP (ADC_O_PPB2TRIPLO - ADC_O_PPB1TRIPLO) +#define ADC_PPBxOFFCAL_STEP (ADC_O_PPB2OFFCAL - ADC_O_PPB1OFFCAL) +#define ADC_PPBxOFFREF_STEP (ADC_O_PPB2OFFREF - ADC_O_PPB1OFFREF) +#define ADC_PPBxSTAMP_STEP (ADC_O_PPB2STAMP - ADC_O_PPB1STAMP) + +#define ADC_PPBTRIP_MASK ((uint32_t)ADC_PPB1TRIPHI_LIMITHI_M |\ + (uint32_t)ADC_PPB1TRIPHI_HSIGN) +// +// Slope of the temperature sensor based in degrees C in fixed point Q15 format +// +#define ADC_getTempSlope() (*(int16_t (*)(void))0x7036E)() + +// +// Offset of the temp sensor output at 0 degrees C +// +#define ADC_getTempOffset() (*(int16_t (*)(void))0x70372)() + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to ADC_enablePPBEvent(), ADC_disablePPBEvent(), +// ADC_enablePPBEventInterrupt(), ADC_disablePPBEventInterrupt(), and +// ADC_clearPPBEventStatus() as the intFlags and evtFlags parameters. They also +// make up the enumerated bit field returned by ADC_getPPBEventStatus(). +// +//***************************************************************************** +#define ADC_EVT_TRIPHI 0x0001U //!< Trip High Event +#define ADC_EVT_TRIPLO 0x0002U //!< Trip Low Event +#define ADC_EVT_ZERO 0x0004U //!< Zero Crossing Event +#endif + +//***************************************************************************** +// +// Values that can be passed to ADC_forceMultipleSOC() as socMask parameter. +// These values can be OR'd together to trigger multiple SOCs at a time. +// +//***************************************************************************** +#define ADC_FORCE_SOC0 0x0001U //!< SW trigger ADC SOC 0 +#define ADC_FORCE_SOC1 0x0002U //!< SW trigger ADC SOC 1 +#define ADC_FORCE_SOC2 0x0004U //!< SW trigger ADC SOC 2 +#define ADC_FORCE_SOC3 0x0008U //!< SW trigger ADC SOC 3 +#define ADC_FORCE_SOC4 0x0010U //!< SW trigger ADC SOC 4 +#define ADC_FORCE_SOC5 0x0020U //!< SW trigger ADC SOC 5 +#define ADC_FORCE_SOC6 0x0040U //!< SW trigger ADC SOC 6 +#define ADC_FORCE_SOC7 0x0080U //!< SW trigger ADC SOC 7 +#define ADC_FORCE_SOC8 0x0100U //!< SW trigger ADC SOC 8 +#define ADC_FORCE_SOC9 0x0200U //!< SW trigger ADC SOC 9 +#define ADC_FORCE_SOC10 0x0400U //!< SW trigger ADC SOC 10 +#define ADC_FORCE_SOC11 0x0800U //!< SW trigger ADC SOC 11 +#define ADC_FORCE_SOC12 0x1000U //!< SW trigger ADC SOC 12 +#define ADC_FORCE_SOC13 0x2000U //!< SW trigger ADC SOC 13 +#define ADC_FORCE_SOC14 0x4000U //!< SW trigger ADC SOC 14 +#define ADC_FORCE_SOC15 0x8000U //!< SW trigger ADC SOC 15 + + + +//***************************************************************************** +// +//! Values that can be passed to ADC_setPrescaler() as the \e clkPrescale +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_CLK_DIV_1_0 = 0U, //!< ADCCLK = (input clock) / 1.0 + ADC_CLK_DIV_2_0 = 2U, //!< ADCCLK = (input clock) / 2.0 + ADC_CLK_DIV_2_5 = 3U, //!< ADCCLK = (input clock) / 2.5 + ADC_CLK_DIV_3_0 = 4U, //!< ADCCLK = (input clock) / 3.0 + ADC_CLK_DIV_3_5 = 5U, //!< ADCCLK = (input clock) / 3.5 + ADC_CLK_DIV_4_0 = 6U, //!< ADCCLK = (input clock) / 4.0 + ADC_CLK_DIV_4_5 = 7U, //!< ADCCLK = (input clock) / 4.5 + ADC_CLK_DIV_5_0 = 8U, //!< ADCCLK = (input clock) / 5.0 + ADC_CLK_DIV_5_5 = 9U, //!< ADCCLK = (input clock) / 5.5 + ADC_CLK_DIV_6_0 = 10U, //!< ADCCLK = (input clock) / 6.0 + ADC_CLK_DIV_6_5 = 11U, //!< ADCCLK = (input clock) / 6.5 + ADC_CLK_DIV_7_0 = 12U, //!< ADCCLK = (input clock) / 7.0 + ADC_CLK_DIV_7_5 = 13U, //!< ADCCLK = (input clock) / 7.5 + ADC_CLK_DIV_8_0 = 14U, //!< ADCCLK = (input clock) / 8.0 + ADC_CLK_DIV_8_5 = 15U //!< ADCCLK = (input clock) / 8.5 +} ADC_ClkPrescale; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setMode() as the \e resolution +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_RESOLUTION_12BIT = 0x00U, //!< 12-bit conversion resolution + ADC_RESOLUTION_16BIT = 0x40U //!< 16-bit conversion resolution +} ADC_Resolution; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setMode() as the \e signalMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_MODE_SINGLE_ENDED = 0x00U, //!< Sample on single pin with VREFLO + ADC_MODE_DIFFERENTIAL = 0x80U //!< Sample on pair of pins +} ADC_SignalMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setupSOC() as the \e trigger +//! parameter to specify the event that will trigger a conversion to start. +//! It is also used with ADC_setBurstModeConfig() and +//! ADC_triggerRepeaterSelect(). +// +//***************************************************************************** +typedef enum +{ + ADC_TRIGGER_SW_ONLY = 0U, //!< Software only + ADC_TRIGGER_CPU1_TINT0 = 1U, //!< CPU1 Timer 0, TINT0 + ADC_TRIGGER_CPU1_TINT1 = 2U, //!< CPU1 Timer 1, TINT1 + ADC_TRIGGER_CPU1_TINT2 = 3U, //!< CPU1 Timer 2, TINT2 + ADC_TRIGGER_GPIO = 4U, //!< GPIO, ADCEXTSOC + ADC_TRIGGER_EPWM1_SOCA = 5U, //!< ePWM1, ADCSOCA + ADC_TRIGGER_EPWM1_SOCB = 6U, //!< ePWM1, ADCSOCB + ADC_TRIGGER_EPWM2_SOCA = 7U, //!< ePWM2, ADCSOCA + ADC_TRIGGER_EPWM2_SOCB = 8U, //!< ePWM2, ADCSOCB + ADC_TRIGGER_EPWM3_SOCA = 9U, //!< ePWM3, ADCSOCA + ADC_TRIGGER_EPWM3_SOCB = 10U, //!< ePWM3, ADCSOCB + ADC_TRIGGER_EPWM4_SOCA = 11U, //!< ePWM4, ADCSOCA + ADC_TRIGGER_EPWM4_SOCB = 12U, //!< ePWM4, ADCSOCB + ADC_TRIGGER_EPWM5_SOCA = 13U, //!< ePWM5, ADCSOCA + ADC_TRIGGER_EPWM5_SOCB = 14U, //!< ePWM5, ADCSOCB + ADC_TRIGGER_EPWM6_SOCA = 15U, //!< ePWM6, ADCSOCA + ADC_TRIGGER_EPWM6_SOCB = 16U, //!< ePWM6, ADCSOCB + ADC_TRIGGER_EPWM7_SOCA = 17U, //!< ePWM7, ADCSOCA + ADC_TRIGGER_EPWM7_SOCB = 18U, //!< ePWM7, ADCSOCB + ADC_TRIGGER_EPWM8_SOCA = 19U, //!< ePWM8, ADCSOCA + ADC_TRIGGER_EPWM8_SOCB = 20U, //!< ePWM8, ADCSOCB + ADC_TRIGGER_EPWM9_SOCA = 21U, //!< ePWM9, ADCSOCA + ADC_TRIGGER_EPWM9_SOCB = 22U, //!< ePWM9, ADCSOCB + ADC_TRIGGER_EPWM10_SOCA = 23U, //!< ePWM10, ADCSOCA + ADC_TRIGGER_EPWM10_SOCB = 24U, //!< ePWM10, ADCSOCB + ADC_TRIGGER_EPWM11_SOCA = 25U, //!< ePWM11, ADCSOCA + ADC_TRIGGER_EPWM11_SOCB = 26U, //!< ePWM11, ADCSOCB + ADC_TRIGGER_EPWM12_SOCA = 27U, //!< ePWM12, ADCSOCA + ADC_TRIGGER_EPWM12_SOCB = 28U, //!< ePWM12, ADCSOCB + ADC_TRIGGER_CPU2_TINT0 = 29U, //!< CPU2 Timer 0, TINT0 + ADC_TRIGGER_CPU2_TINT1 = 30U, //!< CPU2 Timer 1, TINT1 + ADC_TRIGGER_CPU2_TINT2 = 31U //!< CPU2 Timer 2, TINT2 +} ADC_Trigger; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setupSOC() as the \e channel +//! parameter. This is the input pin on which the signal to be converted is +//! located. +// +//***************************************************************************** +typedef enum +{ + ADC_CH_ADCIN0 = 0U, //!< single-ended, ADCIN0 + ADC_CH_ADCIN1 = 1U, //!< single-ended, ADCIN1 + ADC_CH_ADCIN2 = 2U, //!< single-ended, ADCIN2 + ADC_CH_ADCIN3 = 3U, //!< single-ended, ADCIN3 + ADC_CH_ADCIN4 = 4U, //!< single-ended, ADCIN4 + ADC_CH_ADCIN5 = 5U, //!< single-ended, ADCIN5 + ADC_CH_ADCIN6 = 6U, //!< single-ended, ADCIN6 + ADC_CH_ADCIN7 = 7U, //!< single-ended, ADCIN7 + ADC_CH_ADCIN8 = 8U, //!< single-ended, ADCIN8 + ADC_CH_ADCIN9 = 9U, //!< single-ended, ADCIN9 + ADC_CH_ADCIN10 = 10U, //!< single-ended, ADCIN10 + ADC_CH_ADCIN11 = 11U, //!< single-ended, ADCIN11 + ADC_CH_ADCIN12 = 12U, //!< single-ended, ADCIN12 + ADC_CH_ADCIN13 = 13U, //!< single-ended, ADCIN13 + ADC_CH_ADCIN14 = 14U, //!< single-ended, ADCIN14 + ADC_CH_ADCIN15 = 15U, //!< single-ended, ADCIN15 + ADC_CH_ADCIN0_ADCIN1 = 0U, //!< differential, ADCIN0 and ADCIN1 + ADC_CH_ADCIN2_ADCIN3 = 2U, //!< differential, ADCIN2 and ADCIN3 + ADC_CH_ADCIN4_ADCIN5 = 4U, //!< differential, ADCIN4 and ADCIN5 + ADC_CH_ADCIN6_ADCIN7 = 6U, //!< differential, ADCIN6 and ADCIN7 + ADC_CH_ADCIN8_ADCIN9 = 8U, //!< differential, ADCIN8 and ADCIN9 + ADC_CH_ADCIN10_ADCIN11 = 10U, //!< differential, ADCIN10 and ADCIN11 + ADC_CH_ADCIN12_ADCIN13 = 12U, //!< differential, ADCIN12 and ADCIN13 + ADC_CH_ADCIN14_ADCIN15 = 14U //!< differential, ADCIN14 and ADCIN15 +} ADC_Channel; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setInterruptPulseMode() as the +//! \e pulseMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Occurs at the end of the acquisition window + ADC_PULSE_END_OF_ACQ_WIN = 0x00U, + //! Occurs at the end of the conversion + ADC_PULSE_END_OF_CONV = 0x04U +} ADC_PulseMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_enableInterrupt(), ADC_disableInterrupt(), +//! and ADC_getInterruptStatus() as the \e adcIntNum parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_INT_NUMBER1 = 0U, //!< ADCINT1 Interrupt + ADC_INT_NUMBER2 = 1U, //!< ADCINT2 Interrupt + ADC_INT_NUMBER3 = 2U, //!< ADCINT3 Interrupt + ADC_INT_NUMBER4 = 3U //!< ADCINT4 Interrupt +} ADC_IntNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e ppbNumber parameter for several +//! functions. +// +//***************************************************************************** +typedef enum +{ + ADC_PPB_NUMBER1 = 0U, //!< Post-processing block 1 + ADC_PPB_NUMBER2 = 1U, //!< Post-processing block 2 + ADC_PPB_NUMBER3 = 2U, //!< Post-processing block 3 + ADC_PPB_NUMBER4 = 3U //!< Post-processing block 4 +} ADC_PPBNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e socNumber parameter for several +//! functions. This value identifies the start-of-conversion (SOC) that a +//! function is configuring or accessing. Note that in some cases (for example, +//! ADC_setInterruptSource()) \e socNumber is used to refer to the +//! corresponding end-of-conversion (EOC). +// +//***************************************************************************** +typedef enum +{ + ADC_SOC_NUMBER0 = 0U, //!< SOC/EOC number 0 + ADC_SOC_NUMBER1 = 1U, //!< SOC/EOC number 1 + ADC_SOC_NUMBER2 = 2U, //!< SOC/EOC number 2 + ADC_SOC_NUMBER3 = 3U, //!< SOC/EOC number 3 + ADC_SOC_NUMBER4 = 4U, //!< SOC/EOC number 4 + ADC_SOC_NUMBER5 = 5U, //!< SOC/EOC number 5 + ADC_SOC_NUMBER6 = 6U, //!< SOC/EOC number 6 + ADC_SOC_NUMBER7 = 7U, //!< SOC/EOC number 7 + ADC_SOC_NUMBER8 = 8U, //!< SOC/EOC number 8 + ADC_SOC_NUMBER9 = 9U, //!< SOC/EOC number 9 + ADC_SOC_NUMBER10 = 10U, //!< SOC/EOC number 10 + ADC_SOC_NUMBER11 = 11U, //!< SOC/EOC number 11 + ADC_SOC_NUMBER12 = 12U, //!< SOC/EOC number 12 + ADC_SOC_NUMBER13 = 13U, //!< SOC/EOC number 13 + ADC_SOC_NUMBER14 = 14U, //!< SOC/EOC number 14 + ADC_SOC_NUMBER15 = 15U //!< SOC/EOC number 15 +} ADC_SOCNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e trigger parameter for the +//! ADC_setInterruptSOCTrigger() function. +// +//***************************************************************************** +typedef enum +{ + ADC_INT_SOC_TRIGGER_NONE = 0U, //!< No ADCINT will trigger the SOC + ADC_INT_SOC_TRIGGER_ADCINT1 = 1U, //!< ADCINT1 will trigger the SOC + ADC_INT_SOC_TRIGGER_ADCINT2 = 2U //!< ADCINT2 will trigger the SOC +} ADC_IntSOCTrigger; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setSOCPriority() as the \e priMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_PRI_ALL_ROUND_ROBIN = 0U, //!< Round robin mode is used for all + ADC_PRI_SOC0_HIPRI = 1U, //!< SOC 0 hi pri, others in round robin + ADC_PRI_THRU_SOC1_HIPRI = 2U, //!< SOC 0-1 hi pri, others in round robin + ADC_PRI_THRU_SOC2_HIPRI = 3U, //!< SOC 0-2 hi pri, others in round robin + ADC_PRI_THRU_SOC3_HIPRI = 4U, //!< SOC 0-3 hi pri, others in round robin + ADC_PRI_THRU_SOC4_HIPRI = 5U, //!< SOC 0-4 hi pri, others in round robin + ADC_PRI_THRU_SOC5_HIPRI = 6U, //!< SOC 0-5 hi pri, others in round robin + ADC_PRI_THRU_SOC6_HIPRI = 7U, //!< SOC 0-6 hi pri, others in round robin + ADC_PRI_THRU_SOC7_HIPRI = 8U, //!< SOC 0-7 hi pri, others in round robin + ADC_PRI_THRU_SOC8_HIPRI = 9U, //!< SOC 0-8 hi pri, others in round robin + ADC_PRI_THRU_SOC9_HIPRI = 10U, //!< SOC 0-9 hi pri, others in round robin + ADC_PRI_THRU_SOC10_HIPRI = 11U, //!< SOC 0-10 hi pri, others in round robin + ADC_PRI_THRU_SOC11_HIPRI = 12U, //!< SOC 0-11 hi pri, others in round robin + ADC_PRI_THRU_SOC12_HIPRI = 13U, //!< SOC 0-12 hi pri, others in round robin + ADC_PRI_THRU_SOC13_HIPRI = 14U, //!< SOC 0-13 hi pri, others in round robin + ADC_PRI_THRU_SOC14_HIPRI = 15U, //!< SOC 0-14 hi pri, SOC15 in round robin + ADC_PRI_ALL_HIPRI = 16U //!< All priorities based on SOC number +} ADC_PriorityMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_configOSDetectMode() as the \e modeVal +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_OSDETECT_MODE_DISABLED = 0x0U,//!< Open/Shorts detection cir- + //!< cuit(O/S DC) is disabled + ADC_OSDETECT_MODE_VSSA = 0x1U,//!< O/S DC is enabled at zero + //!< scale + ADC_OSDETECT_MODE_VDDA = 0x2U,//!< O/S DC is enabled at full + //!< scale + ADC_OSDETECT_MODE_5BY12_VDDA = 0x3U,//!< O/S DC is enabled at 5/12 + //!< scale + ADC_OSDETECT_MODE_7BY12_VDDA = 0x4U,//!< O/S DC is enabled at 7/12 + //!< scale + ADC_OSDETECT_MODE_5K_PULLDOWN_TO_VSSA = 0x5U,//!< O/S DC is enabled at 5K + //!< pulldown to VSSA + ADC_OSDETECT_MODE_5K_PULLUP_TO_VDDA = 0x6U,//!< O/S DC is enabled at 5K + //!< pullup to VDDA + ADC_OSDETECT_MODE_7K_PULLDOWN_TO_VSSA = 0x7U //!< O/S DC is enabled at 7K + //!< pulldown to VSSA +} ADC_OSDetectMode; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an ADC base address. +//! +//! \param base specifies the ADC module base address. +//! +//! This function determines if a ADC module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +ADC_isBaseValid(uint32_t base) +{ + return( + (base == ADCA_BASE) || + (base == ADCB_BASE) || + (base == ADCC_BASE) || + (base == ADCD_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Configures the analog-to-digital converter module prescaler. +//! +//! \param base is the base address of the ADC module. +//! \param clkPrescale is the ADC clock prescaler. +//! +//! This function configures the ADC module's ADCCLK. +//! +//! The \e clkPrescale parameter specifies the value by which the input clock +//! is divided to make the ADCCLK. The clkPrescale value can be specified with +//! any of the following enum values: +//! \b ADC_CLK_DIV_1_0, \b ADC_CLK_DIV_2_0, \b ADC_CLK_DIV_2_5, ..., +//! \b ADC_CLK_DIV_7_5, \b ADC_CLK_DIV_8_0, or \b ADC_CLK_DIV_8_5. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setPrescaler(uint32_t base, ADC_ClkPrescale clkPrescale) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the configuration of the ADC module prescaler. + // + EALLOW; + HWREGH(base + ADC_O_CTL2) = (HWREGH(base + ADC_O_CTL2) & + ~ADC_CTL2_PRESCALE_M) | (uint16_t)clkPrescale; + EDIS; +} + +//***************************************************************************** +// +//! Configures a start-of-conversion (SOC) in the ADC. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! \param trigger the source that will cause the SOC. +//! \param channel is the number associated with the input signal. +//! \param sampleWindow is the acquisition window duration. +//! +//! This function configures the a start-of-conversion (SOC) in the ADC module. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC is to be configured on the ADC module +//! specified by \e base. +//! +//! The \e trigger specifies the event that causes the SOC such as software, a +//! timer interrupt, an ePWM event, or an ADC interrupt. It should be a value +//! in the format of \b ADC_TRIGGER_XXXX where XXXX is the event such as +//! \b ADC_TRIGGER_SW_ONLY, \b ADC_TRIGGER_CPU1_TINT0, \b ADC_TRIGGER_GPIO, +//! \b ADC_TRIGGER_EPWM1_SOCA, and so on. +//! +//! The \e channel parameter specifies the channel to be converted. In +//! single-ended mode this is a single pin given by \b ADC_CH_ADCINx where x is +//! the number identifying the pin between 0 and 15 inclusive. In differential +//! mode, two pins are used as inputs and are passed in the \e channel +//! parameter as \b ADC_CH_ADCIN0_ADCIN1, \b ADC_CH_ADCIN2_ADCIN3, ..., or +//! \b ADC_CH_ADCIN14_ADCIN15. +//! +//! The \e sampleWindow parameter is the acquisition window duration in SYSCLK +//! cycles. It should be a value between 1 and 512 cycles inclusive. The +//! selected duration must be at least as long as one ADCCLK cycle. Also, the +//! datasheet will specify a minimum window duration requirement in +//! nanoseconds. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setupSOC(uint32_t base, ADC_SOCNumber socNumber, ADC_Trigger trigger, + ADC_Channel channel, uint32_t sampleWindow) +{ + uint32_t ctlRegAddr, mask; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((sampleWindow >= 1U) && (sampleWindow <= 512U)); + + mask = (ADC_SOC0CTL_CHSEL_M | ADC_SOC0CTL_TRIGSEL_M | ADC_SOC0CTL_ACQPS_M); + + // + // Calculate address for the SOC control register. + // + ctlRegAddr = base + ADC_SOCxCTL_OFFSET_BASE + ((uint32_t)socNumber * 2U); + + // + // Set the configuration of the specified SOC. + // + EALLOW; + + HWREG(ctlRegAddr) = (HWREG(ctlRegAddr) & ~(mask)) | + ((uint32_t)channel << ADC_SOC0CTL_CHSEL_S) | + ((uint32_t)trigger << ADC_SOC0CTL_TRIGSEL_S) | + (sampleWindow - 1U); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the interrupt SOC trigger of an SOC. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! \param trigger the interrupt source that will cause the SOC. +//! +//! This function configures the interrupt start-of-conversion trigger in +//! the ADC module. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC is to be configured on the ADC module +//! specified by \e base. +//! +//! The \e trigger specifies the interrupt that causes a start of conversion or +//! none. It should be one of the following values. +//! +//! - \b ADC_INT_SOC_TRIGGER_NONE +//! - \b ADC_INT_SOC_TRIGGER_ADCINT1 +//! - \b ADC_INT_SOC_TRIGGER_ADCINT2 +//! +//! This functionality is useful for creating continuous conversions. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptSOCTrigger(uint32_t base, ADC_SOCNumber socNumber, + ADC_IntSOCTrigger trigger) +{ + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each SOC has a 2-bit field in this register. + // + shiftVal = (uint16_t)socNumber << 1U; + + // + // Set the configuration of the specified SOC. Not that we're treating + // ADCINTSOCSEL1 and ADCINTSOCSEL2 as one 32-bit register here. + // + EALLOW; + HWREG(base + ADC_O_INTSOCSEL1) = (HWREG(base + ADC_O_INTSOCSEL1) & + ~((uint32_t)ADC_INTSOCSEL1_SOC0_M << + shiftVal)) | + ((uint32_t)trigger << shiftVal); + EDIS; +} + +//***************************************************************************** +// +//! Sets the timing of the end-of-conversion pulse +//! +//! \param base is the base address of the ADC module. +//! \param pulseMode is the generation mode of the EOC pulse. +//! +//! This function configures the end-of-conversion (EOC) pulse generated by ADC. +//! This pulse will be generated either at the end of the acquisition window +//!(pass \b ADC_PULSE_END_OF_ACQ_WIN into \e pulseMode) or at the end of the +//! voltage conversion, one cycle prior to the ADC result latching into it's +//! result register (pass \b ADC_PULSE_END_OF_CONV into \e pulseMode). +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptPulseMode(uint32_t base, ADC_PulseMode pulseMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the position of the pulse. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) = (HWREGH(base + ADC_O_CTL1) & + ~ADC_CTL1_INTPULSEPOS) | (uint16_t)pulseMode; + EDIS; +} + + + + +//***************************************************************************** +// +//! Powers up the analog-to-digital converter core. +//! +//! \param base is the base address of the ADC module. +//! +//! This function powers up the analog circuitry inside the analog core. +//! +//! \note Allow at least a 500us delay before sampling after calling this API. +//! If you enable multiple ADCs, you can delay after they all have begun +//! powering up. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableConverter(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the bit that powers up the analog circuitry. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) |= ADC_CTL1_ADCPWDNZ; + EDIS; +} + +//***************************************************************************** +// +//! Powers down the analog-to-digital converter module. +//! +//! \param base is the base address of the ADC module. +//! +//! This function powers down the analog circuitry inside the analog core. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableConverter(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the bit that powers down the analog circuitry. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) &= ~ADC_CTL1_ADCPWDNZ; + EDIS; +} + +//***************************************************************************** +// +//! Forces a SOC flag to a 1 in the analog-to-digital converter. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function forces the SOC flag associated with the SOC specified by +//! \e socNumber. This initiates a conversion once that SOC is given +//! priority. This software trigger can be used whether or not the SOC has been +//! configured to accept some other specific trigger. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_forceSOC(uint32_t base, ADC_SOCNumber socNumber) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Write to the register that will force a 1 to the corresponding SOC flag + // + HWREGH(base + ADC_O_SOCFRC1) = ((uint16_t)1U << (uint16_t)socNumber); +} + +//***************************************************************************** +// +//! Forces multiple SOC flags to 1 in the analog-to-digital converter. +//! +//! \param base is the base address of the ADC module. +//! \param socMask is the SOCs to be forced through software +//! +//! This function forces the SOCFRC1 flags associated with the SOCs specified +//! by \e socMask. This initiates a conversion once the desired SOCs are given +//! priority. This software trigger can be used whether or not the SOC has been +//! configured to accept some other specific trigger. +//! Valid values for \e socMask parameter can be any of the individual +//! ADC_FORCE_SOCx values or any of their OR'd combination to trigger multiple +//! SOCs. +//! +//! \note To trigger SOC0, SOC1 and SOC2, value (ADC_FORCE_SOC0 | +//! ADC_FORCE_SOC1 | ADC_FORCE_SOC2) should be passed as socMask. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_forceMultipleSOC(uint32_t base, uint16_t socMask) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Write to the register that will force a 1 to desired SOCs + // + HWREGH(base + ADC_O_SOCFRC1) = socMask; +} + +//***************************************************************************** +// +//! Gets the current ADC interrupt status. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function returns the interrupt status for the analog-to-digital +//! converter. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get +//! the interrupt status for the given interrupt number of the ADC module. +//! +//! \return \b true if the interrupt flag for the specified interrupt number is +//! set and \b false if it is not. +// +//***************************************************************************** +static inline bool +ADC_getInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + // + // Get the specified ADC interrupt status. + // + return((HWREGH(base + ADC_O_INTFLG) & (1U << (uint16_t)adcIntNum)) != 0U); +} + +//***************************************************************************** +// +//! Clears ADC interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function clears the specified ADC interrupt sources so that they no +//! longer assert. If not in continuous mode, this function must be called +//! before any further interrupt pulses may occur. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the specified interrupt. + // + HWREGH(base + ADC_O_INTFLGCLR) = (uint16_t)1U << (uint16_t)adcIntNum; + +} + +//***************************************************************************** +// +//! Gets the current ADC interrupt overflow status. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function returns the interrupt overflow status for the +//! analog-to-digital converter. An overflow condition is generated +//! irrespective of the continuous mode. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get +//! the interrupt overflow status for the given interrupt number. +//! +//! \return \b true if the interrupt overflow flag for the specified interrupt +//! number is set and \b false if it is not. +// +//***************************************************************************** +static inline bool +ADC_getInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the specified ADC interrupt status. + // + return((HWREGH(base + ADC_O_INTOVF) & (1U << (uint16_t)adcIntNum)) != 0U); +} + +//***************************************************************************** +// +//! Clears ADC interrupt overflow sources. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function clears the specified ADC interrupt overflow sources so that +//! they no longer assert. If software tries to clear the overflow in the same +//! cycle that hardware tries to set the overflow, then hardware has priority. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupt overflow status of the ADC module +//! should be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the specified interrupt overflow bit. + // + HWREGH(base + ADC_O_INTOVFCLR) = (uint16_t)1U << (uint16_t)adcIntNum; +} + +//***************************************************************************** +// +//! Reads the conversion result. +//! +//! \param resultBase is the base address of the ADC results. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function returns the conversion result that corresponds to the base +//! address passed into \e resultBase and the SOC passed into \e socNumber. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC's result is to be read. +//! +//! \note Take care that you are using a base address for the result registers +//! (ADCxRESULT_BASE) and not a base address for the control registers. +//! +//! \return Returns the conversion result. +// +//***************************************************************************** +static inline uint16_t +ADC_readResult(uint32_t resultBase, ADC_SOCNumber socNumber) +{ + // + // Check the arguments. + // + ASSERT( + (resultBase == ADCARESULT_BASE) || + (resultBase == ADCBRESULT_BASE) || + (resultBase == ADCCRESULT_BASE) || + (resultBase == ADCDRESULT_BASE) + ); + // + // Return the ADC result for the selected SOC. + // + return(HWREGH(resultBase + (uint32_t)ADC_RESULTx_OFFSET_BASE + + (uint32_t)socNumber)); +} + +//***************************************************************************** +// +//! Determines whether the ADC is busy or not. +//! +//! \param base is the base address of the ADC. +//! +//! This function allows the caller to determine whether or not the ADC is +//! busy and can sample another channel. +//! +//! \return Returns \b true if the ADC is sampling or \b false if all +//! samples are complete. +// +//***************************************************************************** +static inline bool +ADC_isBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Determine if the ADC is busy. + // + return((HWREGH(base + ADC_O_CTL1) & ADC_CTL1_ADCBSY) != 0U); +} + +//***************************************************************************** +// +//! Set SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! \param trigger the source that will cause the burst conversion sequence. +//! \param burstSize is the number of SOCs converted during a burst sequence. +//! +//! This function configures the burst trigger and burstSize of an ADC module. +//! Burst mode allows a single trigger to walk through the round-robin SOCs one +//! or more at a time. When burst mode is enabled, the trigger selected by the +//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin +//! mode. Instead, the source specified through the \e trigger parameter will +//! cause a burst of \e burstSize conversions to occur. +//! +//! The \e trigger parameter takes the same values as the ADC_setupSOC() API +//! The \e burstSize parameter should be a value between 1 and 16 inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setBurstModeConfig(uint32_t base, ADC_Trigger trigger, uint16_t burstSize) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT(((uint16_t)trigger & ~((uint16_t)0x1FU)) == 0U); + ASSERT((burstSize >= 1U) && (burstSize <= 16U)); + + // + // Write the burst mode configuration to the register. + // + EALLOW; + + regValue = (uint16_t)trigger | ((burstSize - 1U) << + ADC_BURSTCTL_BURSTSIZE_S); + + HWREGH(base + ADC_O_BURSTCTL) = (HWREGH(base + ADC_O_BURSTCTL) & + ~((uint16_t)ADC_BURSTCTL_BURSTTRIGSEL_M | + ADC_BURSTCTL_BURSTSIZE_M)) | regValue; + + EDIS; +} + +//***************************************************************************** +// +//! Enables SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! +//! This function enables SOC burst mode operation of the ADC. Burst mode +//! allows a single trigger to walk through the round-robin SOCs one or more at +//! a time. When burst mode is enabled, the trigger selected by the +//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin +//! mode. Use ADC_setBurstMode() to configure the burst trigger and size. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableBurstMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Enable burst mode. + // + EALLOW; + HWREGH(base + ADC_O_BURSTCTL) |= ADC_BURSTCTL_BURSTEN; + EDIS; +} + +//***************************************************************************** +// +//! Disables SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! +//! This function disables SOC burst mode operation of the ADC. SOCs in +//! round-robin mode will be triggered by the trigger configured using the +//! ADC_setupSOC() API. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableBurstMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Disable burst mode. + // + EALLOW; + HWREGH(base + ADC_O_BURSTCTL) &= ~ADC_BURSTCTL_BURSTEN; + EDIS; +} + +//***************************************************************************** +// +//! Sets the priority mode of the SOCs. +//! +//! \param base is the base address of the ADC. +//! \param priMode is the priority mode of the SOCs. +//! +//! This function sets the priority mode of the SOCs. There are three main +//! modes that can be passed in the \e priMode parameter +//! +//! - All SOCs are in round-robin mode. This means no SOC has an inherent +//! higher priority over another. This is selected by passing in the value +//! \b ADC_PRI_ALL_ROUND_ROBIN. +//! - All priorities are in high priority mode. This means that the priority of +//! the SOC is determined by its SOC number. This option is selected by passing +//! in the value \b ADC_PRI_ALL_HIPRI. +//! - A range of SOCs are assigned high priority, with all others in round +//! robin mode. High priority mode means that an SOC with high priority will +//! interrupt the round robin wheel and insert itself as the next conversion. +//! Passing in the value \b ADC_PRI_SOC0_HIPRI will make SOC0 highest priority, +//! \b ADC_PRI_THRU_SOC1_HIPRI will put SOC0 and SOC 1 in high priority, and so +//! on up to \b ADC_PRI_THRU_SOC14_HIPRI where SOCs 0 through 14 are in high +//! priority. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setSOCPriority(uint32_t base, ADC_PriorityMode priMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + EALLOW; + + HWREGH(base + ADC_O_SOCPRICTL) = (HWREGH(base + ADC_O_SOCPRICTL) & + ~ADC_SOCPRICTL_SOCPRIORITY_M) | + (uint16_t)priMode; + + EDIS; +} + +//***************************************************************************** +// +//! Configures Open/Shorts Detection Circuit Mode. +//! +//! \param base is the base address of the ADC. +//! \param modeVal is the desired open/shorts detection circuit mode. +//! +//! This function configures the open/shorts detection circuit mode of the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_configOSDetectMode(uint32_t base, ADC_OSDetectMode modeVal) +{ + // + // Configure open/shorts detection circuit mode. + // + EALLOW; + HWREGH(base + ADC_O_OSDETECT) = ((HWREGH(base + ADC_O_OSDETECT) & + (~ADC_OSDETECT_DETECTCFG_M)) | + (uint16_t)modeVal); + EDIS; +} + +//***************************************************************************** +// +//! Configures a post-processing block (PPB) in the ADC. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function associates a post-processing block with a SOC. +//! +//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to +//! 4 inclusive that identifies a PPB to be configured. The \e socNumber +//! number is a value \b ADC_SOC_NUMBERX where X is a number from 0 to 15 +//! specifying which SOC is to be configured on the ADC module specified by +//! \e base. +//! +//! \note You can have more that one PPB associated with the same SOC, but a +//! PPB can only be configured to correspond to one SOC at a time. Also note +//! that when you have multiple PPBs for the same SOC, the calibration offset +//! that actually gets applied will be that of the PPB with the highest number. +//! Since SOC0 is the default for all PPBs, look out for unintentional +//! overwriting of a lower numbered PPB's offset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setupPPB(uint32_t base, ADC_PPBNumber ppbNumber, ADC_SOCNumber socNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Write the configuration to the register. + // + EALLOW; + HWREGH(base + ppbOffset) = (HWREGH(base + ppbOffset) & + ~ADC_PPB1CONFIG_CONFIG_M) | + ((uint16_t)socNumber & ADC_PPB1CONFIG_CONFIG_M); + EDIS; +} + +//***************************************************************************** +// +//! Enables individual ADC PPB event sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event sources to be enabled. +//! +//! This function enables the indicated ADC PPB event sources. This will allow +//! the specified events to propagate through the X-BAR to a pin or to an ePWM +//! module. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Enable the specified event. + // + EALLOW; + HWREGH(base + ADC_O_EVTSEL) |= evtFlags << ((uint16_t)ppbNumber * 4U); + EDIS; +} + +//***************************************************************************** +// +//! Disables individual ADC PPB event sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event sources to be enabled. +//! +//! This function disables the indicated ADC PPB event sources. This will stop +//! the specified events from propagating through the X-BAR to other modules. +//! The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Disable the specified event. + // + EALLOW; + HWREGH(base + ADC_O_EVTSEL) &= ~(evtFlags << ((uint16_t)ppbNumber * 4U)); + EDIS; +} + +//***************************************************************************** +// +//! Enables individual ADC PPB event interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated ADC PPB interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. The \e intFlags +//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, +//! or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((intFlags & ~0x7U) == 0U); + + // + // Enable the specified event interrupts. + // + EALLOW; + HWREGH(base + ADC_O_EVTINTSEL) |= intFlags << ((uint16_t)ppbNumber * 4U); + EDIS; +} + +//***************************************************************************** +// +//! Disables individual ADC PPB event interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param intFlags is a bit mask of the interrupt source to be disabled. +//! +//! This function disables the indicated ADC PPB interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. The \e intFlags +//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, +//! or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((intFlags & ~0x7U) == 0U); + + // + // Disable the specified event interrupts. + // + EALLOW; + HWREGH(base + ADC_O_EVTINTSEL) &= ~(intFlags << + ((uint16_t)ppbNumber * 4U)); + EDIS; +} + +//***************************************************************************** +// +//! Gets the current ADC event status. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the event status for the analog-to-digital converter. +//! +//! \return Returns the current event status, enumerated as a bit field of +//! \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, and \b ADC_EVT_ZERO. +// +//***************************************************************************** +static inline uint16_t +ADC_getPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the event status for the specified post-processing block. + // + return((HWREGH(base + ADC_O_EVTSTAT) >> ((uint16_t)ppbNumber * 4U)) & + 0x7U); +} + +//***************************************************************************** +// +//! Clears ADC event flags. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event source to be cleared. +//! +//! This function clears the indicated ADC PPB event flags. After an event +//! occurs this function must be called to allow additional events to be +//! produced. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Clear the specified event interrupts. + // + HWREGH(base + ADC_O_EVTCLR) |= evtFlags << ((uint16_t)ppbNumber * 4U); +} + + +//***************************************************************************** +// +//! Reads the processed conversion result from the PPB. +//! +//! \param resultBase is the base address of the ADC results. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the processed conversion result that corresponds to +//! the base address passed into \e resultBase and the PPB passed into +//! \e ppbNumber. +//! +//! \note Take care that you are using a base address for the result registers +//! (ADCxRESULT_BASE) and not a base address for the control registers. +//! +//! \return Returns the signed 32-bit conversion result. +// +//***************************************************************************** +static inline int32_t +ADC_readPPBResult(uint32_t resultBase, ADC_PPBNumber ppbNumber) +{ + // + // Check the arguments. + // + ASSERT( + (resultBase == ADCARESULT_BASE) || + (resultBase == ADCBRESULT_BASE) || + (resultBase == ADCCRESULT_BASE) || + (resultBase == ADCDRESULT_BASE) + ); + // + // Return the result of selected PPB. + // + return((int32_t)HWREG(resultBase + (uint32_t)ADC_PPBxRESULT_OFFSET_BASE + + ((uint32_t)ppbNumber * 2UL))); +} + +//***************************************************************************** +// +//! Reads sample delay time stamp from a PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the sample delay time stamp. This delay is the number +//! of system clock cycles between the SOC being triggered and when it began +//! converting. +//! +//! \return Returns the delay time stamp. +// +//***************************************************************************** +static inline uint16_t +ADC_getPPBDelayTimeStamp(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate delay. + // + ppbOffset = (ADC_PPBxSTAMP_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1STAMP; + + // + // Return the delay time stamp. + // + return(HWREGH(base + ppbOffset) & ADC_PPB2STAMP_DLYSTAMP_M); +} + +//***************************************************************************** +// +//! Sets the post processing block offset correction. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param offset is the 10-bit signed value subtracted from ADC the output. +//! +//! This function sets the PPB offset correction value. This value can be used +//! to digitally remove any system-level offset inherent in the ADCIN circuit +//! before it is stored in the appropriate result register. The \e offset +//! parameter is \b subtracted from the ADC output and is a signed value from +//! -512 to 511 inclusive. For example, when \e offset = 1, ADCRESULT = ADC +//! output - 1. When \e offset = -512, ADCRESULT = ADC output - (-512) or ADC +//! output + 512. +//! +//! Passing a zero in to the \e offset parameter will effectively disable the +//! calculation, allowing the raw ADC result to be passed unchanged into the +//! result register. +//! +//! \note If multiple PPBs are applied to the same SOC, the offset that will be +//! applied will be that of the PPB with the highest number. +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_setPPBCalibrationOffset(uint32_t base, ADC_PPBNumber ppbNumber, + int16_t offset) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate offset register. + // + ppbOffset = (ADC_PPBxOFFCAL_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1OFFCAL; + + // + // Write the offset amount. + // + EALLOW; + HWREGH(base + ppbOffset) = (HWREGH(base + ppbOffset) & + ~ADC_PPB1OFFCAL_OFFCAL_M) | + ((uint16_t)offset & ADC_PPB1OFFCAL_OFFCAL_M); + EDIS; +} + +//***************************************************************************** +// +//! Sets the post processing block reference offset. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param offset is the 16-bit unsigned value subtracted from ADC the output. +//! +//! This function sets the PPB reference offset value. This can be used to +//! either calculate the feedback error or convert a unipolar signal to bipolar +//! by subtracting a reference value. The result will be stored in the +//! appropriate PPB result register which can be read using ADC_readPPBResult(). +//! +//! Passing a zero in to the \e offset parameter will effectively disable the +//! calculation and will pass the ADC result to the PPB result register +//! unchanged. +//! +//! \note If in 12-bit mode, you may only pass a 12-bit value into the \e offset +//! parameter. +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_setPPBReferenceOffset(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t offset) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate offset register. + // + ppbOffset = (ADC_PPBxOFFREF_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1OFFREF; + + // + // Write the offset amount. + // + HWREGH(base + ppbOffset) = offset; +} + +//***************************************************************************** +// +//! Enables two's complement capability in the PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function enables two's complement in the post-processing block +//! specified by the \e ppbNumber parameter. When enabled, a two's complement +//! will be performed on the output of the offset subtraction before it is +//! stored in the appropriate PPB result register. In other words, the PPB +//! result will be the reference offset value minus the the ADC result value +//! (ADCPPBxRESULT = ADCSOCxOFFREF - ADCRESULTx). +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_enablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Enable PPB two's complement. + // + EALLOW; + HWREGH(base + ppbOffset) |= ADC_PPB1CONFIG_TWOSCOMPEN; + EDIS; +} + +//***************************************************************************** +// +//! Disables two's complement capability in the PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function disables two's complement in the post-processing block +//! specified by the \e ppbNumber parameter. When disabled, a two's complement +//! will \b NOT be performed on the output of the offset subtraction before it +//! is stored in the appropriate PPB result register. In other words, the PPB +//! result will be the ADC result value minus the reference offset value +//! (ADCPPBxRESULT = ADCRESULTx - ADCSOCxOFFREF). +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_disablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Disable PPB two's complement. + // + EALLOW; + HWREGH(base + ppbOffset) &= ~ADC_PPB1CONFIG_TWOSCOMPEN; + EDIS; +} + +//***************************************************************************** +// +//! Enables an ADC interrupt source. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function enables the indicated ADC interrupt source. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableInterrupt(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Enable the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) |= ADC_INTSEL1N2_INT1E << shiftVal; + + EDIS; +} + +//***************************************************************************** +// +//! Disables an ADC interrupt source. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function disables the indicated ADC interrupt source. +//! Only the sources that are enabled can be reflected to the processor +//! interrupt. Disabled sources have no effect on the processor. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableInterrupt(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Disable the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) &= ~(ADC_INTSEL1N2_INT1E << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Sets the source EOC for an analog-to-digital converter interrupt. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function sets which conversion is the source of an ADC interrupt. +//! +//! The \e intTrigger number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which EOC is to be configured on the ADC module +//! specified by \e base. Refer \b ADC_SOCNumber enum for valid values for +//! this input. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptSource(uint32_t base, ADC_IntNumber adcIntNum, + uint16_t intTrigger) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT(intTrigger < 16U); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Set the specified ADC interrupt source. + // + EALLOW; + + HWREGH(intRegAddr) = + (HWREGH(intRegAddr) & ~(ADC_INTSEL1N2_INT1SEL_M << shiftVal)) | + ((uint16_t)intTrigger << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Enables continuous mode for an ADC interrupt. +//! +//! \param base is the base address of the ADC. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function enables continuous mode for the ADC interrupt passed into +//! \e adcIntNum. This means that pulses will be generated for the specified +//! ADC interrupt whenever an EOC pulse is generated irrespective of whether or +//! not the flag bit is set. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Enable continuous mode for the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) |= ADC_INTSEL1N2_INT1CONT << shiftVal; + + EDIS; +} + +//***************************************************************************** +// +//! Disables continuous mode for an ADC interrupt. +//! +//! \param base is the base address of the ADC. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function disables continuous mode for the ADC interrupt passed into +//! \e adcIntNum. This means that pulses will not be generated for the +//! specified ADC interrupt until the corresponding interrupt flag for the +//! previous interrupt occurrence has been cleared using +//! ADC_clearInterruptStatus(). +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Disable continuous mode for the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) &= ~(ADC_INTSEL1N2_INT1CONT << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Converts temperature from sensor reading to degrees C +//! +//! \param tempResult is the raw ADC A conversion result from the temp sensor. +//! \param vref is the reference voltage being used (for example 3.3 for 3.3V). +//! +//! This function converts temperature from temp sensor reading to degrees C. +//! Temp sensor values in production test are derived with 2.5V reference. +//! The \b vref argument in the function is used to scale the temp sensor +//! reading accordingly if temp sensor value is read at a different VREF +//! setting. +//! +//! \return Returns the temperature sensor reading converted to degrees C. +// +//***************************************************************************** +static inline int16_t +ADC_getTemperatureC(uint16_t tempResult, float32_t vref) +{ + int16_t tsOffset, tsSlope; + float32_t temp; + + // + // Check the device revision + // + if(HWREGH(DEVCFG_BASE + SYSCTL_O_REVID) >= 3) + { + // + // For production devices (Rev. C), pull the slope and offset from OTP + // +#ifdef __TMS320C28XX__ + + // + // Only accessible from the CPU. + // + tsSlope = (int16_t)ADC_getTempSlope(); + tsOffset = (int16_t)ADC_getTempOffset(); +#endif + } + else + { + // + // For pre-production devices, use these static values for slope + // and offset + // + tsSlope = 5196; + tsOffset = 1788; + } + + // + // The slope is stored as a Q15 fixed point number hence the need to + // to an integer. + // + temp = (((float32_t)tempResult * (vref / 2.5F)) - (float32_t)tsOffset) * + (float32_t)tsSlope; + return((int16_t)((((int32_t)temp + (int32_t)0x4000 + + ((int32_t)273 * (int32_t)0x8000)) / + (int32_t)0x8000) - (int32_t)273)); +} + +//***************************************************************************** +// +//! Converts temperature from sensor reading to degrees K +//! +//! \param tempResult is the raw ADC A conversion result from the temp sensor. +//! \param vref is the reference voltage being used (for example 3.3 for 3.3V). +//! +//! This function converts temperature from temp sensor reading to degrees K. +//! Temp sensor values in production test are derived with 2.5V reference. +//! The \b vref argument in the function is used to scale the temp sensor +//! reading accordingly if temp sensor value is read at a different VREF +//! setting. +//! +//! \return Returns the temperature sensor reading converted to degrees K. +// +//***************************************************************************** +static inline int16_t +ADC_getTemperatureK(uint16_t tempResult, float32_t vref) +{ + int16_t tsOffset, tsSlope; + float32_t temp; + + // + // Check the device revision + // + if(HWREGH(DEVCFG_BASE + SYSCTL_O_REVID) >= 3) + { + // + // For production devices (Rev. C), pull the slope and offset from OTP + // +#ifdef __TMS320C28XX__ + + // + // Only accessible from the CPU. + // + tsSlope = (int16_t)ADC_getTempSlope(); + tsOffset = (int16_t)ADC_getTempOffset(); +#endif + } + else + { + // + // For pre-production devices, use these static values for slope + // and offset + // + tsSlope = 5196; + tsOffset = 1788; + } + + // + // The slope is stored as a Q15 fixed point number hence the need to + // to an integer. + // + temp = (((float32_t)tempResult * (vref / 2.5F)) - (float32_t)tsOffset) * + (float32_t)tsSlope; + return((int16_t)(((int32_t)temp + (int32_t)0x4000 + ((int32_t)273 * + (int32_t)0x8000)) / (int32_t)0x8000)); +} + + +//***************************************************************************** +// +//! Configures the analog-to-digital converter resolution and signal mode. +//! +//! \param base is the base address of the ADC module. +//! \param resolution is the resolution of the converter (12 or 16 bits). +//! \param signalMode is the input signal mode of the converter. +//! +//! This function configures the ADC module's conversion resolution and input +//! signal mode and ensures that the corresponding trims are loaded. +//! +//! The \e resolution parameter specifies the resolution of the conversion. +//! It can be 12-bit or 16-bit specified by \b ADC_RESOLUTION_12BIT +//! or \b ADC_RESOLUTION_16BIT. +//! +//! The \e signalMode parameter specifies the signal mode. In single-ended +//! mode, which is indicated by \b ADC_MODE_SINGLE_ENDED, the input voltage is +//! sampled on a single pin referenced to VREFLO. In differential mode, which +//! is indicated by \b ADC_MODE_DIFFERENTIAL, the input voltage to the +//! converter is sampled on a pair of input pins, a positive and a negative. +//! +//! \b Note: In this device, single-ended signal conversions are supported +//! only in 12-bit resolution mode and differential signal +//! conversions are supported only in 16-bit resolution mode. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setMode(uint32_t base, ADC_Resolution resolution, + ADC_SignalMode signalMode); + + +//***************************************************************************** +// +//! Configures the offset trim for the desired ADC instance +//! +//! \param base is the base address of the ADC module. +//! +//! This function loads the offset trims for the desired ADC instance. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setOffsetTrim(uint32_t base); + +//***************************************************************************** +// +//! Configures the INL trim for the desired ADC instance +//! +//! \param base is the base address of the ADC module. +//! +//! This function loads the INL trims for the desired ADC instance. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setINLTrim(uint32_t base); + +//***************************************************************************** +// +//! Sets the windowed trip limits for a PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param tripHiLimit is the value is the digital comparator trip high limit. +//! \param tripLoLimit is the value is the digital comparator trip low limit. +//! +//! This function sets the windowed trip limits for a PPB. These values set +//! the digital comparator so that when one of the values is exceeded, either a +//! high or low trip event will occur. +//! +//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to +//! 4 inclusive that identifies a PPB to be configured. +//! +//! If using 16-bit mode, you may pass a 17-bit number into the \e tripHiLimit +//! and \e tripLoLimit parameters where the 17th bit is the sign bit (that is +//! a value from -65536 and 65535). In 12-bit mode, only bits 12:0 will be +//! compared against bits 12:0 of the PPB result. +//! +//! \note On some devices, signed trip values do not work properly. See the +//! silicon errata for details. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setPPBTripLimits(uint32_t base, ADC_PPBNumber ppbNumber, + int32_t tripHiLimit, int32_t tripLoLimit); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ADC_H diff --git a/gpio_bitfield_cpu2/device/driverlib/asysctl.c b/gpio_bitfield_cpu2/device/driverlib/asysctl.c new file mode 100644 index 0000000..4f3d202 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/asysctl.c @@ -0,0 +1,43 @@ +//########################################################################### +// +// FILE: asysctl.c +// +// TITLE: C28x Driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "asysctl.h" diff --git a/gpio_bitfield_cpu2/device/driverlib/asysctl.h b/gpio_bitfield_cpu2/device/driverlib/asysctl.h new file mode 100644 index 0000000..40e6c5c --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/asysctl.h @@ -0,0 +1,160 @@ +//########################################################################### +// +// FILE: asysctl.h +// +// TITLE: C28x driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef ASYSCTL_H +#define ASYSCTL_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup asysctl_api ASysCtl +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_asysctl.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "debug.h" +#include "cpu.h" + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Enable temperature sensor. +//! +//! This function enables the temperature sensor output to the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ASysCtl_enableTemperatureSensor(void) +{ + EALLOW; + + // + // Set the temperature sensor enable bit. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_TSNSCTL) |= ASYSCTL_TSNSCTL_ENABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Disable temperature sensor. +//! +//! This function disables the temperature sensor output to the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ASysCtl_disableTemperatureSensor(void) +{ + EALLOW; + + // + // Clear the temperature sensor enable bit. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_TSNSCTL) &= ~(ASYSCTL_TSNSCTL_ENABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the temperature sensor control register. +//! +//! \return None. +// +//***************************************************************************** +static inline void ASysCtl_lockTemperatureSensor(void) +{ + EALLOW; + + // + // Write a 1 to the lock bit in the LOCK register. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_LOCK) |= ASYSCTL_LOCK_TSNSCTL; + + EDIS; +} + + + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ASYSCTL_H diff --git a/gpio_bitfield_cpu2/device/driverlib/can.c b/gpio_bitfield_cpu2/device/driverlib/can.c new file mode 100644 index 0000000..5a33a50 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/can.c @@ -0,0 +1,1122 @@ +//########################################################################### +// +// FILE: can.c +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#include "can.h" + +//***************************************************************************** +// +// CAN_initModule +// +//***************************************************************************** +void +CAN_initModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Place CAN controller in init state, regardless of previous state. This + // will put controller in idle, and allow the message object RAM to be + // programmed. + // + HWREGH(base + CAN_O_CTL) |= ((uint16_t)CAN_CTL_INIT | + (uint16_t)CAN_INIT_PARITY_DISABLE); + + // + // Initialize the message RAM before using it. + // + CAN_initRAM(base); + + // + // Force module to reset state + // + + HWREGH(base + CAN_O_CTL) |= CAN_CTL_SWR; + + // + // Delay for 14 cycles + // + SysCtl_delay(1U); + + // + // Enable write access to the configuration registers + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_CCE; +} + +//***************************************************************************** +// +// CAN_setBitRate +// +//***************************************************************************** +void +CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate, + uint16_t bitTime) +{ + uint16_t brp; + uint16_t tPhase; + uint16_t phaseSeg2; + uint16_t tSync = 1U; + uint16_t tProp = 2U; + uint16_t tSeg1; + uint16_t tSeg2; + uint16_t sjw; + uint16_t prescaler; + uint16_t prescalerExtension; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((bitTime > 7U) && (bitTime < 26U)); + ASSERT(bitRate <= 1000000U); + + // + // Calculate bit timing values + // + brp = (uint16_t)(clockFreq / (bitRate * bitTime)); + tPhase = bitTime - (tSync + tProp); + if((tPhase / 2U) <= 8U) + { + phaseSeg2 = tPhase / 2U; + } + else + { + phaseSeg2 = 8U; + } + tSeg1 = ((tPhase - phaseSeg2) + tProp) - 1U; + tSeg2 = phaseSeg2 - 1U; + if(phaseSeg2 > 4U) + { + sjw = 3U; + } + else + { + sjw = tSeg2; + } + prescalerExtension = ((brp - 1U) / 64U); + prescaler = ((brp - 1U) % 64U); + + // + // Set the calculated timing parameters + // + CAN_setBitTiming(base, prescaler, prescalerExtension, tSeg1, tSeg2, sjw); +} + +//***************************************************************************** +// +// CAN_setBitTiming +// +//***************************************************************************** +void +CAN_setBitTiming(uint32_t base, uint16_t prescaler, + uint16_t prescalerExtension, uint16_t tSeg1, uint16_t tSeg2, + uint16_t sjw) +{ + uint16_t savedInit; + uint32_t bitReg; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT(prescaler < 64U); + ASSERT((tSeg1 > 0U) && (tSeg1 < 16U)); + ASSERT(tSeg2 < 8U); + ASSERT(sjw < 4U); + ASSERT(prescalerExtension < 16U); + + // + // To set the bit timing register, the controller must be placed in init + // mode (if not already), and also configuration change bit enabled. + // State of the init bit should be saved so it can be restored at the end. + // + savedInit = HWREGH(base + CAN_O_CTL); + HWREGH(base + CAN_O_CTL) = savedInit | CAN_CTL_INIT | CAN_CTL_CCE; + + // + // Set the bit fields of the bit timing register + // + bitReg = (uint32_t)((uint32_t)prescaler & CAN_BTR_BRP_M); + bitReg |= (uint32_t)(((uint32_t)sjw << CAN_BTR_SJW_S) & CAN_BTR_SJW_M); + bitReg |= (uint32_t)(((uint32_t)tSeg1 << CAN_BTR_TSEG1_S) & + CAN_BTR_TSEG1_M); + bitReg |= (uint32_t)(((uint32_t)tSeg2 << CAN_BTR_TSEG2_S) & + CAN_BTR_TSEG2_M); + bitReg |= (uint32_t)(((uint32_t)prescalerExtension << CAN_BTR_BRPE_S) & + CAN_BTR_BRPE_M); + + HWREG_BP(base + CAN_O_BTR) = bitReg; + + // + // Clear the config change bit, and restore the init bit. + // + savedInit &= ~((uint16_t)CAN_CTL_CCE); + + HWREGH(base + CAN_O_CTL) = savedInit; +} + + +//***************************************************************************** +// +// CAN_clearInterruptStatus +// +//***************************************************************************** +void +CAN_clearInterruptStatus(uint32_t base, uint32_t intClr) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intClr == CAN_INT_INT0ID_STATUS) || + ((intClr >= 1U) && (intClr <= 32U))); + + if(intClr == (uint32_t)CAN_INT_INT0ID_STATUS) + { + // + // Simply read and discard the status to clear the interrupt. + // + HWREGH(base + CAN_O_ES); + } + else + { + // + // Wait to be sure that this interface is not busy. + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == + CAN_IF1CMD_BUSY) + { + } + + // + // Only change the interrupt pending state by setting only the + // CAN_IF1CMD_CLRINTPND bit. + // + // Send the clear pending interrupt command to the CAN controller. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CLRINTPND | + (intClr & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait to be sure that this interface is not busy. + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == + CAN_IF1CMD_BUSY) + { + } + } +} + +//***************************************************************************** +// +// CAN_setupMessageObject +// +//***************************************************************************** +void +CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID, + CAN_MsgFrameType frame, CAN_MsgObjType msgType, + uint32_t msgIDMask, uint32_t flags, uint16_t msgLen) +{ + uint32_t cmdMaskReg = 0U; + uint32_t maskReg = 0U; + uint32_t arbReg = 0U; + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + switch(msgType) + { + // + // Transmit message object. + // + case CAN_MSG_OBJ_TYPE_TX: + { + // + // Set message direction to transmit. + // + arbReg = CAN_IF1ARB_DIR; + break; + } + + // + // Remote frame receive remote, with auto-transmit message object. + // + case CAN_MSG_OBJ_TYPE_RXTX_REMOTE: + { + // + // Set message direction to Tx for remote receivers. + // + arbReg = CAN_IF1ARB_DIR; + + // + // Set this object to auto answer if a matching identifier is seen. + // + msgCtrl = (uint32_t)((uint32_t)CAN_IF1MCTL_RMTEN | + (uint32_t)CAN_IF1MCTL_UMASK); + + break; + } + + // + // Transmit remote request message object (CAN_MSG_OBJ_TYPE_TX_REMOTE) + // or Receive message object (CAN_MSG_OBJ_TYPE_RX). + // + default: + { + // + // Set message direction to read. + // + arbReg = 0U; + + break; + } + } + + // + // Set values based on Extended Frame or Standard Frame + // + if(frame == CAN_MSG_FRAME_EXT) + { + // + // Configure the Mask Registers for 29 bit Identifier mask. + // + if((flags & CAN_MSG_OBJ_USE_ID_FILTER) == CAN_MSG_OBJ_USE_ID_FILTER) + { + maskReg = msgIDMask & CAN_IF1MSK_MSK_M; + } + + // + // Set the 29 bit version of the Identifier for this message + // object. Mark the message as valid and set the extended ID bit. + // + arbReg |= (msgID & CAN_IF1ARB_ID_M) | CAN_IF1ARB_MSGVAL | + CAN_IF1ARB_XTD; + } + else + { + // + // Configure the Mask Registers for 11 bit Identifier mask. + // + if((flags & CAN_MSG_OBJ_USE_ID_FILTER) == CAN_MSG_OBJ_USE_ID_FILTER) + { + maskReg = ((msgIDMask << CAN_IF1ARB_STD_ID_S) & + CAN_IF1ARB_STD_ID_M); + } + + // + // Set the 11 bit version of the Identifier for this message + // object. The lower 18 bits are set to zero. Mark the message as + // valid. + // + arbReg |= ((msgID << CAN_IF1ARB_STD_ID_S) & CAN_IF1ARB_STD_ID_M) | + CAN_IF1ARB_MSGVAL; + } + + // + // If the caller wants to filter on the extended ID bit then set it. + // + maskReg |= (flags & CAN_MSG_OBJ_USE_EXT_FILTER); + + // + // The caller wants to filter on the message direction field. + // + maskReg |= (flags & CAN_MSG_OBJ_USE_DIR_FILTER); + + // + // If any filtering is requested, set the UMASK bit to use mask register + // + if(((flags & CAN_MSG_OBJ_USE_ID_FILTER) | + (flags & CAN_MSG_OBJ_USE_DIR_FILTER) | + (flags & CAN_MSG_OBJ_USE_EXT_FILTER)) != 0U) + { + msgCtrl |= CAN_IF1MCTL_UMASK; + } + + // + // Set the data length for the transfers. This is applicable only for + // Tx mailboxes. For Rx mailboxes, dlc is updated on receving a frame. + // + if((msgType == CAN_MSG_OBJ_TYPE_TX) || + (msgType == CAN_MSG_OBJ_TYPE_RXTX_REMOTE)) + { + msgCtrl |= ((uint32_t)msgLen & CAN_IF1MCTL_DLC_M); + } + + // + // If this is a single transfer or the last mailbox of a FIFO, set EOB bit. + // If this is not the last entry in a FIFO, leave the EOB bit as 0. + // + if((flags & CAN_MSG_OBJ_FIFO) == 0U) + { + msgCtrl |= CAN_IF1MCTL_EOB; + } + + // + // Enable transmit interrupts if they should be enabled. + // + msgCtrl |= (flags & CAN_MSG_OBJ_TX_INT_ENABLE); + + // + // Enable receive interrupts if they should be enabled. + // + msgCtrl |= (flags & CAN_MSG_OBJ_RX_INT_ENABLE); + + // + // Set the Control, Arb, and Mask bit so that they get transferred to the + // Message object. + // + cmdMaskReg |= CAN_IF1CMD_ARB; + cmdMaskReg |= CAN_IF1CMD_CONTROL; + cmdMaskReg |= CAN_IF1CMD_MASK; + cmdMaskReg |= CAN_IF1CMD_DIR; + + // + // Write out the registers to program the message object. + // + HWREG_BP(base + CAN_O_IF1MSK) = maskReg; + HWREG_BP(base + CAN_O_IF1ARB) = arbReg; + HWREG_BP(base + CAN_O_IF1MCTL) = msgCtrl; + + // + // Transfer data to message object RAM + // + HWREG_BP(base + CAN_O_IF1CMD) = + cmdMaskReg | (objID & CAN_IF1CMD_MSG_NUM_M); +} + +//***************************************************************************** +// +// CAN_sendMessage +// +//***************************************************************************** +void +CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_16bit +// +//***************************************************************************** +void +CAN_sendMessage_16bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg_16bit(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_32bit +// +//***************************************************************************** +void +CAN_sendMessage_32bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint32_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg_32bit(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_updateDLC +// +//***************************************************************************** +void +CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Update to the new data length + // + msgCtrl &= ~CAN_IF1MCTL_DLC_M; + msgCtrl |= (msgLen & CAN_IF1MCTL_DLC_M); + + // + // Write out to the register to program the message object + // + HWREG_BP(base + CAN_O_IF1MCTL) = msgCtrl; + + // + // Transfer data to message object RAM + // + HWREG_BP(base + CAN_O_IF1CMD) = + (CAN_IF1CMD_CONTROL | CAN_IF1CMD_DIR | (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendRemoteRequestMessage +// +//***************************************************************************** +void +CAN_sendRemoteRequestMessage(uint32_t base, uint32_t objID) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check configured DLC size with 0 as this is a remote frame + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == 0U); + + // + // Set Direction to write + // + // Set Tx Request Bit for this remote frame + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_readMessage +// +//***************************************************************************** +bool +CAN_readMessage(uint32_t base, uint32_t objID, + uint16_t *msgData) +{ + bool status; + uint16_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID != 0U)); + + // + // Set the Message Data A, Data B, and control values to be read + // on request for data from the message object. + // + // Transfer the message object to the message object IF register. + // + HWREG_BP(base + CAN_O_IF2CMD) = + ((uint32_t)CAN_IF2CMD_DATA_A | (uint32_t)CAN_IF2CMD_DATA_B | + (uint32_t)CAN_IF2CMD_CONTROL | (objID & CAN_IF2CMD_MSG_NUM_M) | + (uint32_t)CAN_IF2CMD_ARB); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY) == CAN_IF2CMD_BUSY) + { + } + + // + // Read out the IF control Register. + // + msgCtrl = HWREGH(base + CAN_O_IF2MCTL); + + // + // See if there is new data available. + // + if((msgCtrl & CAN_IF2MCTL_NEWDAT) == CAN_IF2MCTL_NEWDAT) + { + // + // Read out the data from the CAN registers. + // + CAN_readDataReg(msgData, (base + CAN_O_IF2DATA), + ((uint32_t)msgCtrl & CAN_IF2MCTL_DLC_M)); + + status = true; + + // + // Now clear out the new data flag + // + HWREG_BP(base + CAN_O_IF2CMD) = ((uint32_t)CAN_IF2CMD_TXRQST | + (objID & CAN_IF2CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY) == + CAN_IF2CMD_BUSY) + { + } + } + else + { + status = false; + } + + return(status); +} + +//***************************************************************************** +// +// CAN_readMessageWithID +// +//***************************************************************************** +bool CAN_readMessageWithID(uint32_t base, + uint32_t objID, + CAN_MsgFrameType *frameType, + uint32_t *msgID, + uint16_t *msgData) +{ + bool status; + + // + // Check the pointers. + // + ASSERT(msgID != 0U); + ASSERT(frameType != 0U); + + // + //Read the message first this fills the IF2 registers + //with received message for that mailbox + // + status = CAN_readMessage(base, objID, msgData); + // + // See if there is new data available. + // + if(status) + { + if((HWREG_BP(base + CAN_O_IF2ARB) & CAN_IF2ARB_XTD) != 0U) + { + *frameType = CAN_MSG_FRAME_EXT; + *msgID = ((HWREG_BP(base + CAN_O_IF2ARB)) & CAN_IF2ARB_ID_M); + } + else + { + *frameType = CAN_MSG_FRAME_STD; + *msgID = (((HWREG_BP(base + CAN_O_IF2ARB)) & + CAN_IF2ARB_STD_ID_M) >> + CAN_IF2ARB_STD_ID_S); + } + } + + return(status); +} + +//***************************************************************************** +// +// CAN_transferMessage +// +//***************************************************************************** +void +CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID, + bool direction) +{ + uint32_t cmdMaskReg; + + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + ASSERT((interface == 1U) || (interface == 2U)); + + // + // This is always a read to the Message object as this call is setting a + // message object. + // + cmdMaskReg = + ((uint32_t)CAN_IF1CMD_DATA_A | (uint32_t)CAN_IF1CMD_DATA_B | + (uint32_t)CAN_IF1CMD_TXRQST | (uint32_t)CAN_IF1CMD_CONTROL | + (uint32_t)CAN_IF1CMD_MASK | (uint32_t)CAN_IF1CMD_ARB) | + (direction ? CAN_IF1CMD_DIR : 0U); + + // + // Ensure this IF isn't busy + // + while((HWREGH(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) & + CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Set up the request for data from the message object. Transfer the + // message object to the message object specified by objID. + // + HWREG_BP(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) = + (cmdMaskReg | (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) & + CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } +} + +//***************************************************************************** +// +// CAN_clearMessage +// +//***************************************************************************** +void +CAN_clearMessage(uint32_t base, uint32_t objID) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_disableMessageObject +// +//***************************************************************************** +void +CAN_disableMessageObject(uint32_t base, uint32_t objID) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_disableAllMessageObjects +// +//***************************************************************************** +void +CAN_disableAllMessageObjects(uint32_t base) +{ + uint32_t objID; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Loop to disable all valid message objects + // + for(objID = 0x01UL; objID <= 0x20UL; objID++) + { + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); + } +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/can.h b/gpio_bitfield_cpu2/device/driverlib/can.h new file mode 100644 index 0000000..247d1df --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/can.h @@ -0,0 +1,1924 @@ +//########################################################################### +// +// FILE: can.h +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef CAN_H +#define CAN_H + + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup can_api CAN +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_can.h" +#include "debug.h" +#include "sysctl.h" + +// +// The key value for RAM initialization +// +#define CAN_RAM_INIT_KEY (0xAU) + +// +// RAM Initialization Register Mask +// +#define CAN_RAM_INIT_MASK (0x003FU) + +// +// The Parity disable key value +// +#define CAN_INIT_PARITY_DISABLE (0x1400U) + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** +//***************************************************************************** +// +// These are the flags used by the flags parameter when calling +// the CAN_setupMessageObject() function. +// +//***************************************************************************** + +//! This indicates that transmit interrupts should be enabled, or are enabled. +#define CAN_MSG_OBJ_TX_INT_ENABLE CAN_IF1MCTL_TXIE + +//! This indicates that receive interrupts should be enabled, or are +//! enabled. +#define CAN_MSG_OBJ_RX_INT_ENABLE CAN_IF1MCTL_RXIE + +//! This indicates that a message object will use or is using filtering +//! based on the object's message identifier. +#define CAN_MSG_OBJ_USE_ID_FILTER (0x00000001U) + +//! This indicates that a message object will use or is using filtering +//! based on the direction of the transfer. +#define CAN_MSG_OBJ_USE_DIR_FILTER CAN_IF1MSK_MDIR + +//! This indicates that a message object will use or is using message +//! identifier filtering based on the extended identifier. +#define CAN_MSG_OBJ_USE_EXT_FILTER CAN_IF1MSK_MXTD + +//! This indicates that this message object is part of a FIFO structure and +//! not the final message object in a FIFO. +#define CAN_MSG_OBJ_FIFO (0x00000002U) + +//! This indicates that a message object has no flags set. +#define CAN_MSG_OBJ_NO_FLAGS (0x00000000U) + +//***************************************************************************** +// +// These definitions are used to specify interrupt sources to +// CAN_enableInterrupt() and CAN_disableInterrupt(). +// +//***************************************************************************** +//! This flag is used to allow a CAN controller to generate error +//! interrupts. +#define CAN_INT_ERROR (0x00000008UL) + +//! This flag is used to allow a CAN controller to generate status +//! interrupts. +#define CAN_INT_STATUS (0x00000004UL) + +//! This flag is used to allow a CAN controller to generate interrupts +//! on interrupt line 0 +#define CAN_INT_IE0 (0x00000002UL) + +//! This flag is used to allow a CAN controller to generate interrupts +//! on interrupt line 1 +#define CAN_INT_IE1 (0x00020000UL) + +//***************************************************************************** +// +// The following definitions contain all error or status indicators that can +// be returned when calling the CAN_getStatus() function. +// +//***************************************************************************** + +//! CAN controller has detected a parity error. +#define CAN_STATUS_PERR (0x00000100U) + +//! CAN controller has entered a Bus Off state. +#define CAN_STATUS_BUS_OFF (0x00000080U) + +//! CAN controller error level has reached warning level. +#define CAN_STATUS_EWARN (0x00000040U) + +//! CAN controller error level has reached error passive level. +#define CAN_STATUS_EPASS (0x00000020U) + +//! A message was received successfully since the last read of this status. +#define CAN_STATUS_RXOK (0x00000010U) + +//! A message was transmitted successfully since the last read of this +//! status. +#define CAN_STATUS_TXOK (0x00000008U) + +//! This is the mask for the last error code field. +#define CAN_STATUS_LEC_MSK (0x00000007U) + +//! There was no error. +#define CAN_STATUS_LEC_NONE (0x00000000U) + +//! A bit stuffing error has occurred. +#define CAN_STATUS_LEC_STUFF (0x00000001U) + +//! A formatting error has occurred. +#define CAN_STATUS_LEC_FORM (0x00000002U) + +//! An acknowledge error has occurred. +#define CAN_STATUS_LEC_ACK (0x00000003U) + +//! The bus remained a bit level of 1 for longer than is allowed. +#define CAN_STATUS_LEC_BIT1 (0x00000004U) + +//! The bus remained a bit level of 0 for longer than is allowed. +#define CAN_STATUS_LEC_BIT0 (0x00000005U) + +//! A CRC error has occurred. +#define CAN_STATUS_LEC_CRC (0x00000006U) + +//***************************************************************************** +// +// The following macros are added for the Global Interrupt EN/FLG/CLR +// register +// +//***************************************************************************** +//! CANINT0 global interrupt bit +#define CAN_GLOBAL_INT_CANINT0 (0x00000001U) + +//! CANINT1 global interrupt bit +#define CAN_GLOBAL_INT_CANINT1 (0x00000002U) + +//***************************************************************************** +// +// The following macros are added for accessing the interrupt register and +// the standard arbitration ID in the interface registers. +// +//***************************************************************************** +//! Status of INT0ID +#define CAN_INT_INT0ID_STATUS (0x8000U) + +//! IF1 Arbitration Standard ID Shift Offset +#define CAN_IF1ARB_STD_ID_S (18U) + +//! IF1 Arbitration Standard ID Mask +#define CAN_IF1ARB_STD_ID_M (0x1FFC0000U) + +//! IF2 Arbitration Standard ID Shift Offset +#define CAN_IF2ARB_STD_ID_S (18U) + +//! IF2 Arbitration Standard ID Mask +#define CAN_IF2ARB_STD_ID_M (0x1FFC0000U) + +#endif // DOXYGEN_PDF_IGNORE + +//***************************************************************************** +// +//! This data type is used to decide between STD_ID or EXT_ID for a mailbox. +//! This is used when calling the CAN_setupMessageObject() function. +// +//***************************************************************************** +typedef enum +{ + //! Set the message ID frame to standard. + CAN_MSG_FRAME_STD, + + //! Set the message ID frame to extended. + CAN_MSG_FRAME_EXT +} CAN_MsgFrameType; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CAN_setupMessageObject() API. +// +//***************************************************************************** +typedef enum +{ + //! Transmit message object. + CAN_MSG_OBJ_TYPE_TX, + + //! Transmit remote request message object + CAN_MSG_OBJ_TYPE_TX_REMOTE, + + //! Receive message object. + CAN_MSG_OBJ_TYPE_RX, + + //! Remote frame receive remote, with auto-transmit message object. + CAN_MSG_OBJ_TYPE_RXTX_REMOTE +} CAN_MsgObjType; + +//***************************************************************************** +// +//! This definition is used to determine the clock source that will +//! be set up via a call to the CAN_selectClockSource() API. +// +//***************************************************************************** +typedef enum +{ + //! Peripheral System Clock Source + CAN_CLOCK_SOURCE_SYS = 0x0, + + //! External Oscillator Clock Source + CAN_CLOCK_SOURCE_XTAL = 0x1, + + //! Auxiliary Clock Input Source + CAN_CLOCK_SOURCE_AUX = 0x2 +} CAN_ClockSource; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! +//! Checks a CAN base address. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function determines if a CAN controller base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CAN_isBaseValid(uint32_t base) +{ + return( + (base == CANA_BASE) || + (base == CANB_BASE) + ); +} +#endif + + +//***************************************************************************** +// +//! \internal +//! +//! Copies data from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_writeDataReg(const uint16_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = data[idx]; + + dataReg++; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Copies data (all 16bits) from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** + +static inline void +CAN_writeDataReg_16bit(const uint16_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = (uint32_t)((data[idx / 2UL]) >> ((idx % 2UL) * 8UL)); + + dataReg++; + } +} + + +//***************************************************************************** +// +//! \internal +//! +//! Copies data (all 32bits) from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** + +static inline void +CAN_writeDataReg_32bit(const uint32_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = ((data[idx / 4UL]) >> ((idx % 4UL) * 8UL)); + + dataReg++; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Copies data from the CAN Data registers to a buffer. +//! +//! \param data is a pointer to the location to store the data read from the +//! CAN controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 1, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy from the CAN controller. +//! +//! This function takes the steps necessary to copy data to a contiguous buffer +//! in memory from the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_readDataReg(uint16_t *data, const uint32_t address, uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Read out the data + // + data[idx] = HWREGB(dataReg); + + dataReg++; + } +} + +//***************************************************************************** +// +//! Initializes the CAN controller's RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Performs the initialization of the RAM used for the CAN message objects. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_initRAM(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + HWREGH(base + CAN_O_RAM_INIT) = CAN_RAM_INIT_CAN_RAM_INIT | + CAN_RAM_INIT_KEY; + + while(!((HWREGH(base + CAN_O_RAM_INIT) & CAN_RAM_INIT_MASK) == + (CAN_RAM_INIT_RAM_INIT_DONE | CAN_RAM_INIT_KEY2 | + CAN_RAM_INIT_KEY0))) + { + // + // Wait until RAM Init is complete + // + } +} + +//***************************************************************************** +// +//! Select CAN Clock Source +//! +//! \param base is the base address of the CAN controller. +//! \param source is the clock source to use for the CAN controller. +//! +//! This function selects the specified clock source for the CAN controller. +//! +//! The \e source parameter can be any one of the following: +//! - \b CAN_CLOCK_SOURCE_SYS - Peripheral System Clock +//! - \b CAN_CLOCK_SOURCE_XTAL - External Oscillator +//! - \b CAN_CLOCK_SOURCE_AUX - Auxiliary Clock Input from GPIO +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_selectClockSource(uint32_t base, CAN_ClockSource source) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Determine the CAN controller and set specified clock source + // + EALLOW; + + switch(base) + { + case CANA_BASE: + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~SYSCTL_CLKSRCCTL2_CANABCLKSEL_M) | + ((uint16_t)source << SYSCTL_CLKSRCCTL2_CANABCLKSEL_S); + break; + + case CANB_BASE: + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~SYSCTL_CLKSRCCTL2_CANBBCLKSEL_M) | + ((uint16_t)source << SYSCTL_CLKSRCCTL2_CANBBCLKSEL_S); + break; + + default: + + // + // Do nothing. Not a valid mode value. + // + break; + } + + EDIS; + SYSCTL_CLKSRCCTL_DELAY; +} + +//***************************************************************************** +// +//! Starts the CAN Module's Operations +//! +//! \param base is the base address of the CAN controller. +//! +//! This function starts the CAN module's operations after initialization, +//! which includes the CAN protocol controller state machine of the CAN core +//! and the message handler state machine to begin controlling the CAN's +//! internal data flow. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_startModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear Init and CCE bits + // + HWREGH(base + CAN_O_CTL) &= ~(CAN_CTL_INIT | CAN_CTL_CCE); +} + +//***************************************************************************** +// +//! Enables the CAN controller. +//! +//! \param base is the base address of the CAN controller to enable. +//! +//! Enables the CAN controller for message processing. Once enabled, the +//! controller will automatically transmit any pending frames, and process any +//! received frames. The controller can be stopped by calling +//! CAN_disableController(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableController(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the init bit in the control register. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_INIT; +} + +//***************************************************************************** +// +//! Disables the CAN controller. +//! +//! \param base is the base address of the CAN controller to disable. +//! +//! Disables the CAN controller for message processing. When disabled, the +//! controller will no longer automatically process data on the CAN bus. The +//! controller can be restarted by calling CAN_enableController(). The state +//! of the CAN controller and the message objects in the controller are left as +//! they were before this call was made. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableController(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the init bit in the control register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_INIT; +} + +//***************************************************************************** +// +//! Enables the test modes of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! \param mode are the the test modes to enable. +//! +//! Enables test modes within the controller. The following valid options for +//! \e mode can be OR'ed together: +//! - \b CAN_TEST_SILENT - Silent Mode +//! - \b CAN_TEST_LBACK - Loopback Mode +//! - \b CAN_TEST_EXL - External Loopback Mode +//! +//! \note Loopback mode and external loopback mode \b can \b not be +//! enabled at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableTestMode(uint32_t base, uint16_t mode) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((mode & (CAN_TEST_LBACK | CAN_TEST_EXL)) != + (CAN_TEST_LBACK | CAN_TEST_EXL)); + + // + // Clear the bits in the test register. + // + HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT | + (uint16_t)CAN_TEST_LBACK | + (uint16_t)CAN_TEST_EXL); + + // + // Enable test mode and set the bits in the test register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_TEST; + HWREGH(base + CAN_O_TEST) |= mode; +} + +//***************************************************************************** +// +//! Disables the test modes of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables test modes within the controller and clears the test bits. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableTestMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the bits in the test register. + // + HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT | + (uint16_t)CAN_TEST_LBACK | + (uint16_t)CAN_TEST_EXL); + + // + // Clear the test mode enable bit + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_TEST; +} + +//***************************************************************************** +// +//! Get the current settings for the CAN controller bit timing. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function reads the current configuration of the CAN controller bit +//! clock timing. +//! +//! \return Returns the value of the bit timing register. +// +//***************************************************************************** +static inline uint32_t +CAN_getBitTiming(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read and return BTR register + // + return(HWREG_BP(base + CAN_O_BTR)); +} + +//***************************************************************************** +// +//! Enables direct access to the RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables direct access to the RAM while in Test mode. +//! +//! \note Test Mode must first be enabled to use this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableMemoryAccessMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the RAM direct access bit + // + HWREGH(base + CAN_O_TEST) |= CAN_TEST_RDA; +} + +//***************************************************************************** +// +//! Disables direct access to the RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables direct access to the RAM while in Test mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableMemoryAccessMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the RAM direct access bit + // + HWREGH(base + CAN_O_TEST) &= ~CAN_TEST_RDA; +} + +//***************************************************************************** +// +//! Sets the interruption debug mode of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! \param enable is a flag to enable or disable the interruption debug mode. +//! +//! This function sets the interruption debug mode of the CAN controller. When +//! the \e enable parameter is \b true, CAN will be configured to interrupt any +//! transmission or reception and enter debug mode immediately after it is +//! requested. When \b false, CAN will wait for a started transmission or +//! reception to be completed before entering debug mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setInterruptionDebugMode(uint32_t base, bool enable) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + if(enable) + { + // + // Enable interrupt debug support + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_IDS; + } + else + { + // + // Disable interrupt debug support + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_IDS; + } +} + + +//***************************************************************************** +// +//! Disables Auto-Bus-On. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables the Auto-Bus-On feature of the CAN controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableAutoBusOn(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the ABO bit in the control register. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_ABO; +} + +//***************************************************************************** +// +//! Enables Auto-Bus-On. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables the Auto-Bus-On feature of the CAN controller. Be sure to also +//! configure the Auto-Bus-On time using the CAN_setAutoBusOnTime function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableAutoBusOn(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the ABO bit in the control register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_ABO; +} + +//***************************************************************************** +// +//! Sets the time before a Bus-Off recovery sequence is started. +//! +//! \param base is the base address of the CAN controller. +//! \param onTime is number of clock cycles before a Bus-Off recovery sequence +//! is started. +//! +//! This function sets the number of clock cycles before a Bus-Off recovery +//! sequence is started by clearing the Init bit. +//! +//! \note To enable this functionality, use CAN_enableAutoBusOn(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setAutoBusOnTime(uint32_t base, uint32_t onTime) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set bus-off timer value + // + HWREG_BP(base + CAN_O_ABOTR) = onTime; +} + +//***************************************************************************** +// +//! Enables individual CAN controller interrupt sources. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables specific interrupt sources of the CAN controller. Only enabled +//! sources will cause a processor interrupt. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_INT_ERROR - a controller error condition has occurred +//! - \b CAN_INT_STATUS - a message transfer has completed, or a bus error has +//! been detected +//! - \b CAN_INT_IE0 - allow CAN controller to generate interrupts on interrupt +//! line 0 +//! - \b CAN_INT_IE1 - allow CAN controller to generate interrupts on interrupt +//! line 1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 | + CAN_INT_IE1)) == 0U); + + // + // Enable the specified interrupts. + // + HWREG_BP(base + CAN_O_CTL) |= intFlags; +} + +//***************************************************************************** +// +//! Disables individual CAN controller interrupt sources. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the specified CAN controller interrupt sources. Only enabled +//! interrupt sources can cause a processor interrupt. +//! +//! The \e intFlags parameter has the same definition as in the +//! CAN_enableInterrupt() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 | + CAN_INT_IE1)) == 0U); + + // + // Disable the specified interrupts. + // + HWREG_BP(base + CAN_O_CTL) &= ~(intFlags); +} + +//***************************************************************************** +// +//! Get the CAN controller Interrupt Line set for each mailbox +//! +//! \param base is the base address of the CAN controller. +//! +//! Gets which interrupt line each message object should assert when an +//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits +//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that +//! are asserted indicate the message object should generate an interrupt on +//! interrupt line 1, while bits that are not asserted indicate the message +//! object should generate an interrupt on line 0. +//! +//! \return Returns the value of the interrupt muxing register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptMux(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Get the interrupt muxing for the CAN peripheral + // + return(HWREG_BP(base + CAN_O_IP_MUX21)); +} + +//***************************************************************************** +// +//! Set the CAN controller Interrupt Line for each mailbox +//! +//! \param base is the base address of the CAN controller. +//! \param mux bit packed representation of which message objects should +//! generate an interrupt on a given interrupt line. +//! +//! Selects which interrupt line each message object should assert when an +//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits +//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that +//! are asserted indicate the message object should generate an interrupt on +//! interrupt line 1, while bits that are not asserted indicate the message +//! object should generate an interrupt on line 0. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setInterruptMux(uint32_t base, uint32_t mux) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the interrupt muxing for the CAN peripheral + // + HWREG_BP(base + CAN_O_IP_MUX21) = mux; +} + +//***************************************************************************** +// +//! Enables the CAN controller automatic retransmission behavior. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables the automatic retransmission of messages with detected errors. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableRetry(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clearing the DAR bit tells the controller to not disable the + // auto-retry of messages which were not transmitted or received + // correctly. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_DAR; +} + +//***************************************************************************** +// +//! Disables the CAN controller automatic retransmission behavior. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables the automatic retransmission of messages with detected errors. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableRetry(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Setting the DAR bit tells the controller to disable the auto-retry + // of messages which were not transmitted or received correctly. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_DAR; +} + +//***************************************************************************** +// +//! Returns the current setting for automatic retransmission. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the current setting for the automatic retransmission in the CAN +//! controller and returns it to the caller. +//! +//! \return Returns \b true if automatic retransmission is enabled, \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +CAN_isRetryEnabled(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read the disable automatic retry setting from the CAN controller. + // + return((bool)((HWREGH(base + CAN_O_CTL) & CAN_CTL_DAR) != CAN_CTL_DAR)); +} + +//***************************************************************************** +// +//! Reads the CAN controller error counter register. +//! +//! \param base is the base address of the CAN controller. +//! \param rxCount is a pointer to storage for the receive error counter. +//! \param txCount is a pointer to storage for the transmit error counter. +//! +//! Reads the error counter register and returns the transmit and receive error +//! counts to the caller along with a flag indicating if the controller receive +//! counter has reached the error passive limit. The values of the receive and +//! transmit error counters are returned through the pointers provided as +//! parameters. +//! +//! After this call, \e rxCount will hold the current receive error count +//! and \e txCount will hold the current transmit error count. +//! +//! \return Returns \b true if the receive error count has reached the error +//! passive limit, and \b false if the error count is below the error passive +//! limit. +// +//***************************************************************************** +static inline bool +CAN_getErrorCount(uint32_t base, uint32_t *rxCount, uint32_t *txCount) +{ + uint32_t canError = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read the current count of transmit/receive errors. + // + canError = HWREG_BP(base + CAN_O_ERRC); + + // + // Extract the error numbers from the register value. + // + *rxCount = (canError & CAN_ERRC_REC_M) >> CAN_ERRC_REC_S; + *txCount = (canError & CAN_ERRC_TEC_M) >> CAN_ERRC_TEC_S; + + return((bool)((canError & CAN_ERRC_RP) != 0U)); +} + +//***************************************************************************** +// +//! Reads the CAN controller error and status register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the error and status register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint16_t +CAN_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return error and status register value + // + return(HWREGH(base + CAN_O_ES)); +} + +//***************************************************************************** +// +//! Reads the CAN controller TX request register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the TX request register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getTxRequests(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return Tx requests register value + // + return(HWREG_BP(base + CAN_O_TXRQ_21)); +} + +//***************************************************************************** +// +//! Reads the CAN controller new data status register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the new data status register of the CAN controller for all message +//! objects. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getNewDataFlags(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return new data register value + // + return(HWREG_BP(base + CAN_O_NDAT_21)); +} + +//***************************************************************************** +// +//! Reads the CAN controller valid message object register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the valid message object register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getValidMessageObjects(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return the valid message register value + // + return(HWREG_BP(base + CAN_O_MVAL_21)); +} + +//***************************************************************************** +// +//! Get the CAN controller interrupt cause. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function returns the value of the interrupt register that indicates +//! the cause of the interrupt. +//! +//! \return Returns the value of the interrupt register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptCause(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read interrupt identifier status + // + return(HWREG_BP(base + CAN_O_INT)); +} + +//***************************************************************************** +// +//! Get the CAN controller pending interrupt message source. +//! +//! \param base is the base address of the CAN controller. +//! +//! Returns the value of the pending interrupts register that indicates +//! which messages are the source of pending interrupts. +//! +//! \return Returns the value of the pending interrupts register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptMessageSource(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read message object interrupt status + // + return(HWREG_BP(base + CAN_O_IPEN_21)); +} + +//***************************************************************************** +// +//! CAN Global interrupt Enable function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables specific CAN interrupt in the global interrupt enable register +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt Enable bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt Enable bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableGlobalInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Enable the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_EN) |= intFlags; +} + +//***************************************************************************** +// +//! CAN Global interrupt Disable function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the specific CAN interrupt in the global interrupt enable register +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableGlobalInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Disable the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_EN) &= ~intFlags; +} + +//***************************************************************************** +// +//! CAN Global interrupt Clear function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be cleared. +//! +//! Clear the specific CAN interrupt bit in the global interrupt flag register. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_clearGlobalInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Clear the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_CLR) |= intFlags; +} + +//***************************************************************************** +// +//! Get the CAN Global Interrupt status. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Check if any interrupt bit is set in the global interrupt flag register. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return True if any of the requested interrupt bits are set. False, if +//! none of the requested bits are set. +// +//***************************************************************************** +static inline bool +CAN_getGlobalInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Read and return the global interrupt flag register + // + return((bool)((HWREGH(base + CAN_O_GLB_INT_FLG) & intFlags) != 0U)); +} + +//***************************************************************************** +// +//! Initializes the CAN controller +//! +//! \param base is the base address of the CAN controller. +//! +//! This function initializes the message RAM, which also clears all the +//! message objects, and places the CAN controller in an init state. Write +//! access to the configuration registers is available as a result, allowing +//! the bit timing and message objects to be setup. +//! +//! \note To exit the initialization mode and start the CAN module, use the +//! CAN_startModule() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_initModule(uint32_t base); + +//***************************************************************************** +// +//! Sets the CAN Bit Timing based on requested Bit Rate. +//! +//! \param base is the base address of the CAN controller. +//! \param clockFreq is the CAN module clock frequency before the bit rate +//! prescaler (Hertz) +//! \param bitRate is the desired bit rate (bits/sec) +//! \param bitTime is the number of time quanta per bit required for desired +//! bit time (Tq) and must be in the range from 8 to 25 +//! +//! This function sets the CAN bit timing values for the bit rate passed in the +//! \e bitRate and \e bitTime parameters based on the \e clockFreq parameter. The +//! CAN bit clock is calculated to be an average timing value that should work +//! for most systems. If tighter timing requirements are needed, then the +//! CAN_setBitTiming() function is available for full customization of all of +//! the CAN bit timing values. +//! +//! \note Not all bit-rate and bit-time combinations are valid. +//! For combinations that would yield the correct bit-rate, +//! refer to the DCAN_CANBTR_values.xlsx file in the "docs" directory. +//! The CANBTR register values calculated by the function CAN_setBitRate +//! may not be suitable for your network parameters. If this is the case +//! and you have computed the correct values for your network, you could +//! directly write those parameters in CANBTR register using the +//! function CAN_setBitTiming. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate, + uint16_t bitTime); + +//***************************************************************************** +// +//! Manually set the CAN controller bit timing. +//! +//! \param base is the base address of the CAN controller. +//! \param prescaler is the baud rate prescaler +//! \param prescalerExtension is the baud rate prescaler extension +//! \param tSeg1 is the time segment 1 +//! \param tSeg2 is the time segment 2 +//! \param sjw is the synchronization jump width +//! +//! This function sets the various timing parameters for the CAN bus bit +//! timing: baud rate prescaler, prescaler extension, time segment 1, +//! time segment 2, and the Synchronization Jump Width. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setBitTiming(uint32_t base, uint16_t prescaler, + uint16_t prescalerExtension, uint16_t tSeg1, uint16_t tSeg2, + uint16_t sjw); + + +//***************************************************************************** +// +//! Clears a CAN interrupt source. +//! +//! \param base is the base address of the CAN controller. +//! \param intClr is a value indicating which interrupt source to clear. +//! +//! This function can be used to clear a specific interrupt source. The +//! \e intClr parameter should be either a number from 1 to 32 to clear a +//! specific message object interrupt or can be the following: +//! - \b CAN_INT_INT0ID_STATUS - Clears a status interrupt. +//! +//! It is not necessary to use this function to clear an interrupt. This +//! should only be used if the application wants to clear an interrupt source +//! without taking the normal interrupt action. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_clearInterruptStatus(uint32_t base, uint32_t intClr); + +//***************************************************************************** +// +//! Setup a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to configure (1-32). +//! \param msgID is the CAN message identifier used for the 11 or 29 bit +//! identifiers +//! \param frame is the CAN ID frame type +//! \param msgType is the message object type +//! \param msgIDMask is the CAN message identifier mask used when identifier +//! filtering is enabled +//! \param flags is the various flags and settings to be set for the message +//! object +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! +//! This function sets the various values required for a message object. +//! +//! The \e frame parameter can be one of the following values: +//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier +//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier +//! +//! The \e msgType parameter can be one of the following values: +//! - \b CAN_MSG_OBJ_TYPE_TX - Transmit Message +//! - \b CAN_MSG_OBJ_TYPE_TX_REMOTE - Transmit Remote Message +//! - \b CAN_MSG_OBJ_TYPE_RX - Receive Message +//! - \b CAN_MSG_OBJ_TYPE_RXTX_REMOTE - Receive Remote message with +//! auto-transmit +//! +//! The \e flags parameter can be set as \b CAN_MSG_OBJ_NO_FLAGS if no flags +//! are required or the parameter can be a logical OR of any of the following +//! values: +//! - \b CAN_MSG_OBJ_TX_INT_ENABLE - Enable Transmit Interrupts +//! - \b CAN_MSG_OBJ_RX_INT_ENABLE - Enable Receive Interrupts +//! - \b CAN_MSG_OBJ_USE_ID_FILTER - Use filtering based on the Message ID +//! (Standard or Extended) +//! - \b CAN_MSG_OBJ_USE_EXT_FILTER - Use Extended Identifier Bit for filtering +//! (Only among Extended IDs will be accepted) +//! - \b CAN_MSG_OBJ_USE_DIR_FILTER - Use filtering based on the direction of +//! the transfer +//! - \b CAN_MSG_OBJ_FIFO - Message object is part of a FIFO +//! structure and isn't the final message +//! object in FIFO +//! +//! If filtering is based on message identifier (for Standard or Extended IDs) +//! specified by the \e msgIDMask parameter, the value \b CAN_MSG_OBJ_USE_ID_FILTER +//! has to be logically ORed with the \e flag parameter. +//! If \b CAN_MSG_OBJ_USE_EXT_FILTER is ORed with the \e flag parameter, +//! only extended identifier frames are accepted which can further be masked +//! by using the flag above. +//! +//! \note The \b msgLen Parameter for the Receive Message Object is a "don't +//! care" but its value should be between 0-8 due to the assert. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID, + CAN_MsgFrameType frame, CAN_MsgObjType msgType, + uint32_t msgIDMask, uint32_t flags, uint16_t msgLen); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data (all 16 bits are sent) +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_16bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data (all 32 bits are sent) +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_32bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint32_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object while dynamically updating data length +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data +//! +//! This function is used to transmit a message object and the message data, +//! if applicable and can be used to dynamically update the data length +//! for every subsequent call of this function. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Remote Request Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! +//! This function is used to transmit a remote request message object. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function with CAN_MSG_OBJ_TYPE_TX_REMOTE +//! as msgType flag. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_sendRemoteRequestMessage(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Reads the data in a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to read (1-32). +//! \param msgData is a pointer to the array to store the message data +//! +//! This function is used to read the data contents of the specified message +//! object in the CAN controller. The data returned is stored in the +//! \e msgData parameter. +//! +//! \note +//! -# The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! -# If the DLC of the received message is larger than the \e msgData +//! buffer provided, then it is possible for a buffer overflow to occur. +//! +//! \return Returns \b true if new data was retrieved, else returns +//! \b false to indicate no new data was retrieved. +// +//***************************************************************************** +extern bool +CAN_readMessage(uint32_t base, uint32_t objID, + uint16_t *msgData); + +//***************************************************************************** +// +//! Reads the data and Message ID in a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to read (1-32). +//! \param frameType is a pointer to the CAN_MsgFrameType to store the message +//! type that has been received in the mailbox +//! The \e frameType parameter shall be filled as of the following values: +//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier +//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier +//! This parameter is filled when return value is true for this function. +//! \param msgID is a pointer to storage for the received Message ID +//! Filled when the return value is true for this function. +//! \param msgData is a pointer to the array to store the message data +//! Filled with read Data when the return value is true for this function. +//! +//! This function is used to read the data contents and the Message ID +//! of the specified message object in the CAN controller.The Message ID returned +//! is stored in the \e msgID parameter and its type in \e frameType parameter. +//! The data returned is stored in the \e msgData parameter. +//! +//! \note +//! -# The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return Returns \b true if new data was retrieved, else returns +//! \b false to indicate no new data was retrieved. +// +//***************************************************************************** +extern bool CAN_readMessageWithID(uint32_t base, + uint32_t objID, + CAN_MsgFrameType *frameType, + uint32_t *msgID, + uint16_t *msgData); + + + +//***************************************************************************** +// +//! Transfers a CAN message between the IF registers and Message RAM. +//! +//! \param base is the base address of the CAN controller. +//! \param interface is the interface to use for the transfer. Valid value are +//! 1 or 2. +//! \param objID is the object number to transfer (1-32). +//! \param direction is the direction of data transfer. False is Message RAM +//! to IF, True is IF to Message RAM. +//! +//! This function transfers the contents of the interface registers to message +//! RAM or vice versa depending on the value passed to direction. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID, + bool direction); + +//***************************************************************************** +// +//! Clears a message object so that it is no longer used. +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to disable (1-32). +//! +//! This function frees(disables) the specified message object from use. Once +//! a message object has been cleared, it will no longer automatically send or +//! receive messages, or generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_clearMessage(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Disables specific message object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to disable (1-32). +//! +//! This function disables the specific message object. Once the message object +//! has been disabled it will be ignored by the message handler until it +//! is configured again. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_disableMessageObject(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Disables all message objects +//! +//! \param base is the base address of the CAN controller. +//! +//! This function disables all message objects. Once a message object +//! has been disabled it will be ignored by the message handler until it +//! is configured again. All message objects are disabled automatically on +//! reset, however this function can be used to restart CAN operations +//! without an external reset. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_disableAllMessageObjects(uint32_t base); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // #ifdef __TMS320C28XX__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CAN_H diff --git a/gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib.lib b/gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..62fb82036e184869d2ec9cad6588082d84765bf4 GIT binary patch literal 698 zcma)4%}T>S5T4yuEm6diJqfAwpdOkuX`3FTP{BZ;=%x20+a`1&T1nF4%_1K45qt%o zL3{|G$Jw;2TNLWR?0oZ+nQw;F&ck#x>1l?cuZgL6ORT=S-tNePKpUrg9;FFq{%9J< z4Fp2@Z9FxUTof|Co-@=T*skd~wrM%0jd69FENj}W)zCou00N)AH+~0F7UZ>nWf?$w zhUzN5ga-&JsQpuXh8~b(v|Ifwi*8sFrBJDAJ9~6N=_932l)h7Xhy`^vuFA_Ha3H2_e{bDFj|{ryqGa!hBY literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib_coff.lib b/gpio_bitfield_cpu2/device/driverlib/ccs/Debug/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..04638f4ef8ef77f89abeb07d7c29154772f7d6a5 GIT binary patch literal 575952 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

2T-rX$~`*}3T~ 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 z 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

=&ne@o{Y zd!!2*)j8gGkOf-vb0R8-L20j!zCxMeZ7-$T3s<>s;_COcd;qVc;gA+DisQBS(St^) zR5DeXN~OwD<*AC)nAEAM(^GR&^UO;~+E3V#t17p@U)AIHJ@|{Oi?H`RHES^T_|==I zB6pdNCxJ!4xT`{ ze5a>k!|e{gFkJDb`BY2++>j1liR?`P(w=3U(s7s7h-Q3C0~6Dj)O^B z{=C3nM3R}t&dU%UY#f}SwRw2msqZ@uzKtO8Pk~wIV=%zzG3zC;&WVW8-o?sUYnJ(B z72CfPn9n6_XKFLMoSdHK3ix!rYy-8>e6DD%^_md5aq+vAvOh&$j`|5fvWzyeJnot6 z)&jAkCs=4hP5_5`Fu6SLbD6v7)a&A&7M*D}?$=N*h6bQoZfYq#Xp^<2>jD8iH^m#_2i}0+!esms zf5UsnI)q+pG&~ zzXktC4MxbNUHbD2g8vlo6nao7Ym@vZMOYnh47>N+qHSu!AiduFXk#N>hYB29Nj##) zR2RRsI*$KCLk;h9NMo;b#q9dUt&5f|%`8LrTFJv26_ba!tuGJJft82jz z=iIw@Kiad~-nNvswA%s|%V)ZuZNVSiFM4aX?aG!~1#(%zLbYXyZAmG$DWrZtVkD>q zBZ>IKZ7NFqp_ups6D3h80b__JCH^K+3Ghq*NPXU!cjlcrbLMWvEVt?2_ssLo$1`)z zoadZ--Z?|6)88Cci~P+kD)%?H;>rIuQ}MB*4<9><8!W0quQSSigUMgo)ZBIF{>_`4 zW4orNr~8^?d+*peg_btFW+ptEd+umX#s!UxkBv<115Y8w1x$>MO!ZMWsA{|I5e=c* zuy!2fm7>ee-RM2a)`yF>A~-fVs!JYJl?X$F#&mKKk3loq0nD~II zL=X`lFvJVkP_YFdz9?+LkPshGSpUvIw-qG2#)%#0OQi0BtqZqT7Y|(y-dtg^5RgsAbd~ z;Sof{hYaxowyoF#5MLIyV4DyhQdtCoxZau2;Sq)=jhkaUg!*`5!>9`J6+yKnE=)Y~ zW8yf*BZ!C(8{!3wCpT#Uh_4J=&?m%)RThDkI7U3em^hB{0>m>H_BSEEDy%kkVd9Y= z6UQ-LfOrCvT0m}1Sj#{Yxu^Gxji@X_z)T+|7}5x1W;loo5YJxNUxnG)u+G?pnMHog z3=N2&iT!)0Keu~KpRWoaPhZjm(C!VJFvPS+RTd$ZHU>1pm^KdK0yNy59`Cz-axeC$ zJ-cudPi+V*EZ{_#9C3y&IBp3FLd&lS3);#!b`Mk0#+JBOQNeLrP!KA*E-0vfGvnBa zOhubo;$B4s$G)H-RCGgFP(S0?Elfo>wZy%O3XTIoL8$1Ku%JQU{r(tjZi#yp6�x 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

  • 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

    j+Pt)H#+%vbfaY+H(Jru+8m?R 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

    %iex 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 literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib.lib b/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..62fb82036e184869d2ec9cad6588082d84765bf4 GIT binary patch literal 698 zcma)4%}T>S5T4yuEm6diJqfAwpdOkuX`3FTP{BZ;=%x20+a`1&T1nF4%_1K45qt%o zL3{|G$Jw;2TNLWR?0oZ+nQw;F&ck#x>1l?cuZgL6ORT=S-tNePKpUrg9;FFq{%9J< z4Fp2@Z9FxUTof|Co-@=T*skd~wrM%0jd69FENj}W)zCou00N)AH+~0F7UZ>nWf?$w zhUzN5ga-&JsQpuXh8~b(v|Ifwi*8sFrBJDAJ9~6N=_932l)h7Xhy`^vuFA_Ha3H2_e{bDFj|{ryqGa!hBY literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_coff.lib b/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..861e1b2354ecd85666e1aa5d5fdeb02b1d4ba299 GIT binary patch literal 375766 zcmeEv31A$>m3H-vW;D7zk}<|1W-tZ}2CTy;5Ukr4NY;2H%MJm?V`(faNE$JcY-0=v zW5D4w<_Lk1HDGLyO|pR;n+pQOz><)JB;?v9A<3U*caz->o8(V+m;C7eULD=9r$@Gv zKa<@*yJf5Ut5>h9URS-UuJg^Q7beoZn=UF|5OKR|=2e(qBay{5OO`5@^~FMnp9wK@ zqx7VZt;@{sq>YsJyG?DXf?Y{}@{XX?~`!m9# zzrQ%*{C(;p!aCl+fBmJfj`HU_xmry5*Yd3J9naq_dxS5KfBre^#qagEexdLm>+h~} zgrEK%`{wWe_lv(4{^R&7So&dc)W75oQSjgFFOZxo0wdqd{);y>H^oPjV;!l!q%fXn zw6QxqFw#CSG%z-5Q`=UxgF0mUJ2!5`gNoGDuqvKTCi*&(qoav_#6*PAGb%>Sl3u$Y#h-Os|=ay;dou`hJi5?=UC&wST`ga?pKt)fziZ~!rFnc zO>NC8xv_L&cywbjo%O7pKk=Hy>=hmI_(&h3Zf%gE)XG<>f%7K1LnX$(bLnEL>*PzgnX?lg0q4B}Q*g$GnDP40zQ+#ZE zILY;?xv8roK0Z8{>b>&P)NryEUJ=hC);Preg}iFC3_Dj2vmxovo4d@Pz8OhCD=7IB$-ab9l}WlQ49WNSJ#)E-6QDbh%4OETS@ z+A=KSE23?kBxeHzN%bq)4b5&Nq63U`^>|`%VBD1t0GTkJL z!$gG`jQEDsJdj2MVe6kHLrq-KGkFj+#S_s)Uv}J6MS>S)+-#b>O zVupK>sgfmUdr2X>(X;bO@lz2v`Jm#>iV`nlKV<3&MVK6>M$`_{>C1A5y5x+?of@7n z4SRe5#n7J^>>Np^Wm&CE4ELd6IEzY;Qz*I~luIhzO``B1{kELMwarO*cxWI;T7Ail ziSfZPCnQRrykV5x&=4d;v>=QRr<45yqiEUe=u|-4@aR}#nA%!mW9>Vs_UiHExDG)J zR}=3}QA<}FUy&SZ9N&lr-+9WFniOAsD_IomgV~*8^eH5Br5GKzQ|#z%?20=2)xEVf zoft}XT|L|@;wnsjj_`4>S&WZYb7Cy9DmC0l3Mjv-Zl1c@sd;*hg2cROs1lBCwOcq9 ztuD*%Y`Ps)SG27oLFJ&Tpn3|`C$^OY?HbsI{I-eR9->Ot6Fq8ta$s}PewpmIwUh7O z+5ue|=r!%KO3DsaQnaShLkYCwosQ=PYSIy?7{M_sZL$QHmIM{=lXV}Bg2Q_ldtE7UmaPafn~VNii? z>U}A(Y+5vpo|$aTZBBaaCjH6M5BH*~%eE06C7X{bVV8Oq-&M`2IvrV$BkdJk=m&tT zKQdkP&2}VfpE?xpv}U+Bl}@*$)2Vd!TgmnqV(7lGjuBLR#j>90YHIT~(?o=HYw1%v zn83RcA$LEULS%BNTfG0RqcE>bUhn6HsIo7K>YQ#!rxW-@5slizEE2?NOpK#h?P_i{ zT@KZeNT6|dk*P+j?j*?3DZ~Ta)TG*lXp2x*#LIP3lX8d+#u4-i(5^w>sG}=;R|%~! z6p!c2M?{mLY%g@|crQDTz@lGMb^Vz@vWDqLrYHzJt)=HLq~-JqdG%=1*dWpygsygu z_NuOb!}!){dpoj%hpy{xa7ca0L0L+MVGNJxCc*WP9i<%^v?K@bnEPQcwWqdpjUhGtXqluJ1qeXOuMYp6|WIxXpQ#8?gC8;)sk0x=RNLP}&NJyDt z*F)g8RqjNk7OY^B)0-H7b|%QkC|g?x$44<(RQZI=9EN_oB%}8>u^5r;@?=@j(ZF7d zCCBqkNe{)c-^IjeDmCOFsg&2`1Y%QP93`du86z8*_zN2*M+xmTW69C+A=0|8#?I~) zUFZSgOQ$ncQb__H7nH48O>l5+qnANpwoHq#S&Qxm#se8`9}YG{T)8X!9&CM)a!ydQe(*)qGC z@iKVhURE(=M;-}oNZPfFs{*S9JfVioi2?LhdXj0}bl1rQVA?1Lm1YjI$@+7LXjETB#(?DHd;yVk#*0K>?|G>W@3$8jYL+aitFB#A zU5iBpzOJBfB(h}TLVI=Lc~K@_x#(j9C!Zw5*_iJaV#0b@-v3cv)rCTC_A!En({K;r z@4T_(*0HSMkLTczXrA->P-4fyUvKy~jE-ip=k!i6>NbX-E)jy{8L3i4EPhC5U{uai68Ss({M$nMQ|2`HR2L1){pQwl?YdQbhjQ``n zVZ6{x&2Qdq8XlzbA~&pV@*1;*cn(b8)BI&RjGi<6H#7dz!CzI$2s!xgWx-2y_-Hb{U~FJPIysUWUC>)wU0uBe6K&eRv36QJaU^~xlCc}k(TcXUBaNrShJba!;s)mAr=*pU@=k){Pr^XEsJ&?xpN zha+o-2ew8w*Vdl5_`I6)+Pk|DFmg3!tv8KD=JlQxsadvc@wv6tHA^Gi$*qae2+gmg z@lhNeBaDI4ND8w?$v$C);_)OpO{p!yvf?%-YTv-9rb+Zc6s}cBD;cqtuFm!~-EEz# z;x)C6ZQVk6$cu?wFA5}kax^tKPNPlX+ki;QDW>2P6x~1Dadvbzx5T^JR;_4niMOn3 zZfVw$N_ul!YimoaWmR_@dfpQ%RyDaQzlOd~Q>+wM&<9Pn-bWWH64qGatJZWhw!~_5 zd=917!&4`GSx;f5O{Ip%)E7bcN)dZGB@s;FQnooY&?f>LQmH{<`2wSu@=f+dFtL#q zRxmI=>>`8$TPP$xMq%i1rvU;Elcp2~2GFzR0n%Ss5RZ=o)hx#IzSod;f#dxtyn(?K zmTPkVDGF>~DSYK8;}Sd@7bju$ph-YIxsaZu1eCXh9_^t=lk_M(5s{A- zuoqy|!obGC6lQOH1%bZQI88MI$#Cs0D5$WaD9#FNb;C+rV^P9gQNn#)QCySjx^dk| zm;SEqYTPz;b=TlF5N*Qs{V{nPY$e{IX1We{t?R%og{klg-|k3fkG!86ZCKHQ$9=o! zG>|$GTGi6f-rl*E;Aw5Ex+UM-w$>OCPH$_G_cMCP*B$@>Mdh4Q{Uwn*NaVvFT{MQn+@ zUmRQsi}!Gf2q|Y<9NRv zTd6CyC$nNJb;VYQy31pmW-{8W1=C&+%cimwJo+A6^g$PvD7gqH9;jropQT`+`)M*r1Px&mQr`lQbIE|GO|JUMW`1Ncf9BfZ^OLb z$jSk^sYKA19+RvN0SsHo-=4~1Fa(r}w;^*97;~prYIXD27i1?_YOUv~+2JO&@R_oB z#nVq6n7#5y>z#8pTW9%u_W3in9tiF$Y%a>&_`+kE^ABTiaA@W`lh)mbzkKK`FU+Q} z)}qX<`-4Xw15Jlg*pb<@Ha~M)5b_Utb$NQIv9r3#)Yyz2@7k;|>KB9oJok5`KjuF*Re0CO8Fdz@ANS7y^(jWJ0QD(<38F>Yj(LK}GKXU6MH;%lX{=t!;*nMR7Be%W~-1>d7d-Llr%vO}=K!1+%>t>TjsnN`<6C>pA+yT#gAb^S{X?r<6&+u_%!a7xEG`gGahjaAovz~@_Ab=}Ji z#L3g4-igiEsp46MLi3AJgjklSDZ>?a=`4}gW+4BFTuPhMw>6kA(-B%tC z`jC5;umk_rLg2PX9}ATEN~Ucc@o&FqIsO8H)qx^ksLB_b=D#-OE1dR;U{nfinN#-l!ymT%p=rUYl6Qqp58YOe@PZk_ zAF3*8L%$?27qFz{B2a^82%;3u1Lb7+L+1fpSh~Da#!`gVbecaDwkj=2xv@U9vp#TB zeaX%Bp?GJFQZ z^BJyYIL2^-;f)Mm$?(Mi%wWkpv7&@OgLi|AUIJ`nc%RJ^7IB7`B6AH7WwgP=4ByP~ zM;QJB!#@C4GK9r%82%l@G?1F1S(J8 zLMux64K3Rbf$8%?wc@unPguOo@EaHh8QFfr@Cj&541F=foeXbecqhaA82&V{k}WJ~ z$ffc&j+t=tE^*n}H1f{_J%T^D=sCC;`Ky6VJS%}sSrCrk4-Ru34u2HbMAT1lW}OZeUXv2uJV-7rhr3!~X!V(NzjG?aZ~n=3NNCn*#Cd1TIGY2Z4?J zgwMwxT=ZdFjLfeA8<`1jz#m-nySNxR7o(hwoP*3Arqh6poPpjzZ)w zx=WzcfICk92<&~LgRtqjVXf@8#bhqn{6L!b&P$A8 z052NCc9twL+RrU5% z5uA-1wUF74Y71#Nucd}(eGdMJ4&*iVX#DktpVeN&pX)xsh-g@BN4-muXD2leaHgIa z`H4o@xKjaoHLs!3-S8jx8lZm?sj7$y@-{Q0i@!HtW60kBj3q$7T*LC|H7uWN$tvi} zUc>S^Ygj(BhUGAsH7p-ijZA|0mShf;$Cm2{|Lb!IFqe zJ^p@uhVeP~2nA?2-vHbn!{6AMjG!UsZ)3sLz@PJe$_3|7Wbw~JN3y3`5w-X({w<83 z`rq5YpY3@353#`2z)u~6{|k)&65wu9iY&+D|2_*_3H-BT@c)MKQ}1>g&tM(K<1aIr zfH3MY|I;z}=Q4ikcV3FihNI+X1LHpd{7->@_$d5q8UGCMzfOr{IWGSe#!uxHqAq`y z{c@eL{Q${M+>V)@!-=PNHwI_}?x-ySf1UD-fC*8u;I7aFpdZ|GzW-2f%kR>h6oW64BU;oZ&z2UWAW^TDlhz$kRkIHOIYD zyg#d*MCG)(M{jyp+v2gK$mREUP|jL+gU>3WgTozNE8?wm^fTVo4Nc0TwO|8?C4!Q1 zv|nz^?7n&gJ4q;^FvSw0dC-Cg!7xpIhG;I(s)2Gk@pm>}9PfT_v?bn+p{|_*qhdc( zM`w3Su18|)gwOj(Y+d&{^N`<`4=19PbkCDCBtxhbmua$dRj4~xh3?K(VRq-L(CJ(i zn$DHOWI9)cs&f^T8-3J%pnXUx2(t1WhR=CSb-lpt>=$~O*d6cp;Vp>#4A=0#;}V)A zMBY#lN~|DKj%&CIm(WSL6zWc#lY;KV=_J&SA)4-$Nht4y@D@Z!0m7Hz652qByrDr{ z3L;mLe>3^F<06wV-9dLcnp#+Bx`TywcThcLcL$y4)PAf`_$w6u>$p_Py+@UD?@^`P zdsHd+9#zV{N0oB#Q6=p?s#JTAD%IYjO1bx_Qtdsev}o^9rQCZ|srDXK%DqRGdhZeL zdhZdC-g^XO_8tMMy+;6Y?-A~D?-B0UdxWdK_Xt?-J*rfDk1F-vqe@HeJ*w1uk1EyP zqe{K^sM3;qk1F-vqe`{+s8a7es#JTAD)ru@O11Z>Qtv&gRC|vq_1+_-FZUkdF83bc zF83bcF83bcF83bcF83bcF83bcF83bcPJ54VlY5UU?Y&2!u)RlR2QU{z)twzYrFN3O zu9mbkzyk8xI9KOu1gYBoE@uM6mZlc673u2Gc6PG^W;q+5q0Jtk+?Zrtx$dty$A&(p8k6jb>gq z?Ab;^uYA+I?*nctlKq-Ble%-S>#F~P)-%x(oyzea{e`wdY+wC-w-o<;+4 z1yR8fD7)p0;M>VPf6a?`~u(T(2`=D{IioH$=DN9(v z3hPoCz0w2)p&Uv^+P)Jl8aq9<;MadZs@rHMOJw>rqNmZCgsDp@Jr7jEXuT zdDYD?ab0+&6uuwzs;+hQs=T21=@+cq!X8d#!;k+(gQWfna9ZcfxfMR#%XZ^ zxfCs$L(xdzy`>%-C5s+XaETBb9ksIy+<2zbN+kA@`>H%8tBq$-`O;*ar+jsIUQ4;q zm)|DnVxP4&XA`tJZ>8M*M=WJq!)CiR?6^yxCg)K4G~UXp*V;N9l|D`FdP`qfkIQT6 z$MRhI_x%w|pC&SnqmJjL^lxydecYvgu`2!GiQdw8EaZ^}&|-jB100^bYQe*K)`Bws zR0GbuwE@&Q@P1|SP5vXc4awvE0z{P-^r1Iu+JKyf8A%anRl-q(oNRg3g%kYw{T?*? zr|Ru{bRkz?-}`-@PP@Nw-l!J)!YFr{p)<-)xlCozB&8hH^U%EJV|$+Sarg1(BkL#8 zOf+jlv-?9=c*a)V{HECwW%NmAs>Yz28Yjp4#)DC_r2sZ8Z`Os+E3Jb5kI5Bh_7jsF?HwK->xY0OhY%=k=>ZfLPa4SLj?iR?3D zJV#3dROWyfaixKpsmq+D3hO*Yzg{Kh8guo?@s*7KX?Jq=c&y(^PIbg(YIJCtDc<@V zDx{{}cm*w%8bM3U=t0fKjxN#&Y2k`lq$Pc*Cl*=1vqSS*QZMGYj{m|x#q1jUdGWIY&=@#&W2TwZ`%0ny0uIg}#mME7GVX2*-#-#Y}WzHE5R z{L`0Hv5AttQ&h>yi7jJj7(sGpu_{(qP+rUQw|Oqp%7Xu=@1M6)PM0e=qU3WCm5VSe zL1swZ2BO`$nUf{2xjHLv+XvNL!lHcTs(+3vSG~r%DQBHNo6cD;TV8YbJ$cUEctNgq z2(7zn4CI80f@mPJz9YJOCVcN??tFYt>k9=5@!-TmzLfB7S$*l`zCFHJ!TO2K5zC*N z*etBQH|`HwJ&%hQI)62k9oG1z#yyj}_uklef5ZI7ARSI^oUOPUgD=d^=H@Z&c!v(K zK7HuvM+@HRKGOXBnq8}Ij_zo@ZvX6tYh$-y3!b$B59R z=1+)MgQ;gXi^>I)qCRuyzCBiKW}O^ z`pUssVxl5N+@KylICJupl|7G_WgaCYL!UkT<;OekOG z#zQm3v&})GiifP-hrV+7%j+fsi37pREHUlC?1nvl$XU3)aZknW%w;&n`;4d?G9(tuh+%lP2kU9Sle1~5t6t_)g&cyL!_$qvle_;9KrIYZ< zW5zF@N=IS~-r2Y7;#)Fz-uQYFM~M$)_U#hBm5-hBn-hBui2ZvGU-s-|C|0m>|DI8zE_ru%&vWVUYN{WzW=h!`E>Ah zC$u1QD{>oewSP8JMnPBtIXnwHnxF$OWEADz&diN(5A6?%J4&s4ckNvL!fa^IA-wsc zE9JA7PEK2$xmjt*wxzLfne0Fvw zvwQVRvtR0*9D3;xT`8UW%f&+#yPrUbOrH#k{j)QNi=lhg_jc~td+Cc8W)53Fe6-@< zH$J|nAmP6Y`@d7-wah`%g`J3r%7*kC5<ss4acJ$%@D@X)LR@nYshXc2aK zJZM@u-#hzmYd`Y%j?B%gZf$&?bYH|WyJjXbhpHw|7nz%%4<1}qGW6VhYO$V2$*MN% zOS218U+j6#dj7FPXraE8+40UZJNEB!4zt(4`rIsQ`WJido>l+q-FuerK0Wrk_0OS= zvwW1obF=CN)nL@HBUC4NUCJC3pH}S)Y87hVUbHDxs}7(wv0gjn8R8c;lH;}mvL(*k z_`z4i#DA>c_sXPrE|V#@Uf+v)ST24!`TM5Pd?a(L1p@?PVt++Aku8~$Cxp0Pka_si zJ;#46pPFRj>H+j|`Rl5#Z;)q}P1s{j*ezBA9l39)+J2kAp=z6Nch&axs%yW3!~E(5 zzB$7uAEj+46lWtH^&e74@Ohdh98nHanzV_tmvzOsM*AQ{1X+|yQ2P_=_zs=`s zueuHbT>o+d#b+E%NNc`Zh)>JxYj#Pic08D8XbB_NGmwwHp*e%7o}y(f`|IM?dm**hpNa

    _hR*a&I}t&p;XvRsfuc`>6r3I?N(2Ib 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≧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%0AB zSC++bh16VGsF0g`Z8AAW)SO5wf{Qw&=1L_|<7iggk6Lj^&i#(5?AvGOc?60&nVx%Q zUViQgc?o(RL6yZBx@YF4=t9WN(entZEKbrrGcQZ`guFC8kD$upJl!+%5_M0=%hdA- zsw_^`Ju@#?_k_G;J&Ν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 KVmQi6u>LRp$|r>Y literal 0 HcmV?d00001 diff --git a/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_eabi.lib b/gpio_bitfield_cpu2/device/driverlib/ccs/Release/driverlib_eabi.lib new file mode 100644 index 0000000000000000000000000000000000000000..1464424a687bd967a299d6872969a911df13f136 GIT binary patch literal 654036 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_bitfield_cpu2/device/driverlib/cla.c b/gpio_bitfield_cpu2/device/driverlib/cla.c new file mode 100644 index 0000000..d933af4 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cla.c @@ -0,0 +1,89 @@ +//########################################################################### +// +// FILE: cla.c +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cla.h" + +//***************************************************************************** +// +// CLA_setTriggerSource() +// +//***************************************************************************** +void +CLA_setTriggerSource(CLA_TaskNumber taskNumber, CLA_Trigger trigger) +{ + uint32_t srcSelReg; + uint32_t shiftVal; + + // + // Calculate the shift value for the specified task. + // + shiftVal = ((uint32_t)taskNumber * SYSCTL_CLA1TASKSRCSEL1_TASK2_S) % 32U; + + // + // Calculate the register address for the specified task. + // + if(taskNumber <= CLA_TASK_4) + { + // + // Tasks 1-4 + // + srcSelReg = (uint32_t)DMACLASRCSEL_BASE + SYSCTL_O_CLA1TASKSRCSEL1; + } + else + { + // + // Tasks 5-8 + // + srcSelReg = (uint32_t)DMACLASRCSEL_BASE + SYSCTL_O_CLA1TASKSRCSEL2; + } + + EALLOW; + + // + // Write trigger selection to the appropriate register. + // + HWREG(srcSelReg) &= ~((uint32_t)SYSCTL_CLA1TASKSRCSEL1_TASK1_M + << shiftVal); + HWREG(srcSelReg) = HWREG(srcSelReg) | ((uint32_t)trigger << shiftVal); + + EDIS; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/cla.h b/gpio_bitfield_cpu2/device/driverlib/cla.h new file mode 100644 index 0000000..fee905c --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cla.h @@ -0,0 +1,984 @@ +//########################################################################### +// +// FILE: cla.h +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CLA_H +#define CLA_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup cla_api CLA +//! \brief This module is used for configurating CLA. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "cpu.h" +#include "debug.h" +#include "inc/hw_cla.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define CLA_NUM_EOT_INTERRUPTS (8U) + + +//***************************************************************************** +// +// Values that can be passed to CLA_clearTaskFlags(), CLA_forceTasks(), +// and CLA_enableTasks(), CLA_disableTasks(), and CLA_enableSoftwareInterrupt() +// as the taskFlags parameter. +// +//***************************************************************************** +#define CLA_TASKFLAG_1 (0x01U) //!< CLA Task 1 Flag +#define CLA_TASKFLAG_2 (0x02U) //!< CLA Task 2 Flag +#define CLA_TASKFLAG_3 (0x04U) //!< CLA Task 3 Flag +#define CLA_TASKFLAG_4 (0x08U) //!< CLA Task 4 Flag +#define CLA_TASKFLAG_5 (0x10U) //!< CLA Task 5 Flag +#define CLA_TASKFLAG_6 (0x20U) //!< CLA Task 6 Flag +#define CLA_TASKFLAG_7 (0x40U) //!< CLA Task 7 Flag +#define CLA_TASKFLAG_8 (0x80U) //!< CLA Task 8 Flag +#define CLA_TASKFLAG_ALL (0xFFU) //!< CLA All Task Flag + +//***************************************************************************** +// +//! Values that can be passed to CLA_getPendingTaskFlag(), +//! CLA_getTaskOverflowFlag(), CLA_getTaskRunStatus(), CLA_setTriggerSource(), +//! CLA_registerEndOfTaskInterrupt(), and CLA_unregisterEndOfTaskInterrupt() +//! as the taskNumber parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_TASK_1, //!< CLA Task 1 + CLA_TASK_2, //!< CLA Task 2 + CLA_TASK_3, //!< CLA Task 3 + CLA_TASK_4, //!< CLA Task 4 + CLA_TASK_5, //!< CLA Task 5 + CLA_TASK_6, //!< CLA Task 6 + CLA_TASK_7, //!< CLA Task 7 + CLA_TASK_8 //!< CLA Task 8 +} CLA_TaskNumber; + +#ifdef __TMS320C28XX__ // These enums are only accessible by C28x +//***************************************************************************** +// +//! Values that can be passed to CLA_mapTaskVector() as the \e claIntVect +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_MVECT_1 = CLA_O_MVECT1, //!< Task Interrupt Vector 1 + CLA_MVECT_2 = CLA_O_MVECT2, //!< Task Interrupt Vector 2 + CLA_MVECT_3 = CLA_O_MVECT3, //!< Task Interrupt Vector 3 + CLA_MVECT_4 = CLA_O_MVECT4, //!< Task Interrupt Vector 4 + CLA_MVECT_5 = CLA_O_MVECT5, //!< Task Interrupt Vector 5 + CLA_MVECT_6 = CLA_O_MVECT6, //!< Task Interrupt Vector 6 + CLA_MVECT_7 = CLA_O_MVECT7, //!< Task Interrupt Vector 7 + CLA_MVECT_8 = CLA_O_MVECT8 //!< Task Interrupt Vector 8 +} CLA_MVECTNumber; + +//***************************************************************************** +// +//! Values that can be passed to CLA_setTriggerSource() as the \e trigger +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_TRIGGER_SOFTWARE = 0U, //!< CLA Task Trigger Source is Software + + CLA_TRIGGER_ADCA1 = 1U, //!< CLA Task Trigger Source is ADCA1 + CLA_TRIGGER_ADCA2 = 2U, //!< CLA Task Trigger Source is ADCA2 + CLA_TRIGGER_ADCA3 = 3U, //!< CLA Task Trigger Source is ADCA3 + CLA_TRIGGER_ADCA4 = 4U, //!< CLA Task Trigger Source is ADCA4 + CLA_TRIGGER_ADCAEVT = 5U, //!< CLA Task Trigger Source is ADCAEVT + CLA_TRIGGER_ADCB1 = 6U, //!< CLA Task Trigger Source is ADCB1 + CLA_TRIGGER_ADCB2 = 7U, //!< CLA Task Trigger Source is ADCB2 + CLA_TRIGGER_ADCB3 = 8U, //!< CLA Task Trigger Source is ADCB3 + CLA_TRIGGER_ADCB4 = 9U, //!< CLA Task Trigger Source is ADCB4 + CLA_TRIGGER_ADCBEVT = 10U, //!< CLA Task Trigger Source is ADCBEVT + CLA_TRIGGER_ADCC1 = 11U, //!< CLA Task Trigger Source is ADCC1 + CLA_TRIGGER_ADCC2 = 12U, //!< CLA Task Trigger Source is ADCC2 + CLA_TRIGGER_ADCC3 = 13U, //!< CLA Task Trigger Source is ADCC3 + CLA_TRIGGER_ADCC4 = 14U, //!< CLA Task Trigger Source is ADCC4 + CLA_TRIGGER_ADCCEVT = 15U, //!< CLA Task Trigger Source is ADCCEVT + CLA_TRIGGER_ADCD1 = 16U, //!< CLA Task Trigger Source is ADCD1 + CLA_TRIGGER_ADCD2 = 17U, //!< CLA Task Trigger Source is ADCD2 + CLA_TRIGGER_ADCD3 = 18U, //!< CLA Task Trigger Source is ADCD3 + CLA_TRIGGER_ADCD4 = 19U, //!< CLA Task Trigger Source is ADCD4 + CLA_TRIGGER_ADCDEVT = 20U, //!< CLA Task Trigger Source is ADCDEVT + + CLA_TRIGGER_XINT1 = 29U, //!< CLA Task Trigger Source is XINT1 + CLA_TRIGGER_XINT2 = 30U, //!< CLA Task Trigger Source is XINT2 + CLA_TRIGGER_XINT3 = 31U, //!< CLA Task Trigger Source is XINT3 + CLA_TRIGGER_XINT4 = 32U, //!< CLA Task Trigger Source is XINT4 + CLA_TRIGGER_XINT5 = 33U, //!< CLA Task Trigger Source is XINT5 + + CLA_TRIGGER_EPWM1INT = 36U, //!< CLA Task Trigger Source is EPWM1INT + CLA_TRIGGER_EPWM2INT = 37U, //!< CLA Task Trigger Source is EPWM2INT + CLA_TRIGGER_EPWM3INT = 38U, //!< CLA Task Trigger Source is EPWM3INT + CLA_TRIGGER_EPWM4INT = 39U, //!< CLA Task Trigger Source is EPWM4INT + CLA_TRIGGER_EPWM5INT = 40U, //!< CLA Task Trigger Source is EPWM5INT + CLA_TRIGGER_EPWM6INT = 41U, //!< CLA Task Trigger Source is EPWM6INT + CLA_TRIGGER_EPWM7INT = 42U, //!< CLA Task Trigger Source is EPWM7INT + CLA_TRIGGER_EPWM8INT = 43U, //!< CLA Task Trigger Source is EPWM8INT + CLA_TRIGGER_EPWM9INT = 44U, //!< CLA Task Trigger Source is EPWM9INT + CLA_TRIGGER_EPWM10INT = 45U, //!< CLA Task Trigger Source is EPWM10INT + CLA_TRIGGER_EPWM11INT = 46U, //!< CLA Task Trigger Source is EPWM11INT + CLA_TRIGGER_EPWM12INT = 47U, //!< CLA Task Trigger Source is EPWM12INT + + + CLA_TRIGGER_TINT0 = 68U, //!< CLA Task Trigger Source is TINT0 + CLA_TRIGGER_TINT1 = 69U, //!< CLA Task Trigger Source is TINT1 + CLA_TRIGGER_TINT2 = 70U, //!< CLA Task Trigger Source is TINT2 + + CLA_TRIGGER_MXINTA = 71U, //!< CLA Task Trigger Source is MXINTA + CLA_TRIGGER_MRINTA = 72U, //!< CLA Task Trigger Source is MRINTA + CLA_TRIGGER_MXINTB = 73U, //!< CLA Task Trigger Source is MXINTB + CLA_TRIGGER_MRINTB = 74U, //!< CLA Task Trigger Source is MRINTB + + CLA_TRIGGER_ECAP1INT = 75U, //!< CLA Task Trigger Source is ECAP1INT + CLA_TRIGGER_ECAP2INT = 76U, //!< CLA Task Trigger Source is ECAP2INT + CLA_TRIGGER_ECAP3INT = 77U, //!< CLA Task Trigger Source is ECAP3INT + CLA_TRIGGER_ECAP4INT = 78U, //!< CLA Task Trigger Source is ECAP4INT + CLA_TRIGGER_ECAP5INT = 79U, //!< CLA Task Trigger Source is ECAP5INT + CLA_TRIGGER_ECAP6INT = 80U, //!< CLA Task Trigger Source is ECAP6INT + + CLA_TRIGGER_EQEP1INT = 83U, //!< CLA Task Trigger Source is EQEP1INT + CLA_TRIGGER_EQEP2INT = 84U, //!< CLA Task Trigger Source is EQEP2INT + CLA_TRIGGER_EQEP3INT = 85U, //!< CLA Task Trigger Source is EQEP3INT + + + CLA_TRIGGER_SDFM1INT = 95U, //!< CLA Task Trigger Source is SDFM1INT + CLA_TRIGGER_SDFM2INT = 96U, //!< CLA Task Trigger Source is SDFM2INT + + + + CLA_TRIGGER_UPP1INT = 107U, //!< CLA Task Trigger Source is UPP1INT + + CLA_TRIGGER_SPITXAINT = 109U, //!< CLA Task Trigger Source is SPITXAINT + CLA_TRIGGER_SPIRXAINT = 110U, //!< CLA Task Trigger Source is SPIRXAINT + CLA_TRIGGER_SPITXBINT = 111U, //!< CLA Task Trigger Source is SPITXBINT + CLA_TRIGGER_SPIRXBINT = 112U, //!< CLA Task Trigger Source is SPIRXBINT + CLA_TRIGGER_SPITXCINT = 113U, //!< CLA Task Trigger Source is SPITXCINT + CLA_TRIGGER_SPIRXCINT = 114U, //!< CLA Task Trigger Source is SPIRXCINT + + + + + + CLA_TRIGGER_CLB1INT = 127, //!< CLA Task Trigger Source is CLB1INT + CLA_TRIGGER_CLB2INT = 128, //!< CLA Task Trigger Source is CLB2INT + CLA_TRIGGER_CLB3INT = 129, //!< CLA Task Trigger Source is CLB3INT + CLA_TRIGGER_CLB4INT = 130, //!< CLA Task Trigger Source is CLB4INT + +} CLA_Trigger; +#endif // __TMS320C28XX__ + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a CLA base address. +//! +//! \param base is the base address of the CLA controller. +//! +//! This function determines if a CLA controller base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CLA_isBaseValid(uint32_t base) +{ + return(base == CLA1_BASE); +} +#endif + +#ifdef __TMS320C28XX__ // These functions are only accessible from the C28x +//***************************************************************************** +// +//! Map CLA Task Interrupt Vector +//! +//! \param base is the base address of the CLA controller. +//! \param claIntVect is CLA interrupt vector (MVECT1 to MVECT8) +//! the value of claIntVect can be any of the following: +//! - \b CLA_MVECT_1 - Task Interrupt Vector 1 +//! - \b CLA_MVECT_2 - Task Interrupt Vector 2 +//! - \b CLA_MVECT_3 - Task Interrupt Vector 3 +//! - \b CLA_MVECT_4 - Task Interrupt Vector 4 +//! - \b CLA_MVECT_5 - Task Interrupt Vector 5 +//! - \b CLA_MVECT_6 - Task Interrupt Vector 6 +//! - \b CLA_MVECT_7 - Task Interrupt Vector 7 +//! - \b CLA_MVECT_8 - Task Interrupt Vector 8 +//! \param claTaskAddr is the start address of the code for task +//! +//! Each CLA Task (1 to 8) has its own MVECTx register. When a task is +//! triggered, the CLA loads the MVECTx register of the task in question +//! to the MPC (CLA program counter) and begins execution from that point. +//! The CLA has a 16-bit address bus, and can therefore, access the lower +//! 64 KW space. The MVECTx registers take an address anywhere in this space. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_mapTaskVector(uint32_t base, CLA_MVECTNumber claIntVect, + uint16_t claTaskAddr) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + HWREGH(base + (uint16_t)claIntVect) = claTaskAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Hard Reset +//! +//! \param base is the base address of the CLA controller. +//! +//! This function will cause a hard reset of the CLA and set all CLA registers +//! to their default state. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_performHardReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Hard reset of the CLA + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_HARDRESET; + + EDIS; + + // + // Wait for few cycles till the reset is complete + // + NOP; + NOP; + NOP; +} + +//***************************************************************************** +// +//! Soft Reset +//! +//! \param base is the base address of the CLA controller. +//! +//! This function will cause a soft reset of the CLA. This will stop the +//! current task, clear the MIRUN flag and clear all bits in the MIER register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_performSoftReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Soft reset of the CLA + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_SOFTRESET; + + EDIS; + + // + // Wait for few cycles till the reset is complete + // + NOP; + NOP; + NOP; +} + +//***************************************************************************** +// +//! IACK enable +//! +//! \param base is the base address of the CLA controller. +//! +//! This function enables the main CPU to use the IACK #16bit instruction to +//! set MIFR bits in the same manner as writing to the MIFRC register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableIACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable the main CPU to use the IACK #16bit instruction + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_IACKE; + + EDIS; +} + +//***************************************************************************** +// +//! IACK disable +//! +//! \param base is the base address of the CLA controller. +//! +//! This function disables the main CPU to use the IACK #16bit instruction to +//! set MIFR bits in the same manner as writing to the MIFRC register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableIACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable the main CPU to use the IACK #16bit instruction + // + HWREGH(base + CLA_O_MCTL) &= ~CLA_MCTL_IACKE; + + EDIS; +} + +//***************************************************************************** +// +//! Query task N to see if it is flagged and pending execution +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the interrupt flag register +//! corresponds to a CLA task. The corresponding bit is automatically set +//! when the task is triggered (either from a peripheral, through software, or +//! through the MIFRC register). The bit gets cleared when the CLA starts to +//! execute the flagged task. +//! +//! \return \b True if the queried task has been triggered but pending +//! execution. +// +//***************************************************************************** +static inline bool +CLA_getPendingTaskFlag(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIFR) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get status of All Task Interrupt Flag +//! +//! \param base is the base address of the CLA controller. +//! +//! This function gets the value of the interrupt flag register (MIFR) +//! +//! \return the value of Interrupt Flag Register (MIFR) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllPendingTaskFlags(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return the Interrupt Flag Register (MIFR) since that is what was + // requested. + // + status = HWREGH(base + CLA_O_MIFR); + + // + // Return the Interrupt Flag Register value + // + return(status); +} + +//***************************************************************************** +// +//! Get status of Task n Interrupt Overflow Flag +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the overflow flag register +//! corresponds to a CLA task, This bit is set when an interrupt overflow event +//! has occurred for the specific task. +//! +//! \return True if any of task interrupt overflow has occurred. +// +//***************************************************************************** +static inline bool +CLA_getTaskOverflowFlag(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIOVF) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get status of All Task Interrupt Overflow Flag +//! +//! \param base is the base address of the CLA controller. +//! +//! This function gets the value of the Interrupt Overflow Flag Register +//! +//! \return the value of Interrupt Overflow Flag Register(MIOVF) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllTaskOverflowFlags(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return Interrupt Overflow Flag Register(MIOVF) since that is what + // was requested. + // + status = HWREGH(base + CLA_O_MIOVF); + + // + // Return the Interrupt Overflow Flag Register + // + return(status); +} + +//***************************************************************************** +// +//! Clear the task interrupt flag +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be cleared +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to clear all flags. +//! +//! This function is used to manually clear bits in the interrupt +//! flag (MIFR) register +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_clearTaskFlags(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + //Modify protected register + // + EALLOW; + + // + // Clear the task interrupt flag + // + HWREGH(base + CLA_O_MICLR) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Force a CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be forced +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to force all tasks. +//! +//! This function forces a task through software. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_forceTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Force the task interrupt. + // + HWREGH(base + CLA_O_MIFRC) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Enable CLA task(s) +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be enabled +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to enable all tasks +//! +//! This function allows an incoming interrupt or main CPU software to +//! start the corresponding CLA task. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable CLA task + // + HWREGH(base + CLA_O_MIER) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Disable CLA task interrupt +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be disabled +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to disable all tasks +//! +//! This function disables CLA task interrupt by setting the MIER register bit +//! to 0, while the corresponding task is executing this will have no effect +//! on the task. The task will continue to run until it hits the MSTOP +//! instruction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Disable CLA task interrupt + // + HWREGH(base + CLA_O_MIER) &= ~taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Get the value of a task run status +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the Interrupt Run Status +//! Register which indicates whether the task is currently executing +//! +//! \return True if the task is executing. +// +//***************************************************************************** +static inline bool +CLA_getTaskRunStatus(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIRUN) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get the value of all task run status +//! +//! \param base is the base address of the CLA controller. +//! +//! This function indicates which task is currently executing. +//! +//! \return the value of Interrupt Run Status Register (MIRUN) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllTaskRunStatus(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return the Interrupt Run Status Register since that is what was + // requested. + // + status = HWREGH(base + CLA_O_MIRUN); + + // + // Return the Interrupt Run Status Register (MIRUN) + // + return(status); +} +#endif // #ifdef __TMS320C28XX__ + +// +// These functions are accessible only from the CLA (Type - 1/2) +// +#if defined(__TMS320C28XX_CLA1__) || defined(__TMS320C28XX_CLA2__) +//***************************************************************************** +// +//! Enable the Software Interrupt for a given CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks for which software +//! interrupts are to be enabled, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to enable software interrupts of all tasks +//! +//! This function enables the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 1 to the task's bit in the +//! CLA1SOFTINTEN register. By setting a task's SOFTINT bit, you disable its +//! ability to generate an end-of-task interrupt +//! For example, if we enable Task 2's SOFTINT bit, we disable its ability to +//! generate an end-of-task interrupt, but now any running CLA task has the +//! ability to force task 2's interrupt (through the CLA1INTFRC register) to +//! the main CPU. This interrupt will be handled by the End-of-Task 2 interrupt +//! handler even though the interrupt was not caused by Task 2 running to +//! completion. This allows programmers to generate interrupts while a control +//! task is running. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Enabling a given task's software interrupt enable bit disables that +//! task's ability to generate an End-of-Task interrupt to the main CPU, +//! however, should another task force its interrupt (through the CLA1INTFRC +//! register), it will be handled by that task's End-of-Task Interrupt Handler. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Enable Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTEN) |= taskFlags; + + __medis(); +} + +//***************************************************************************** +// +//! Disable the Software Interrupt for a given CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks for which software +//! interrupts are to be disabled, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to disable software interrupts of all +//! tasks +//! +//! This function disables the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 0 to the task's bit in the +//! CLA1SOFTINTEN register. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Disabling a given task's software interrupt ability allows that +//! task to generate an End-of-Task interrupt to the main CPU. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Enable Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTEN) &= ~taskFlags; + + __medis(); +} +//***************************************************************************** +// +//! Force a particular Task's Software Interrupt +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the task's whose software +//! interrupts are to be forced, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to force software interrupts for all tasks +//! +//! This function forces the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 1 to the task's bit in the +//! CLA1INTFRC register. +//! For example, if we enable Task 2's SOFTINT bit, we disable its ability to +//! generate an end-of-task interrupt, but now any running CLA task has the +//! ability to force task 2's interrupt (through the CLA1INTFRC register) to +//! the main CPU. This interrupt will be handled by the End-of-Task 2 interrupt +//! handler even though the interrupt was not caused by Task 2 running to +//! completion. This allows programmers to generate interrupts while a control +//! task is running. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Enabling a given task's software interrupt enable bit disables that +//! task's ability to generate an End-of-Task interrupt to the main CPU, +//! however, should another task force its interrupt (through the CLA1INTFRC +//! register), it will be handled by that task's End-of-Task Interrupt Handler. +//! -# This function will set the INTFRC bit for a task, but does not check +//! that its SOFTINT bit is set. It falls to the user to ensure that software +//! interrupt for a given task is enabled before it can be forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_forceSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Force Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTFRC) |= taskFlags; + + __medis(); +} + +#endif // #if defined(__TMS320C28XX_CLA1__) || defined(__TMS320C28XX_CLA2__) + +// +// These functions can only be called from the C28x +// +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! Configures CLA task triggers. +//! +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. +//! \param trigger is the trigger source to be assigned to the selected task. +//! +//! This function configures the trigger source of a CLA task. The +//! \e taskNumber parameter indicates which task is being configured, and the +//! \e trigger parameter is the interrupt source from a specific peripheral +//! interrupt (or software) that will trigger the task. +//! +//! \return None. +// +//***************************************************************************** +extern void +CLA_setTriggerSource(CLA_TaskNumber taskNumber, CLA_Trigger trigger); + +#endif //#ifdef __TMS320C28XX__ +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CLA_H diff --git a/gpio_bitfield_cpu2/device/driverlib/clb.c b/gpio_bitfield_cpu2/device/driverlib/clb.c new file mode 100644 index 0000000..2e79cb4 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/clb.c @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: clb.c +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "clb.h" + +//***************************************************************************** +// +// CLB_configCounterLoadMatch +// +//***************************************************************************** +void CLB_configCounterLoadMatch(uint32_t base, CLB_Counters counterID, + uint32_t load, uint32_t match1, uint32_t match2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + switch(counterID) + { + case CLB_CTR0: + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_MATCH2, match2); + break; + + case CLB_CTR1: + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_MATCH2, match2); + break; + + case CLB_CTR2: + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_MATCH2, match2); + break; + + default: + // + // Invalid counterID value + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// CLB_clearFIFOs +// +//***************************************************************************** +void CLB_clearFIFOs(uint32_t base) +{ + uint16_t i; + + ASSERT(CLB_isBaseValid(base)); + + for(i = 0U; i < CLB_FIFO_SIZE; i++) + { + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(i)) = 0U; + } + + HWREG(base + CLB_LOGICCTL + CLB_O_BUF_PTR) = 0U; +} + +//***************************************************************************** +// +// CLB_writeFIFOs +// +//***************************************************************************** +void CLB_writeFIFOs(uint32_t base , const uint32_t pullData[]) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Clear the FIFO and pointer + // + CLB_clearFIFOs(base); + + // + // Write data into the FIFO. + // + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(0U)) = pullData[0U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(1U)) = pullData[1U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(2U)) = pullData[2U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(3U)) = pullData[3U]; +} + +//***************************************************************************** +// +// CLB_readFIFOs +// +//***************************************************************************** +void CLB_readFIFOs(uint32_t base , uint32_t pushData[]) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Read data from the FIFO. + // + pushData[0U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(0U)) ; + pushData[1U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(1U)) ; + pushData[2U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(2U)) ; + pushData[3U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(3U)) ; +} + + diff --git a/gpio_bitfield_cpu2/device/driverlib/clb.h b/gpio_bitfield_cpu2/device/driverlib/clb.h new file mode 100644 index 0000000..37cb68f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/clb.h @@ -0,0 +1,1290 @@ +//########################################################################### +// +// FILE: clb.h +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CLB_H +#define CLB_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup clb_api CLB +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_clb.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Address offsets from LOGICCFG to LOGICCTL and DATAEXCH register memory maps +// +//***************************************************************************** +#define CLB_LOGICCTL 0x0100U +#define CLB_DATAEXCH 0x0200U + +//***************************************************************************** +// +// Address offsets for CLB-internal memory space +// +//***************************************************************************** +#define CLB_ADDR_COUNTER_0_LOAD 0x0U +#define CLB_ADDR_COUNTER_1_LOAD 0x1U +#define CLB_ADDR_COUNTER_2_LOAD 0x2U + +#define CLB_ADDR_COUNTER_0_MATCH1 0x4U +#define CLB_ADDR_COUNTER_1_MATCH1 0x5U +#define CLB_ADDR_COUNTER_2_MATCH1 0x6U + +#define CLB_ADDR_COUNTER_0_MATCH2 0x8U +#define CLB_ADDR_COUNTER_1_MATCH2 0x9U +#define CLB_ADDR_COUNTER_2_MATCH2 0xAU + +#define CLB_ADDR_HLC_R0 0xCU +#define CLB_ADDR_HLC_R1 0xDU +#define CLB_ADDR_HLC_R2 0xEU +#define CLB_ADDR_HLC_R3 0xFU + +#define CLB_ADDR_HLC_BASE 0x20U +#define CLB_NUM_HLC_INSTR 31U + +//***************************************************************************** +// +// PUSH/PULL FIFO size (32-bit registers) +// +//***************************************************************************** +#define CLB_FIFO_SIZE 4U + +//***************************************************************************** +// +// Key to enable writes to the CLB registers +// +//***************************************************************************** +#define CLB_LOCK_KEY 0x5A5AU + +//***************************************************************************** +// +// Shift and masks needed by the API for Input selection +// +//***************************************************************************** +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_M 0x20U +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_S 28U +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_BITM (uint32_t)1U + +//***************************************************************************** +// +//! Values that can be passed to control the CLB output enable signal. It can +//! be passed to CLB_setOutputMask() as the \e outputMask parameter. +// +//***************************************************************************** +#define CLB_OUTPUT_00 0x00000001U //!< Mask for CLB OUTPUT ENABLE/DISABLE 0 +#define CLB_OUTPUT_01 0x00000002U //!< Mask for CLB OUTPUT ENABLE/DISABLE 1 +#define CLB_OUTPUT_02 0x00000004U //!< Mask for CLB OUTPUT ENABLE/DISABLE 2 +#define CLB_OUTPUT_03 0x00000008U //!< Mask for CLB OUTPUT ENABLE/DISABLE 3 +#define CLB_OUTPUT_04 0x00000010U //!< Mask for CLB OUTPUT ENABLE/DISABLE 4 +#define CLB_OUTPUT_05 0x00000020U //!< Mask for CLB OUTPUT ENABLE/DISABLE 5 +#define CLB_OUTPUT_06 0x00000040U //!< Mask for CLB OUTPUT ENABLE/DISABLE 6 +#define CLB_OUTPUT_07 0x00000080U //!< Mask for CLB OUTPUT ENABLE/DISABLE 7 +#define CLB_OUTPUT_08 0x00000100U //!< Mask for CLB OUTPUT ENABLE/DISABLE 8 +#define CLB_OUTPUT_09 0x00000200U //!< Mask for CLB OUTPUT ENABLE/DISABLE 9 +#define CLB_OUTPUT_10 0x00000400U //!< Mask for CLB OUTPUT ENABLE/DISABLE 10 +#define CLB_OUTPUT_11 0x00000800U //!< Mask for CLB OUTPUT ENABLE/DISABLE 11 +#define CLB_OUTPUT_12 0x00001000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 12 +#define CLB_OUTPUT_13 0x00002000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 13 +#define CLB_OUTPUT_14 0x00004000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 14 +#define CLB_OUTPUT_15 0x00008000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 15 +#define CLB_OUTPUT_16 0x00010000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 16 +#define CLB_OUTPUT_17 0x00020000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 17 +#define CLB_OUTPUT_18 0x00040000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 18 +#define CLB_OUTPUT_19 0x00080000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 19 +#define CLB_OUTPUT_20 0x00100000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 20 +#define CLB_OUTPUT_21 0x00200000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 21 +#define CLB_OUTPUT_22 0x00400000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 22 +#define CLB_OUTPUT_23 0x00800000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 23 +#define CLB_OUTPUT_24 0x01000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 24 +#define CLB_OUTPUT_25 0x02000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 25 +#define CLB_OUTPUT_26 0x04000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 26 +#define CLB_OUTPUT_27 0x08000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 27 +#define CLB_OUTPUT_28 0x10000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 28 +#define CLB_OUTPUT_29 0x20000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 29 +#define CLB_OUTPUT_30 0x40000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 30 +#define CLB_OUTPUT_31 0x80000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 31 + +//***************************************************************************** +// +//! Values that can be passed to select CLB input signal +// +//***************************************************************************** +typedef enum +{ + CLB_IN0 = 0, //!< Input 0 + CLB_IN1 = 1, //!< Input 1 + CLB_IN2 = 2, //!< Input 2 + CLB_IN3 = 3, //!< Input 3 + CLB_IN4 = 4, //!< Input 4 + CLB_IN5 = 5, //!< Input 5 + CLB_IN6 = 6, //!< Input 6 + CLB_IN7 = 7 //!< Input 7 +} CLB_Inputs; + +//***************************************************************************** +// +//! Values that can be passed to select CLB output signal. It can be passed to +//! CLB_configOutputLUT() as the \e outID parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_OUT0 = 0, //!< Output 0 + CLB_OUT1 = 1, //!< Output 1 + CLB_OUT2 = 2, //!< Output 2 + CLB_OUT3 = 3, //!< Output 3 + CLB_OUT4 = 4, //!< Output 4 + CLB_OUT5 = 5, //!< Output 5 + CLB_OUT6 = 6, //!< Output 6 + CLB_OUT7 = 7 //!< Output 7 +} CLB_Outputs; + +//***************************************************************************** +// +//! Values that can be passed to select CLB counter. It can be passed to +//! CLB_configCounterLoadMatch() as the \e counterID parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_CTR0 = 0, //!< Counter 0 + CLB_CTR1 = 1, //!< Counter 1 + CLB_CTR2 = 2 //!< Counter 2 +} CLB_Counters; + +//***************************************************************************** +// +//! Values that can be passed to CLB_getRegister() as the \e registerID +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_REG_HLC_R0 = CLB_O_DBG_R0, //!< HLC R0 register + CLB_REG_HLC_R1 = CLB_O_DBG_R1, //!< HLC R1 register + CLB_REG_HLC_R2 = CLB_O_DBG_R2, //!< HLC R2 register + CLB_REG_HLC_R3 = CLB_O_DBG_R3, //!< HLC R3 register + CLB_REG_CTR_C0 = CLB_O_DBG_C0, //!< Counter 0 register + CLB_REG_CTR_C1 = CLB_O_DBG_C1, //!< Counter 1 register + CLB_REG_CTR_C2 = CLB_O_DBG_C2 //!< Counter 2 register +} CLB_Register; + +//***************************************************************************** +// +//! Values that can be passed to CLB_selectInputFilter() as the \e filterType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_FILTER_NONE = 0, //!< No filtering + CLB_FILTER_RISING_EDGE = 1, //!< Rising edge detect + CLB_FILTER_FALLING_EDGE = 2, //!< Falling edge detect + CLB_FILTER_ANY_EDGE = 3 //!< Any edge detect +} CLB_FilterType; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configGPInputMux() as the \e gpMuxCfg +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_GP_IN_MUX_EXTERNAL = 0, //!< Use external input path + CLB_GP_IN_MUX_GP_REG = 1 //!< Use CLB_GP_REG bit value as input +} CLB_GPInputMux; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configLocalInputMux() as the +//! \e localMuxCfg parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_LOCAL_IN_MUX_GLOBAL_IN = 0, //!< Global input mux selection + CLB_LOCAL_IN_MUX_EPWM_DCAEVT1 = 1, //!< EPWMx DCAEVT1 + CLB_LOCAL_IN_MUX_EPWM_DCAEVT2 = 2, //!< EPWMx DCAEVT2 + CLB_LOCAL_IN_MUX_EPWM_DCBEVT1 = 3, //!< EPWMx DCBEVT1 + CLB_LOCAL_IN_MUX_EPWM_DCBEVT2 = 4, //!< EPWMx DCBEVT2 + CLB_LOCAL_IN_MUX_EPWM_DCAH = 5, //!< EPWMx DCAH + CLB_LOCAL_IN_MUX_EPWM_DCAL = 6, //!< EPWMx DCAL + CLB_LOCAL_IN_MUX_EPWM_DCBH = 7, //!< EPWMx DCBH + CLB_LOCAL_IN_MUX_EPWM_DCBL = 8, //!< EPWMx DCBL + CLB_LOCAL_IN_MUX_EPWM_OST = 9, //!< EPWMx OST + CLB_LOCAL_IN_MUX_EPWM_CBC = 10, //!< EPWMx CBC + CLB_LOCAL_IN_MUX_ECAP_ECAPIN = 11, //!< ECAPx ECAPIN + CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT = 12, //!< ECAPx ECAP_OUT + CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT_EN = 13, //!< ECAPx ECAP_OUT_EN + CLB_LOCAL_IN_MUX_ECAP_CEVT1 = 14, //!< ECAPx CEVT1 + CLB_LOCAL_IN_MUX_ECAP_CEVT2 = 15, //!< ECAPx CEVT2 + CLB_LOCAL_IN_MUX_ECAP_CEVT3 = 16, //!< ECAPx CEVT3 + CLB_LOCAL_IN_MUX_ECAP_CEVT4 = 17, //!< ECAPx CEVT4 + CLB_LOCAL_IN_MUX_EQEP_EQEPA = 18, //!< EQEPx EQEPA + CLB_LOCAL_IN_MUX_EQEP_EQEPB = 19, //!< EQEPx EQEPB + CLB_LOCAL_IN_MUX_EQEP_EQEPI = 20, //!< EQEPx EQEPI + CLB_LOCAL_IN_MUX_EQEP_EQEPS = 21, //!< EQEPx EQEPS + CLB_LOCAL_IN_MUX_CPU1_TBCLKSYNC = 22, //!< CPU1.TBCLKSYNC + CLB_LOCAL_IN_MUX_CPU2_TBCLKSYNC = 23, //!< CPU2.TBCLKSYNC + CLB_LOCAL_IN_MUX_CPU1_HALT = 24, //!< CPU1.HALT + CLB_LOCAL_IN_MUX_CPU2_HALT = 25, //!< CPU2.HALT +} CLB_LocalInputMux; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configGlobalInputMux() as the +//! \e globalMuxCfg parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_GLOBAL_IN_MUX_EPWM1A = 0, //!< EPWM1A + CLB_GLOBAL_IN_MUX_EPWM1A_OE = 1, //!< EPWM1A trip output + CLB_GLOBAL_IN_MUX_EPWM1B = 2, //!< EPWM1B + CLB_GLOBAL_IN_MUX_EPWM1B_OE = 3, //!< EPWM1B trip output + CLB_GLOBAL_IN_MUX_EPWM1_CTR_ZERO = 4, //!< EPWM1 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM1_CTR_PRD = 5, //!< EPWM1 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM1_CTRDIR = 6, //!< EPWM1 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM1_TBCLK = 7, //!< EPWM1 TBCLK + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPA = 8, //!< EPWM1 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPB = 9, //!< EPWM1 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPC = 10, //!< EPWM1 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPD = 11, //!< EPWM1 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM1A_AQ = 12, //!< EPWM1A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM1B_AQ = 13, //!< EPWM1B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM1A_DB = 14, //!< EPWM1A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM1B_DB = 15, //!< EPWM1B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM2A = 16, //!< EPWM2A + CLB_GLOBAL_IN_MUX_EPWM2A_OE = 17, //!< EPWM2A trip output + CLB_GLOBAL_IN_MUX_EPWM2B = 18, //!< EPWM2B + CLB_GLOBAL_IN_MUX_EPWM2B_OE = 19, //!< EPWM2B trip output + CLB_GLOBAL_IN_MUX_EPWM2_CTR_ZERO = 20, //!< EPWM2 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM2_CTR_PRD = 21, //!< EPWM2 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM2_CTRDIR = 22, //!< EPWM2 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM2_TBCLK = 23, //!< EPWM2 TBCLK + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPA = 24, //!< EPWM2 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPB = 25, //!< EPWM2 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPC = 26, //!< EPWM2 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPD = 27, //!< EPWM2 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM2A_AQ = 28, //!< EPWM2A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM2B_AQ = 29, //!< EPWM2B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM2A_DB = 30, //!< EPWM2A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM2B_DB = 31, //!< EPWM2B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM3A = 32, //!< EPWM3A + CLB_GLOBAL_IN_MUX_EPWM3A_OE = 33, //!< EPWM3A trip output + CLB_GLOBAL_IN_MUX_EPWM3B = 34, //!< EPWM3B + CLB_GLOBAL_IN_MUX_EPWM3B_OE = 35, //!< EPWM3B trip output + CLB_GLOBAL_IN_MUX_EPWM3_CTR_ZERO = 36, //!< EPWM3 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM3_CTR_PRD = 37, //!< EPWM3 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM3_CTRDIR = 38, //!< EPWM3 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM3_TBCLK = 39, //!< EPWM3 TBCLK + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPA = 40, //!< EPWM3 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPB = 41, //!< EPWM3 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPC = 42, //!< EPWM3 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPD = 43, //!< EPWM3 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM3A_AQ = 44, //!< EPWM3A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM3B_AQ = 45, //!< EPWM3B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM3A_DB = 46, //!< EPWM3A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM3B_DB = 47, //!< EPWM3B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM4A = 48, //!< EPWM4A + CLB_GLOBAL_IN_MUX_EPWM4A_OE = 49, //!< EPWM4A trip output + CLB_GLOBAL_IN_MUX_EPWM4B = 50, //!< EPWM4B + CLB_GLOBAL_IN_MUX_EPWM4B_OE = 51, //!< EPWM4B trip output + CLB_GLOBAL_IN_MUX_EPWM4_CTR_ZERO = 52, //!< EPWM4 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM4_CTR_PRD = 53, //!< EPWM4 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM4_CTRDIR = 54, //!< EPWM4 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM4_TBCLK = 55, //!< EPWM4 TBCLK + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPA = 56, //!< EPWM4 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPB = 57, //!< EPWM4 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPC = 58, //!< EPWM4 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPD = 59, //!< EPWM4 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM4A_AQ = 60, //!< EPWM4A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM4B_AQ = 61, //!< EPWM4B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM4A_DB = 62, //!< EPWM4A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM4B_DB = 63, //!< EPWM4B DB submodule output + + CLB_GLOBAL_IN_MUX_CLB_AUXSIG0 = 64, //!< CLB X-BAR AUXSIG0 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG1 = 65, //!< CLB X-BAR AUXSIG1 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG2 = 66, //!< CLB X-BAR AUXSIG2 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG3 = 67, //!< CLB X-BAR AUXSIG3 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG4 = 68, //!< CLB X-BAR AUXSIG4 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG5 = 69, //!< CLB X-BAR AUXSIG5 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG6 = 70, //!< CLB X-BAR AUXSIG6 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG7 = 71, //!< CLB X-BAR AUXSIG7 + +} CLB_GlobalInputMux; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +// +//! +//! Checks the CLB base address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function determines if a CLB base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool CLB_isBaseValid(uint32_t base) +{ + return( + (base == CLB1_BASE) || + (base == CLB2_BASE) || + (base == CLB3_BASE) || + (base == CLB4_BASE) + ); +} + +//***************************************************************************** +// +//! +//! Checks the CLB internal memory address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function determines if a CLB base address is valid. +//! +//! \return Returns \b true if the address is valid and \b false otherwise. +// +//***************************************************************************** +static inline bool CLB_isAddressValid(uint32_t address) +{ + return(address <= (CLB_ADDR_HLC_BASE + CLB_NUM_HLC_INSTR)); +} +#endif + +//***************************************************************************** +// +//! Set global enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function enables the CLB via global enable register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableCLB(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREGH(base + CLB_LOGICCTL + CLB_O_LOAD_EN) |= CLB_LOAD_EN_GLOBAL_EN; + EDIS; +} + +//***************************************************************************** +// +//! Clear global enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function disables the CLB via global enable register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_disableCLB(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREGH(base + CLB_LOGICCTL + CLB_O_LOAD_EN) &= ~CLB_LOAD_EN_GLOBAL_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enable CLB lock. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function enables the lock bit of the lock register. The lock can only +//! be set once and can only be cleared by a device reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableLock(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Setting the lock bit requires key 0x5A5A to be written at the same time + // + EALLOW; + HWREG(base + CLB_LOGICCTL + CLB_O_LOCK) = + (uint32_t)CLB_LOCK_LOCK | ((uint32_t)CLB_LOCK_KEY << CLB_LOCK_KEY_S); + EDIS; +} + +//***************************************************************************** +// +//! Write value to address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param address is the address of CLB internal memory. +//! \param value is the value to write to specified address. +//! +//! This function writes the specified value to CLB internal memory. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_writeInterface(uint32_t base, uint32_t address, + uint32_t value) +{ + ASSERT(CLB_isBaseValid(base)); + ASSERT(CLB_isAddressValid(address)); + + EALLOW; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_ADDR) = address; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_DATA) = value; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_EN) |= CLB_LOAD_EN_LOAD_EN; + EDIS; +} + +//***************************************************************************** +// +//! Select input filter type. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param filterType is the selected type of filter applied to the input. +//! +//! This function configures the filter selection for the specified input. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e filterType parameter can have one enumeration value from +//! CLB_FilterType. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectInputFilter(uint32_t base, CLB_Inputs inID, + CLB_FilterType filterType) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each input has a 2-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID << 1; + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER) = + (HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER) & + ~(CLB_INPUT_FILTER_FIN0_M << shiftVal)) | + ((uint16_t)filterType << shiftVal); +} + +//***************************************************************************** +// +//! Enables synchronization of an input signal. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! +//! This function enables synchronization on the specified input signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableSynchronization(uint32_t base, CLB_Inputs inID) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER + 1U) |= + (1U << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Disables synchronization of an input signal. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! +//! This function disables synchronization on the specified input signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_disableSynchronization(uint32_t base, CLB_Inputs inID) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER + 1U) &= + ~(1U << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Configures the general purpose input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param gpMuxCfg is the mux selection for the general purpose input mux. +//! +//! This function configures the general purpose input mux. The \e gpMuxCfg +//! parameter can select either the use of an external input signal +//! (\b CLB_GP_IN_MUX_EXTERNAL) or the use of the corresponding CLB_GP_REG bit +//! as an input (\b CLB_GP_IN_MUX_GP_REG). +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \sa CLB_setGPREG() to write to the CLB_GP_REG. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configGPInputMux(uint32_t base, CLB_Inputs inID, + CLB_GPInputMux gpMuxCfg) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_IN_MUX_SEL_0) = + (HWREGH(base + CLB_LOGICCTL + CLB_O_IN_MUX_SEL_0) & + ~(CLB_IN_MUX_SEL_0_SEL_GP_IN_0 << (uint16_t)inID)) | + ((uint16_t)gpMuxCfg << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Sets the CLB_GP_REG register value. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param gpRegVal is the value to be written to CLB_GP_REG. +//! +//! This function writes to the CLB_GP_REG register. When the general purpose +//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal +//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and +//! so on). +//! +//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for +//! an input signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setGPREG(uint32_t base, uint32_t gpRegVal) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREG(base + CLB_LOGICCTL + CLB_O_GP_REG) = gpRegVal; +} + +//***************************************************************************** +// +//! Gets the CLB_GP_REG register value. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function writes to the CLB_GP_REG register. When the general purpose +//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal +//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and +//! so on). +//! +//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for +//! an input signal. +//! +//! \return CLB_GP_REG value. +// +//***************************************************************************** +static inline uint32_t CLB_getGPREG(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + CLB_O_GP_REG)); +} + +//***************************************************************************** +// +//! Configures the local input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param localMuxCfg is the mux selection for the local input mux. +//! +//! This function configures the local input mux for the specified input +//! signal. +//! +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e localMuxCfg parameter can have one enumeration value from +//! CLB_LocalInputMux. +//! +//! \note The local input mux options' peripheral sources depend on which +//! instance of the CLB (\e base) you are using. For example, for CLB1 the +//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2. +//! See your technical reference manual for details. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configLocalInputMux(uint32_t base, CLB_Inputs inID, + CLB_LocalInputMux localMuxCfg) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each local input has a 5-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID * CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S; + + if(inID < CLB_IN4) + { + HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_1) = + (HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_1) & + ~((uint32_t)CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)localMuxCfg << shiftVal); + } + else + { + // + // Calculating shift amount for inputs > input3 + // + shiftVal -= 4U * CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S; + HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_2) = + (HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_2) & + ~((uint32_t)CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)localMuxCfg << shiftVal); + } +} + +//***************************************************************************** +// +//! Configures the global input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param globalMuxCfg is the mux selection for the global input mux. +//! +//! This function configures the global input mux for the specified input +//! signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e globalMuxCfg parameter can have one enumeration value from +//! CLB_GlobalInputMux. +//! +//! \note The global input mux options' peripheral sources depend on which +//! instance of the CLB (\e base) you are using. For example, for CLB1 the +//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2. +//! See your technical reference manual for details. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configGlobalInputMux(uint32_t base, CLB_Inputs inID, + CLB_GlobalInputMux globalMuxCfg) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each input has a 5-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID * CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S; + + if(inID < CLB_IN4) + { + HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_1) = + (HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_1) & + ~((uint32_t)CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)globalMuxCfg << shiftVal); + } + else + { + shiftVal -= 4U * CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S; + HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_2) = + (HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_2) & + ~((uint32_t)CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)globalMuxCfg << shiftVal); + } +} + +//***************************************************************************** +// +//! Controls the output enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param outputMask is a mask of the outputs to be enabled. +//! \param enable is a switch to decide if the CLB outputs need to be enabled +//! or not. +//! +//! This function is used to enable and disable CLB outputs by writing a mask +//! to CLB_OUT_EN. Each bit corresponds to a CLB output. When a bit is 1, the +//! corresponding output is enabled; when a bit is 0, the output is disabled. +//! +//! The \e outputMask parameter takes a logical OR of any of the CLB_OUTPUT_0x +//! values that correspond to the CLB OUTPUT ENABLE for the respective outputs. +//! The \e enable parameter can have one of the values from: +//! false: Disable the respective CLB outputs +//! true: Enable the respective CLB outputs +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setOutputMask(uint32_t base, uint32_t outputMask , + bool enable) +{ + ASSERT(CLB_isBaseValid(base)); + + if(enable == true) + { + HWREG(base + CLB_LOGICCTL + CLB_O_OUT_EN) |= outputMask; + } + else + { + HWREG(base + CLB_LOGICCTL + CLB_O_OUT_EN) &= ~outputMask; + } +} + +//***************************************************************************** +// +//! Reads the interrupt tag register. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! \return Returns the value in the interrupt tag register which is a 6-bit +//! constant set by the HLC. +// +//***************************************************************************** +static inline uint16_t CLB_getInterruptTag(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREGH(base + CLB_LOGICCTL + CLB_O_INTR_TAG_REG)); +} + +//***************************************************************************** +// +//! Clears the interrupt tag register. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function clears the interrupt tag register, setting it to 0. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_clearInterruptTag(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INTR_TAG_REG) = 0U; +} + +//***************************************************************************** +// +//! Selects LUT4 inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param lut4In0 is the value for LUT4 input signal 0. Generated by tool as +//! \b TILEx_CFG_LUT4_IN0. +//! \param lut4In1 is the value for LUT4 input signal 1. Generated by tool as +//! \b TILEx_CFG_LUT4_IN1. +//! \param lut4In2 is the value for LUT4 input signal 2. Generated by tool as +//! \b TILEx_CFG_LUT4_IN2. +//! \param lut4In3 is the value for LUT4 input signal 3. Generated by tool as +//! \b TILEx_CFG_LUT4_IN3. +//! +//! This function configures the LUT4 block's input signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectLUT4Inputs(uint32_t base, uint32_t lut4In0, + uint32_t lut4In1, uint32_t lut4In2, + uint32_t lut4In3) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_LUT4_IN0) = lut4In0; + HWREG(base + CLB_O_LUT4_IN1) = lut4In1; + HWREG(base + CLB_O_LUT4_IN2) = lut4In2; + HWREG(base + CLB_O_LUT4_IN3) = lut4In3; + EDIS; +} + +//***************************************************************************** +// +//! Configures LUT4 functions. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param lut4Fn10 is the equation value for LUT4 blocks 0 and 1. Generated by +//! tool as \b TILEx_CFG_LUT4_FN10. +//! \param lut4Fn2 is the equation value for LUT4 block2. Generated by tool as +//! \b TILEx_CFG_LUT4_FN2. +//! +//! This function configures the LUT4 block's equations. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configLUT4Function(uint32_t base, uint32_t lut4Fn10, + uint32_t lut4Fn2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_LUT4_FN1_0) = lut4Fn10; + HWREG(base + CLB_O_LUT4_FN2) = lut4Fn2; + EDIS; +} + +//***************************************************************************** +// +//! Selects FSM inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param external0 is the value for FSM external 0 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXT_IN0. +//! \param external1 is the value for FSM external 1 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXT_IN1. +//! \param extra0 is the value for FSM extra 0 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXTRA_IN0. +//! \param extra1 is the value for FSM extra 1 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXTRA_IN1. +//! +//! This function configures the FSM block's external inputs and extra external +//! inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectFSMInputs(uint32_t base, uint32_t external0, + uint32_t external1, uint32_t extra0, + uint32_t extra1) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_EXTERNAL_IN0) = external0; + HWREG(base + CLB_O_FSM_EXTERNAL_IN1) = external1; + HWREG(base + CLB_O_FSM_EXTRA_IN0) = extra0; + HWREG(base + CLB_O_FSM_EXTRA_IN1) = extra1; + EDIS; +} + +//***************************************************************************** +// +//! Configures FSM LUT function. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param fsmLutFn10 is the value for FSM 0 & FSM 1 LUT function. Generated +//! by tool as \b TILEx_CFG_FSM_LUT_FN10. +//! \param fsmLutFn2 is the value for FSM 2 LUT function. Generated by tool as +//! \b TILEx_CFG_FSM_LUT_FN2. +//! +//! This function configures the FSM block's LUT equations. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configFSMLUTFunction(uint32_t base, uint32_t fsmLutFn10, + uint32_t fsmLutFn2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_LUT_FN1_0) = fsmLutFn10; + HWREG(base + CLB_O_FSM_LUT_FN2) = fsmLutFn2; + EDIS; +} + +//***************************************************************************** +// +//! Configures FSM next state. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param nextState0 is the value for FSM 0's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_0. +//! \param nextState1 is the value for FSM 1's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_1. +//! \param nextState2 is the value for FSM 2's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_2. +//! +//! This function configures the FSM's next state equation. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configFSMNextState(uint32_t base, uint32_t nextState0, + uint32_t nextState1, + uint32_t nextState2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_NEXT_STATE_0) = nextState0; + HWREG(base + CLB_O_FSM_NEXT_STATE_1) = nextState1; + HWREG(base + CLB_O_FSM_NEXT_STATE_2) = nextState2; + EDIS; +} + +//***************************************************************************** +// +//! Selects Counter inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param reset is the value for counter's reset inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_RESET. +//! \param event is the value for counter's event inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_EVENT. +//! \param mode0 is the value for counter's mode 0 inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_MODE_0. +//! \param mode1 is the value for counter's mode 1 inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_MODE_1. +//! +//! This function selects the input signals to the counter block. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectCounterInputs(uint32_t base, uint32_t reset, + uint32_t event, uint32_t mode0, + uint32_t mode1) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_COUNT_RESET) = reset; + HWREG(base + CLB_O_COUNT_EVENT) = event; + HWREG(base + CLB_O_COUNT_MODE_0) = mode0; + HWREG(base + CLB_O_COUNT_MODE_1) = mode1; + EDIS; +} + +//***************************************************************************** +// +//! Configures Counter and FSM modes. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param miscCtrl is the value to represent counter and FSM modes. +//! Generated by tool as \b TILEx_CFG_MISC_CONTROL. +//! +//! This function configures the counter mode, particularly add/shift, load +//! modes. The function also configures whether the FSM should use state inputs +//! or an extra external input. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configMiscCtrlModes(uint32_t base, uint32_t miscCtrl) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_MISC_CONTROL) = miscCtrl; + EDIS; +} + +//***************************************************************************** +// +//! Configures Output LUT functions. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param outID is the specified CLB tile output signal. +//! \param outputCfg is the value for the output LUT signal function and input +//! signal selections. Generated by tool as \b TILEx_CFG_OUTLUT_n where +//! n is the output number. +//! +//! This function configures the input signals and equations of the output LUT +//! corresponding to the /e outID parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configOutputLUT(uint32_t base, CLB_Outputs outID, + uint32_t outputCfg) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_OUTPUT_LUT_0 + (sizeof(uint32_t) * outID)) = outputCfg; + EDIS; +} + +//***************************************************************************** +// +//! Configures HLC event selection. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param eventSel is the value for HLC event selection. Generated by tool as +//! \b TILEx_HLC_EVENT_SEL. +//! +//! This function configures the event selection for the High Level Controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configHLCEventSelect(uint32_t base, uint32_t eventSel) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_HLC_EVENT_SEL) = eventSel; + EDIS; +} + +//***************************************************************************** +// +//! Program HLC instruction. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param instructionNum is the index into the HLC instruction memory. For +//! example, a value of 0 corresponds to instruction 0 of event 0, +//! a value of 1 corresponds to instruction 1 of event 0, and so on up +//! to a value of 31 which corresponds to instruction 7 of event 3. +//! \param instruction is the instruction to be programmed. Generated by tool +//! as \b TILEx_HLCINSTR_n where n is the instruction number. +//! +//! This function configures the CLB internal memory corresponding to the +//! specified HLC instruction number with the given instruction. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_programHLCInstruction(uint32_t base, + uint32_t instructionNum, + uint32_t instruction) +{ + ASSERT(CLB_isBaseValid(base)); + ASSERT(instructionNum < 32U); + + CLB_writeInterface(base, CLB_ADDR_HLC_BASE + instructionNum, instruction); +} + +//***************************************************************************** +// +//! Set HLC registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param r0Init is the value to write to HLC register R0. Generated by tool +//! as \b TILEx_HLC_R0_INIT. +//! \param r1Init is the value to write to HLC register R1. Generated by tool +//! as \b TILEx_HLC_R1_INIT. +//! \param r2Init is the value to write to HLC register R2. Generated by tool +//! as \b TILEx_HLC_R2_INIT. +//! \param r3Init is the value to write to HLC register R3. Generated by tool +//! as \b TILEx_HLC_R3_INIT. +//! +//! This function configures the CLB internal memory corresponding to the HLC +//! registers R0-R3 with the specified values. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setHLCRegisters(uint32_t base, uint32_t r0Init, + uint32_t r1Init, uint32_t r2Init, + uint32_t r3Init) +{ + ASSERT(CLB_isBaseValid(base)); + + CLB_writeInterface(base, CLB_ADDR_HLC_R0, r0Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R1, r1Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R2, r2Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R3, r3Init); +} + +//***************************************************************************** +// +//! Get HLC or counter register values. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param registerID is the internal register from which to read. Can be +//! either an HLC register (\b CLB_REG_HLC_Rn) or a counter value +//! (\b CLB_REG_CTR_Cn). +//! +//! \return Returns the value in the specified HLC register or counter. +// +//***************************************************************************** +static inline uint32_t CLB_getRegister(uint32_t base, CLB_Register registerID) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + (uint32_t)registerID)); +} + +//***************************************************************************** +// +//! Get output status. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! \return Returns the output status of various components within the CLB tile +//! such as a counter match or LUT output. Use the \b CLB_DBG_OUT_* +//! masks from hw_clb.h to decode the bits. +// +//***************************************************************************** +static inline uint32_t CLB_getOutputStatus(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + CLB_O_DBG_OUT)); +} + +//***************************************************************************** +// +//! Configures Counter load and match. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param counterID is the specified counter unit. +//! \param load is the value for counter's load mode. Generated by tool as +//! \b TILEx_COUNTER_n_LOAD_VAL where n is the counter number. +//! \param match1 is the value for counter's match 1. Generated by tool as +//! \b TILEx_COUNTER_n_MATCH1_VAL where n is the counter number. +//! \param match2 is the value for counter's match 2. Generated by tool as +//! \b TILEx_COUNTER_n_MATCH2_VAL where n is the counter number. +//! +//! This function configures the CLB internal memory corresponding to the +//! counter block's load and match values. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_configCounterLoadMatch(uint32_t base, CLB_Counters counterID, + uint32_t load, uint32_t match1, + uint32_t match2); + +//***************************************************************************** +// +//! Clear FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function clears the PUSH/PULL FIFOs as well as its pointers. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_clearFIFOs(uint32_t base); + +//***************************************************************************** +// +//! Configure the FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param pullData[] is a pointer to an array of bytes which needs to be +//! written into the FIFO. The 0th FIFO data is in the 0th index. +//! +//! This function writes to the PULL FIFO. This also clears the FIFOs and +//! its pointer using the CLB_clearFIFOs() API prior to writing to +//! the FIFO. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_writeFIFOs(uint32_t base, const uint32_t pullData[]); + +//***************************************************************************** +// +//! Read FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param pushData[] is a pointer to an array of bytes which needs to be +//! read from the FIFO. +//! +//! This function reads from the PUSH FIFO. The 0th FIFO data would be in +//! the 0th index. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_readFIFOs(uint32_t base , uint32_t pushData[]); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CLB_H diff --git a/gpio_bitfield_cpu2/device/driverlib/cmpss.c b/gpio_bitfield_cpu2/device/driverlib/cmpss.c new file mode 100644 index 0000000..88f9e5f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cmpss.c @@ -0,0 +1,223 @@ +//########################################################################### +// +// FILE: cmpss.c +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cmpss.h" + +//***************************************************************************** +// +// CMPSS_configFilterHigh +// +//***************************************************************************** +void +CMPSS_configFilterHigh(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT((threshold - 1U) >= ((sampleWindow - 1U) / 2U)); + + // + // Shift the sample window and threshold values into the correct positions + // and write them to the appropriate register. + // + regValue = ((sampleWindow - 1U) << CMPSS_CTRIPHFILCTL_SAMPWIN_S) | + ((threshold - 1U) << CMPSS_CTRIPHFILCTL_THRESH_S); + + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPHFILCTL) = + (HWREGH(base + CMPSS_O_CTRIPHFILCTL) & + ~(CMPSS_CTRIPHFILCTL_SAMPWIN_M | CMPSS_CTRIPHFILCTL_THRESH_M)) | + regValue; + + // + // Set the filter sample clock prescale for the high comparator. + // + HWREGH(base + CMPSS_O_CTRIPHFILCLKCTL) = samplePrescale; + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configFilterLow +// +//***************************************************************************** +void +CMPSS_configFilterLow(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT((threshold - 1U) >= ((sampleWindow - 1U) / 2U)); + + // + // Shift the sample window and threshold values into the correct positions + // and write them to the appropriate register. + // + regValue = ((sampleWindow - 1U) << CMPSS_CTRIPLFILCTL_SAMPWIN_S) | + ((threshold - 1U) << CMPSS_CTRIPLFILCTL_THRESH_S); + + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPLFILCTL) = + (HWREGH(base + CMPSS_O_CTRIPLFILCTL) & + ~(CMPSS_CTRIPLFILCTL_SAMPWIN_M | CMPSS_CTRIPLFILCTL_THRESH_M)) | + regValue; + + // + // Set the filter sample clock prescale for the low comparator. + // + HWREGH(base + CMPSS_O_CTRIPLFILCLKCTL) = samplePrescale; + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configLatchOnPWMSYNC +// +//***************************************************************************** +void +CMPSS_configLatchOnPWMSYNC(uint32_t base, bool highEnable, bool lowEnable) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // If the highEnable is true, set the bit that will enable PWMSYNC to reset + // the high comparator digital filter latch. If not, clear the bit. + // + EALLOW; + + if(highEnable) + { + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HSYNCCLREN; + } + else + { + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_HSYNCCLREN; + } + + // + // If the lowEnable is true, set the bit that will enable PWMSYNC to reset + // the low comparator digital filter latch. If not, clear the bit. + // + if(lowEnable) + { + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LSYNCCLREN; + } + else + { + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_LSYNCCLREN; + } + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configRamp +// +//***************************************************************************** +void +CMPSS_configRamp(uint32_t base, uint16_t maxRampVal, uint16_t decrementVal, + uint16_t delayVal, uint16_t pwmSyncSrc, bool useRampValShdw) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(delayVal <= CMPSS_RAMPDLYS_DELAY_M); + ASSERT((pwmSyncSrc >= 1U) && (pwmSyncSrc <= 12U)); + + EALLOW; + + // + // Write the ramp generator source to the register + // + HWREGH(base + CMPSS_O_COMPDACCTL) = + (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~CMPSS_COMPDACCTL_RAMPSOURCE_M) | + ((uint16_t)(pwmSyncSrc - 1U) << CMPSS_COMPDACCTL_RAMPSOURCE_S); + + // + // Set or clear the bit that determines from where the max ramp value + // should be loaded. + // + if(useRampValShdw) + { + HWREGH(base + CMPSS_O_COMPDACCTL) |= CMPSS_COMPDACCTL_RAMPLOADSEL; + } + else + { + HWREGH(base + CMPSS_O_COMPDACCTL) &= ~CMPSS_COMPDACCTL_RAMPLOADSEL; + } + + EDIS; + + // + // Write the maximum ramp value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPMAXREFS) = maxRampVal; + + // + // Write the ramp decrement value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDECVALS) = decrementVal; + + // + // Write the ramp delay value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDLYS) = delayVal; +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/cmpss.h b/gpio_bitfield_cpu2/device/driverlib/cmpss.h new file mode 100644 index 0000000..25625c3 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cmpss.h @@ -0,0 +1,1325 @@ +//########################################################################### +// +// FILE: cmpss.h +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CMPSS_H +#define CMPSS_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup cmpss_api CMPSS +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_cmpss.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define CMPSS_HICMP_CTL_M (CMPSS_COMPCTL_COMPHSOURCE | \ + CMPSS_COMPCTL_COMPHINV | \ + CMPSS_COMPCTL_ASYNCHEN) + +#define CMPSS_LOCMP_CTL_M (CMPSS_COMPCTL_COMPLSOURCE | \ + CMPSS_COMPCTL_COMPLINV | \ + CMPSS_COMPCTL_ASYNCLEN) + +#ifndef DOXYGEN_PDF_IGNORE + + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configLowComparator() and +// CMPSS_configHighComparator() as the config parameter. +// +//***************************************************************************** +// +// Comparator negative input source +// +//! Input driven by internal DAC +#define CMPSS_INSRC_DAC 0x0000U +//! Input driven by external pin +#define CMPSS_INSRC_PIN 0x0001U + +// +// Extra options +// +//! Comparator output is inverted +#define CMPSS_INV_INVERTED 0x0002U +//! Asynch comparator output feeds into OR with latched digital filter output +#define CMPSS_OR_ASYNC_OUT_W_FILT 0x0040U + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configOutputsLow() and +// CMPSS_configOutputsHigh() as the config parameter. +// +//***************************************************************************** +// +// Signal driving CTRIPOUT +// +//! Asynchronous comparator output drives CTRIPOUT +#define CMPSS_TRIPOUT_ASYNC_COMP 0x0000U +//! Synchronous comparator output drives CTRIPOUT +#define CMPSS_TRIPOUT_SYNC_COMP 0x0010U +//! Filter output drives CTRIPOUT +#define CMPSS_TRIPOUT_FILTER 0x0020U +//! Latched filter output drives CTRIPOUT +#define CMPSS_TRIPOUT_LATCH 0x0030U + +// +// Signal driving CTRIP +// +//! Asynchronous comparator output drives CTRIP +#define CMPSS_TRIP_ASYNC_COMP 0x0000U +//! Synchronous comparator output drives CTRIP +#define CMPSS_TRIP_SYNC_COMP 0x0004U +//! Filter output drives CTRIP +#define CMPSS_TRIP_FILTER 0x0008U +//! Latched filter output drives CTRIP +#define CMPSS_TRIP_LATCH 0x000CU + +//***************************************************************************** +// +// Values that can be returned by CMPSS_getStatus(). +// +//***************************************************************************** +//! High digital filter output +#define CMPSS_STS_HI_FILTOUT 0x0001U +//! Latched value of high digital filter output +#define CMPSS_STS_HI_LATCHFILTOUT 0x0002U +//! Low digital filter output +#define CMPSS_STS_LO_FILTOUT 0x0100U +//! Latched value of low digital filter output +#define CMPSS_STS_LO_LATCHFILTOUT 0x0200U + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configDAC() the config parameter. +// +//***************************************************************************** +// +// When is DAC value loaded from shadow register +// +//! DAC value updated from SYSCLK +#define CMPSS_DACVAL_SYSCLK 0x0000U +//! DAC value updated from PWMSYNC +#define CMPSS_DACVAL_PWMSYNC 0x0080U + +// +// DAC reference voltage +// +//! VDDA is the voltage reference +#define CMPSS_DACREF_VDDA 0x0000U +//! VDAC is the voltage reference +#define CMPSS_DACREF_VDAC 0x0020U + +// +// DAC value source +// +//! DAC value updated from shadow register +#define CMPSS_DACSRC_SHDW 0x0000U +//! DAC value is updated from the ramp register +#define CMPSS_DACSRC_RAMP 0x0001U +#endif + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configRamp() +// as the pwmSyncSrc parameter. +// +//***************************************************************************** +#define CMPSS_PWMSYNC1 1U //!< PWMSYNC1 +#define CMPSS_PWMSYNC2 2U //!< PWMSYNC2 +#define CMPSS_PWMSYNC3 3U //!< PWMSYNC3 +#define CMPSS_PWMSYNC4 4U //!< PWMSYNC4 +#define CMPSS_PWMSYNC5 5U //!< PWMSYNC5 +#define CMPSS_PWMSYNC6 6U //!< PWMSYNC6 +#define CMPSS_PWMSYNC7 7U //!< PWMSYNC7 +#define CMPSS_PWMSYNC8 8U //!< PWMSYNC8 +#define CMPSS_PWMSYNC9 9U //!< PWMSYNC9 +#define CMPSS_PWMSYNC10 10U //!< PWMSYNC10 +#define CMPSS_PWMSYNC11 11U //!< PWMSYNC11 +#define CMPSS_PWMSYNC12 12U //!< PWMSYNC12 + + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks the CMPSS base address. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function determines if a CMPSS base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CMPSS_isBaseValid(uint32_t base) +{ + return( + (base == CMPSS1_BASE) || + (base == CMPSS2_BASE) || + (base == CMPSS3_BASE) || + (base == CMPSS4_BASE) || + (base == CMPSS5_BASE) || + (base == CMPSS6_BASE) || + (base == CMPSS7_BASE) || + (base == CMPSS8_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the CMPSS module. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function enables the CMPSS module passed into the \e base parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that enables the CMPSS module. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) |= CMPSS_COMPCTL_COMPDACE; + + EDIS; +} + +//***************************************************************************** +// +//! Disables the CMPSS module. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function disables the CMPSS module passed into the \e base parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Clear the bit that enables the CMPSS module. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) &= ~CMPSS_COMPCTL_COMPDACE; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the configuration for the high comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the high comparator. +//! +//! This function configures a comparator. The \e config parameter is the +//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if +//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values. +//! +//! The \b CMPSS_INSRC_xxx term can take on the following values to specify +//! the high comparator negative input source: +//! - \b CMPSS_INSRC_DAC - The internal DAC. +//! - \b CMPSS_INSRC_PIN - An external pin. +//! +//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output +//! should be inverted. +//! +//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the +//! asynchronous comparator output should be fed into an OR gate with the +//! latched digital filter output before it is made available for CTRIPH or +//! CTRIPOUTH. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configHighComparator(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the high comparator configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = + (HWREGH(base + CMPSS_O_COMPCTL) & ~CMPSS_HICMP_CTL_M) | config; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the configuration for the low comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the low comparator. +//! +//! This function configures a comparator. The \e config parameter is the +//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if +//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values. +//! +//! The \b CMPSS_INSRC_xxx term can take on the following values to specify +//! the low comparator negative input source: +//! - \b CMPSS_INSRC_DAC - The internal DAC. +//! - \b CMPSS_INSRC_PIN - An external pin. +//! +//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output +//! should be inverted. +//! +//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the +//! asynchronous comparator output should be fed into an OR gate with the +//! latched digital filter output before it is made available for CTRIPL or +//! CTRIPOUTL. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configLowComparator(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the low comparator configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = + (HWREGH(base + CMPSS_O_COMPCTL) & ~CMPSS_LOCMP_CTL_M) | (config << 8U); + + EDIS; +} + +//***************************************************************************** +// +//! Sets the output signal configuration for the high comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the high comparator output signals. +//! +//! This function configures a comparator's output signals CTRIP and CTRIPOUT. +//! The \e config parameter is the result of a logical OR operation between the +//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values. +//! +//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify +//! which signal drives CTRIPOUTH: +//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter. +//! +//! The \b CMPSS_TRIP_xxx term can take on the following values to specify +//! which signal drives CTRIPH: +//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIP_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configOutputsHigh(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the high comparator output settings to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = (HWREGH(base + CMPSS_O_COMPCTL) & + ~(CMPSS_COMPCTL_CTRIPOUTHSEL_M | + CMPSS_COMPCTL_CTRIPHSEL_M)) | + config; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the output signal configuration for the low comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the low comparator output signals. +//! +//! This function configures a comparator's output signals CTRIP and CTRIPOUT. +//! The \e config parameter is the result of a logical OR operation between the +//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values. +//! +//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify +//! which signal drives CTRIPOUTL: +//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter. +//! +//! The \b CMPSS_TRIP_xxx term can take on the following values to specify +//! which signal drives CTRIPL: +//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIP_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configOutputsLow(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the low comparator output settings to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = (HWREGH(base + CMPSS_O_COMPCTL) & + ~(CMPSS_COMPCTL_CTRIPOUTLSEL_M | + CMPSS_COMPCTL_CTRIPLSEL_M)) | + (config << 8U); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current comparator status. +//! +//! \param base is the base address of the comparator module. +//! +//! This function returns the current status for the comparator, specifically +//! the digital filter output and latched digital filter output. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! the following values: +//! - \b CMPSS_STS_HI_FILTOUT - High digital filter output +//! - \b CMPSS_STS_HI_LATCHFILTOUT - Latched value of high digital filter +//! output +//! - \b CMPSS_STS_LO_FILTOUT - Low digital filter output +//! - \b CMPSS_STS_LO_LATCHFILTOUT - Latched value of low digital filter output +// +//***************************************************************************** +static inline uint16_t +CMPSS_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Return contents of the status register. + // + return(HWREGH(base + CMPSS_O_COMPSTS)); +} + +//***************************************************************************** +// +//! Sets the configuration for the internal comparator DACs. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the internal DAC. +//! +//! This function configures the comparator's internal DAC. The \e config +//! parameter is the result of a logical OR operation between the +//! \b CMPSS_DACVAL_xxx, \b CMPSS_DACREF_xxx, and \b CMPSS_DACSRC_xxx. +//! +//! The \b CMPSS_DACVAL_xxx term can take on the following values to specify +//! when the DAC value is loaded from its shadow register: +//! - \b CMPSS_DACVAL_SYSCLK - Value register updated on system clock. +//! - \b CMPSS_DACVAL_PWMSYNC - Value register updated on PWM sync. +//! +//! The \b CMPSS_DACREF_xxx term can take on the following values to specify +//! which voltage supply is used as reference for the DACs: +//! - \b CMPSS_DACREF_VDDA - VDDA is the voltage reference for the DAC. +//! - \b CMPSS_DACREF_VDAC - VDAC is the voltage reference for the DAC. +//! +//! The \b CMPSS_DACSRC_xxx term can take on the following values to specify +//! the DAC value source for the high comparator's internal DAC: +//! - \b CMPSS_DACSRC_SHDW - The user-programmed DACVALS register. +//! - \b CMPSS_DACSRC_RAMP - The ramp generator RAMPSTS register +//! +//! \note The \b CMPSS_DACVAL_xxx and \b CMPSS_DACREF_xxx terms apply to +//! both the high and low comparators. \b CMPSS_DACSRC_xxx will only affect +//! the high comparator's internal DAC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configDAC(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPDACCTL) = + (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~(CMPSS_COMPDACCTL_SWLOADSEL | CMPSS_COMPDACCTL_SELREF | + CMPSS_COMPDACCTL_DACSOURCE)) | config; + EDIS; +} + +//***************************************************************************** +// +//! Sets the value of the internal DAC of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! \param value is the value actively driven by the DAC. +//! +//! This function sets the 12-bit value driven by the internal DAC of the high +//! comparator. This function will load the value into the shadow register from +//! which the actual DAC value register will be loaded. To configure which +//! event causes this shadow load to take place, use CMPSS_configDAC(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setDACValueHigh(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 4096U); + + // + // Write the DAC value to the DAC value shadow register. + // + HWREGH(base + CMPSS_O_DACHVALS) = value; +} + +//***************************************************************************** +// +//! Sets the value of the internal DAC of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! \param value is the value actively driven by the DAC. +//! +//! This function sets the 12-bit value driven by the internal DAC of the low +//! comparator. This function will load the value into the shadow register from +//! which the actual DAC value register will be loaded. To configure which +//! event causes this shadow load to take place, use CMPSS_configDAC(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setDACValueLow(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 4096U); + + // + // Write the DAC value to the DAC value shadow register. + // + HWREGH(base + CMPSS_O_DACLVALS) = value; +} + +//***************************************************************************** +// +//! Initializes the digital filter of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function initializes all the samples in the high comparator digital +//! filter to the filter input value. +//! +//! \note See CMPSS_configFilterHigh() for the proper initialization sequence +//! to avoid glitches. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_initFilterHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the high comparator filter initialization bit. + // + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPHFILCTL) |= CMPSS_CTRIPHFILCTL_FILINIT; + + EDIS; +} + +//***************************************************************************** +// +//! Initializes the digital filter of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function initializes all the samples in the low comparator digital +//! filter to the filter input value. +//! +//! \note See CMPSS_configFilterLow() for the proper initialization sequence +//! to avoid glitches. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_initFilterLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the low comparator filter initialization bit. + // + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPLFILCTL) |= CMPSS_CTRIPLFILCTL_FILINIT; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the value of the internal DAC of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function gets the value of the internal DAC of the high comparator. +//! The value is read from the \e active register--not the shadow register to +//! which CMPSS_setDACValueHigh() writes. +//! +//! \return Returns the value driven by the internal DAC of the high comparator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getDACValueHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC value to the DAC value shadow register. + // + return(HWREGH(base + CMPSS_O_DACHVALA)); +} + +//***************************************************************************** +// +//! Gets the value of the internal DAC of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function gets the value of the internal DAC of the low comparator. +//! The value is read from the \e active register--not the shadow register to +//! which CMPSS_setDACValueLow() writes. +//! +//! \return Returns the value driven by the internal DAC of the low comparator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getDACValueLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC value to the DAC value shadow register. + // + return(HWREGH(base + CMPSS_O_DACLVALA)); +} + +//***************************************************************************** +// +//! Causes a software reset of the high comparator digital filter output latch. +//! +//! \param base is the base address of the comparator module. +//! +//! This function causes a software reset of the high comparator digital filter +//! output latch. It will generate a single pulse of the latch reset signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_clearFilterLatchHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that generates a reset pulse to the digital filter latch. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HLATCHCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Causes a software reset of the low comparator digital filter output latch. +//! +//! \param base is the base address of the comparator module. +//! +//! This function causes a software reset of the low comparator digital filter +//! output latch. It will generate a single pulse of the latch reset signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_clearFilterLatchLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that generates a reset pulse to the digital filter latch. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LLATCHCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the ramp generator maximum reference value. +//! +//! \param base is the base address of the comparator module. +//! \param value the ramp maximum reference value. +//! +//! This function sets the ramp maximum reference value that will be loaded +//! into the ramp generator. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setMaxRampValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the maximum ramp value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPMAXREFS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator maximum reference value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp maximum reference value that will be +//! loaded into the ramp generator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getMaxRampValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the maximum ramp value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPMAXREFA)); +} + +//***************************************************************************** +// +//! Sets the ramp generator decrement value. +//! +//! \param base is the base address of the comparator module. +//! \param value is the ramp decrement value. +//! +//! This function sets the value that is subtracted from the ramp value on +//! every system clock cycle. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setRampDecValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the ramp decrement value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDECVALS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator decrement value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp decrement value that is subtracted from +//! the ramp value on every system clock cycle. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getRampDecValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the ramp decrement value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPDECVALA)); +} + +//***************************************************************************** +// +//! Sets the ramp generator delay value. +//! +//! \param base is the base address of the comparator module. +//! \param value is the 13-bit ramp delay value. +//! +//! This function sets the value that configures the number of system clock +//! cycles to delay the start of the ramp generator decrementer after a PWMSYNC +//! event is received. Delay value can be no greater than 8191. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setRampDelayValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 8192U); + + // + // Write the ramp delay value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDLYS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator delay value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp delay value that is subtracted from +//! the ramp value on every system clock cycle. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getRampDelayValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the ramp delay value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPDLYA)); +} + +//***************************************************************************** +// +//! Configures sync source for comparator +//! +//! \param base is the base address of the comparator module. +//! \param syncSource is the desired EPWMxSYNCPER source +//! +//! This function configures desired EPWMxSYNCPER source for comparator +//! blocks. Configured EPWMxSYNCPER signal can be used to synchronize loading +//! of DAC input value from shadow to active register. It can also be used to +//! synchronize Ramp generator, if applicable. Refer to device manual to check +//! if Ramp generator is available in the desired CMPSS instance. +//! +//! Valid values for \e syncSource parameter can be 1 to n, where n represents +//! the maximum number of EPWMSYNCPER signals available on the device. For +//! instance, passing 2 into \e syncSource will select EPWM2SYNCPER. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configureSyncSource(uint32_t base, uint16_t syncSource) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the ramp delay value to the shadow register. + // + EALLOW; + HWREGH(base + CMPSS_O_COMPDACCTL) = (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~CMPSS_COMPDACCTL_RAMPSOURCE_M) | + ((uint16_t)(syncSource - 1U) << + CMPSS_COMPDACCTL_RAMPSOURCE_S); + EDIS; +} + +//***************************************************************************** +// +//! Sets the comparator hysteresis settings. +//! +//! \param base is the base address of the comparator module. +//! \param value is the amount of hysteresis on the comparator inputs. +//! +//! This function sets the amount of hysteresis on the comparator inputs. The +//! \e value parameter indicates the amount of hysteresis desired. Passing in 0 +//! results in none, passing in 1 results in typical hysteresis, passing in 2 +//! results in 2x of typical hysteresis, and so on where \e value x of typical +//! hysteresis is the amount configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setHysteresis(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value <= 4U); + + // + // Read the ramp delay value from the register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPHYSCTL) = value; + + EDIS; +} + +//***************************************************************************** +// +//! Enables reset of HIGH comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function enables EPWMSYNCPER reset of High comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableLatchResetOnPWMSYNCHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Disables reset of HIGH comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function disables EPWMSYNCPER reset of High comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableLatchResetOnPWMSYNCHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_HSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Enables reset of LOW comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function enables EPWMSYNCPER reset of Low comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableLatchResetOnPWMSYNCLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Disables reset of LOW comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function disables EPWMSYNCPER reset of Low comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableLatchResetOnPWMSYNCLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_LSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the digital filter of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! \param samplePrescale is the number of system clock cycles between samples. +//! \param sampleWindow is the number of FIFO samples to monitor. +//! \param threshold is the majority threshold of samples to change state. +//! +//! This function configures the operation of the digital filter of the high +//! comparator. +//! +//! The \e samplePrescale parameter specifies the number of system clock cycles +//! not be passed as this parameter. The prescaler used by digital filter is 1 +//! more than \e samplePrescale value. So, the input provided should be 1 less +//! than the expected prescaler. +//! +//! The \e sampleWindow parameter configures the size of the window of FIFO +//! samples taken from the input that will be monitored to determine when to +//! change the filter output. This sample window may be no larger than 32 +//! samples. +//! +//! The \e threshold parameter configures the threshold value to be used by +//! the digital filter. +//! +//! The filter output resolves to the majority value of the sample window where +//! majority is defined by the value passed into the \e threshold parameter. +//! For proper operation, the value of \e threshold must be greater than +//! sampleWindow / 2. +//! +//! To ensure proper operation of the filter, the following is the recommended +//! function call sequence for initialization: +//! +//! -# Configure and enable the comparator using CMPSS_configHighComparator() +//! and CMPSS_enableModule() +//! -# Configure the digital filter using CMPSS_configFilterHigh() +//! -# Initialize the sample values using CMPSS_initFilterHigh() +//! -# Configure the module output signals CTRIP and CTRIPOUT using +//! CMPSS_configOutputsHigh() +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configFilterHigh(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold); + +//***************************************************************************** +// +//! Configures the digital filter of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! \param samplePrescale is the number of system clock cycles between samples. +//! \param sampleWindow is the number of FIFO samples to monitor. +//! \param threshold is the majority threshold of samples to change state. +//! +//! This function configures the operation of the digital filter of the low +//! comparator. +//! +//! The \e samplePrescale parameter specifies the number of system clock cycles +//! not be passed as this parameter. The prescaler used by digital filter is 1 +//! more than \e samplePrescale value. So, the input provided should be 1 less +//! than the expected prescaler. +//! +//! The \e sampleWindow parameter configures the size of the window of FIFO +//! samples taken from the input that will be monitored to determine when to +//! change the filter output. This sample window may be no larger than 32 +//! samples. +//! +//! The \e threshold parameter configures the threshold value to be used by +//! the digital filter. +//! +//! The filter output resolves to the majority value of the sample window where +//! majority is defined by the value passed into the \e threshold parameter. +//! For proper operation, the value of \e threshold must be greater than +//! sampleWindow / 2. +//! +//! To ensure proper operation of the filter, the following is the recommended +//! function call sequence for initialization: +//! +//! -# Configure and enable the comparator using CMPSS_configLowComparator() +//! and CMPSS_enableModule() +//! -# Configure the digital filter using CMPSS_configFilterLow() +//! -# Initialize the sample values using CMPSS_initFilterLow() +//! -# Configure the module output signals CTRIP and CTRIPOUT using +//! CMPSS_configOutputsLow() +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configFilterLow(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold); + +//***************************************************************************** +// +//! Configures whether or not the digital filter latches are reset by PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! \param highEnable indicates filter latch settings in the high comparator. +//! \param lowEnable indicates filter latch settings in the low comparator. +//! +//! This function configures whether or not the digital filter latches in both +//! the high and low comparators should be reset by PWMSYNC. If the +//! \e highEnable parameter is \b true, the PWMSYNC will be allowed to reset +//! the high comparator's digital filter latch. If it is false, the ability of +//! the PWMSYNC to reset the latch will be disabled. The \e lowEnable parameter +//! has the same effect on the low comparator's digital filter latch. +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configLatchOnPWMSYNC(uint32_t base, bool highEnable, bool lowEnable); + +//***************************************************************************** +// +//! Configures the comparator subsystem's ramp generator. +//! +//! \param base is the base address of the comparator module. +//! \param maxRampVal is the ramp maximum reference value. +//! \param decrementVal value is the ramp decrement value. +//! \param delayVal is the ramp delay value. +//! \param pwmSyncSrc is the number of the PWMSYNC source. +//! \param useRampValShdw indicates if the max ramp shadow should be used. +//! +//! This function configures many of the main settings of the comparator +//! subsystem's ramp generator. The \e maxRampVal parameter should be passed +//! the ramp maximum reference value that will be loaded into the ramp +//! generator. The \e decrementVal parameter should be passed the decrement +//! value that will be subtracted from the ramp generator on each system clock +//! cycle. The \e delayVal parameter should be passed the 13-bit number of +//! system clock cycles the ramp generator should delay before beginning to +//! decrement the ramp generator after a PWMSYNC signal is received. +//! +//! These three values may be be set individually using the +//! CMPSS_setMaxRampValue(), CMPSS_setRampDecValue(), and +//! CMPSS_setRampDelayValue() APIs. +//! +//! The number of the PWMSYNC signal to be used to reset the ramp generator +//! should be specified by passing it into the \e pwmSyncSrc parameter. For +//! instance, passing a CMPSS_PWMSYNCx into \e pwmSyncSrc will select PWMSYNCx. +//! +//! To indicate whether the ramp generator should reset with the value from the +//! ramp max reference value shadow register or with the latched ramp max +//! reference value, use the \e useRampValShdw parameter. Passing it \b true +//! will result in the latched value being bypassed. The ramp generator will be +//! loaded right from the shadow register. A value of \b false will load the +//! ramp generator from the latched value. +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configRamp(uint32_t base, uint16_t maxRampVal, uint16_t decrementVal, + uint16_t delayVal, uint16_t pwmSyncSrc, bool useRampValShdw); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CMPSS_H diff --git a/gpio_bitfield_cpu2/device/driverlib/cpu.h b/gpio_bitfield_cpu2/device/driverlib/cpu.h new file mode 100644 index 0000000..3e7385b --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cpu.h @@ -0,0 +1,172 @@ +//########################################################################### +// +// FILE: cpu.h +// +// TITLE: Useful C28x CPU defines. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CPU_H +#define CPU_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stdint.h" + +// +// External reference to the interrupt flag register (IFR) register +// +#ifndef __TMS320C28XX_CLA__ +extern __cregister volatile uint16_t IFR; +#endif + +// +// External reference to the interrupt enable register (IER) register +// +#ifndef __TMS320C28XX_CLA__ +extern __cregister volatile uint16_t IER; +#endif + +// +// Define to enable interrupts +// +#ifndef EINT +#define EINT __asm(" clrc INTM") +#endif + +// +// Define to disable interrupts +// +#ifndef DINT +#define DINT __asm(" setc INTM") +#endif + +// +// Define to enable debug events +// +#ifndef ERTM +#define ERTM __asm(" clrc DBGM") +#endif + +// +// Define to disable debug events +// +#ifndef DRTM +#define DRTM __asm(" setc DBGM") +#endif + +// +// Define to allow writes to protected registers +// +#ifndef EALLOW +#ifndef __TMS320C28XX_CLA__ +#define EALLOW __eallow() +#else +#define EALLOW __meallow() +#endif // __TMS320C28XX_CLA__ +#endif // EALLOW + +// +// Define to disable writes to protected registers +// +#ifndef EDIS +#ifndef __TMS320C28XX_CLA__ +#define EDIS __edis() +#else +#define EDIS __medis() +#endif // __TMS320C28XX_CLA__ +#endif // EDIS + +// +// Define for emulation stop +// +#ifndef ESTOP0 +#define ESTOP0 __asm(" ESTOP0") +#endif + +// +// Define for emulation stop +// +#ifndef ESTOP1 +#define ESTOP1 __asm(" ESTOP1") +#endif + +// +// Define for no operation +// +#ifndef NOP +#define NOP __asm(" NOP") +#endif + +// +// Define for putting processor into a low-power mode +// +#ifndef _DUAL_HEADERS +#ifndef IDLE +#define IDLE __asm(" IDLE") +#endif +#else +#define IDLE_ASM __asm(" IDLE"); +#endif + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// +//***************************************************************************** +extern void __eallow(void); +extern void __edis(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CPU_H diff --git a/gpio_bitfield_cpu2/device/driverlib/cputimer.c b/gpio_bitfield_cpu2/device/driverlib/cputimer.c new file mode 100644 index 0000000..5d12934 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cputimer.c @@ -0,0 +1,61 @@ +//############################################################################# +// +// FILE: cputimer.c +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#include "cputimer.h" + +//***************************************************************************** +// +// CPUTimer_setEmulationMode +// +//***************************************************************************** +void CPUTimer_setEmulationMode(uint32_t base, CPUTimer_EmulationMode mode) +{ + ASSERT(CPUTimer_isBaseValid(base)); + // + // Write to FREE_SOFT bits of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) = + (HWREGH(base + CPUTIMER_O_TCR) & + ~(CPUTIMER_TCR_FREE | CPUTIMER_TCR_SOFT)) | + (uint16_t)mode; +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/cputimer.h b/gpio_bitfield_cpu2/device/driverlib/cputimer.h new file mode 100644 index 0000000..71a7501 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/cputimer.h @@ -0,0 +1,509 @@ +//############################################################################# +// +// FILE: cputimer.h +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef CPUTIMER_H +#define CPUTIMER_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup cputimer_api CPUTimer +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_cputimer.h" +#include "debug.h" +#include "sysctl.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +//! Values that can be passed to CPUTimer_setEmulationMode() as the +//! \e mode parameter. +// +//**************************************************************************** +typedef enum +{ + //! Denotes that the timer will stop after the next decrement + CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT = 0x0000, + //! Denotes that the timer will stop when it reaches zero + CPUTIMER_EMULATIONMODE_STOPATZERO = 0x0400, + //! Denotes that the timer will run free + CPUTIMER_EMULATIONMODE_RUNFREE = 0x0800 +}CPUTimer_EmulationMode; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! CPUTimer_selectClockSource() as the \e source parameter. +// +//***************************************************************************** +typedef enum +{ + //! System Clock Source + CPUTIMER_CLOCK_SOURCE_SYS = 0x0, + //! Internal Oscillator 1 Clock Source + CPUTIMER_CLOCK_SOURCE_INTOSC1 = 0x1, + //! Internal Oscillator 2 Clock Source + CPUTIMER_CLOCK_SOURCE_INTOSC2 = 0x2, + //! External Clock Source + CPUTIMER_CLOCK_SOURCE_XTAL = 0x3, + //! Auxiliary PLL Clock Source + CPUTIMER_CLOCK_SOURCE_AUX = 0x6 +} CPUTimer_ClockSource; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! CPUTimer_selectClockSource() as the \e prescaler parameter. +// +//***************************************************************************** +typedef enum +{ + CPUTIMER_CLOCK_PRESCALER_1 = 0, //!< Prescaler value of / 1 + CPUTIMER_CLOCK_PRESCALER_2 = 1, //!< Prescaler value of / 2 + CPUTIMER_CLOCK_PRESCALER_4 = 2, //!< Prescaler value of / 4 + CPUTIMER_CLOCK_PRESCALER_8 = 3, //!< Prescaler value of / 8 + CPUTIMER_CLOCK_PRESCALER_16 = 4 //!< Prescaler value of / 16 +} CPUTimer_Prescaler; + +//***************************************************************************** +// +//! \internal +//! Checks CPU timer base address. +//! +//! \param base specifies the Timer module base address. +//! +//! This function determines if a CPU timer module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool CPUTimer_isBaseValid(uint32_t base) +{ + return((base == CPUTIMER0_BASE) || (base == CPUTIMER1_BASE) || + (base == CPUTIMER2_BASE)); +} +#endif + +//***************************************************************************** +// +//! Clears CPU timer overflow flag. +//! +//! \param base is the base address of the timer module. +//! +//! This function clears the CPU timer overflow flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_clearOverflowFlag(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TIF bit of TCR register + // + HWREGH(base + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; +} + +//***************************************************************************** +// +//! Disables CPU timer interrupt. +//! +//! \param base is the base address of the timer module. +//! +//! This function disables the CPU timer interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_disableInterrupt(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Clear TIE bit of TCR register + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TIE; +} + +//***************************************************************************** +// +//! Enables CPU timer interrupt. +//! +//! \param base is the base address of the timer module. +//! +//! This function enables the CPU timer interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_enableInterrupt(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TIE bit of TCR register + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TIE; +} + +//***************************************************************************** +// +//! Reloads CPU timer counter. +//! +//! \param base is the base address of the timer module. +//! +//! This function reloads the CPU timer counter with the values contained in +//! the CPU timer period register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_reloadTimerCounter(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TRB bit of register TCR + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TRB; +} + +//***************************************************************************** +// +//! Stops CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function stops the CPU timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_stopTimer(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TSS bit of register TCR + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Starts(restarts) CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function starts (restarts) the CPU timer. +//! +//! \b Note: This function doesn't reset the timer counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_resumeTimer(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Clear TSS bit of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Starts(restarts) CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function starts (restarts) the CPU timer. +//! +//! \b Note: This function reloads the timer counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_startTimer(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Reload the timer counter + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TRB; + + // + // Clear TSS bit of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Sets CPU timer period. +//! +//! \param base is the base address of the timer module. +//! \param periodCount is the CPU timer period count. +//! +//! This function sets the CPU timer period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_setPeriod(uint32_t base, uint32_t periodCount) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Load the MSB period Count + // + HWREG(base + CPUTIMER_O_PRD) = periodCount; +} + +//***************************************************************************** +// +//! Returns the current CPU timer counter value. +//! +//! \param base is the base address of the timer module. +//! +//! This function returns the current CPU timer counter value. +//! +//! \return Returns the current CPU timer count value. +// +//***************************************************************************** +static inline uint32_t CPUTimer_getTimerCount(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Get the TIMH:TIM registers value + // + return(HWREG(base + CPUTIMER_O_TIM)); +} + +//***************************************************************************** +// +//! Set CPU timer pre-scaler value. +//! +//! \param base is the base address of the timer module. +//! \param prescaler is the CPU timer pre-scaler value. +//! +//! This function sets the pre-scaler value for the CPU timer. For every value +//! of (prescaler + 1), the CPU timer counter decrements by 1. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_setPreScaler(uint32_t base, uint16_t prescaler) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Writes to TPR.TDDR and TPRH.TDDRH bits + // + HWREGH(base + CPUTIMER_O_TPRH) = prescaler >> 8U; + HWREGH(base + CPUTIMER_O_TPR) = (prescaler & CPUTIMER_TPR_TDDR_M) ; +} + +//***************************************************************************** +// +//! Return the CPU timer overflow status. +//! +//! \param base is the base address of the timer module. +//! +//! This function returns the CPU timer overflow status. +//! +//! \return Returns true if the CPU timer has overflowed, false if not. +// +//***************************************************************************** +static inline bool CPUTimer_getTimerOverflowStatus(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Check if TIF bits of register TCR are set + // + return(((HWREGH(base + CPUTIMER_O_TCR) & CPUTIMER_TCR_TIF) == + CPUTIMER_TCR_TIF) ? true : false); +} + +//***************************************************************************** +// +//! Select CPU Timer 2 Clock Source and Prescaler +//! +//! \param base is the base address of the timer module. +//! \param source is the clock source to use for CPU Timer 2 +//! \param prescaler is the value that configures the selected clock source +//! relative to the system clock +//! +//! This function selects the specified clock source and prescaler value +//! for the CPU timer (CPU timer 2 only). +//! +//! The \e source parameter can be any one of the following: +//! - \b CPUTIMER_CLOCK_SOURCE_SYS - System Clock +//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC1 - Internal Oscillator 1 Clock +//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC2 - Internal Oscillator 2 Clock +//! - \b CPUTIMER_CLOCK_SOURCE_XTAL - External Clock +//! - \b CPUTIMER_CLOCK_SOURCE_AUX - Auxiliary PLL Clock +//! +//! The \e prescaler parameter can be any one of the following: +//! - \b CPUTIMER_CLOCK_PRESCALER_1 - Prescaler value of / 1 +//! - \b CPUTIMER_CLOCK_PRESCALER_2 - Prescaler value of / 2 +//! - \b CPUTIMER_CLOCK_PRESCALER_4 - Prescaler value of / 4 +//! - \b CPUTIMER_CLOCK_PRESCALER_8 - Prescaler value of / 8 +//! - \b CPUTIMER_CLOCK_PRESCALER_16 - Prescaler value of / 16 +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_selectClockSource(uint32_t base, + CPUTimer_ClockSource source, + CPUTimer_Prescaler prescaler) +{ + ASSERT(base == CPUTIMER2_BASE); + + // + // Set source and prescaler for CPU Timer 2 + // + if(base == CPUTIMER2_BASE) + { + EALLOW; + + // + // Set Clock Source + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | (uint16_t)source; + SYSCTL_REGWRITE_DELAY; + + // + // Set Clock Prescaler + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M) | + ((uint16_t)prescaler < 0.0F); + + // + // Get the sign-extended offset trim value + // + oldOffsetTrim = (HWREGH(base + DAC_O_TRIM) & DAC_TRIM_OFFSET_TRIM_M); + oldOffsetTrim = ((oldOffsetTrim & (uint16_t)DAC_REG_BYTE_MASK) ^ + (uint16_t)0x80) - (uint16_t)0x80; + + // + // Calculate new offset trim value if DAC is operating at a reference + // voltage other than 2.5v. + // + newOffsetTrim = ((float32_t)(2.5 / referenceVoltage) * + (int16_t)oldOffsetTrim); + + // + // Check if the new offset trim value is valid + // + ASSERT(((int16_t)newOffsetTrim > -129) && ((int16_t)newOffsetTrim < 128)); + + // + // Set the new offset trim value + // + EALLOW; + HWREGH(base + DAC_O_TRIM) = (HWREGH(base + DAC_O_TRIM) & + ~DAC_TRIM_OFFSET_TRIM_M) | + (int16_t)newOffsetTrim; + + EDIS; + +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/dac.h b/gpio_bitfield_cpu2/device/driverlib/dac.h new file mode 100644 index 0000000..fcd866a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/dac.h @@ -0,0 +1,604 @@ +//########################################################################### +// +// FILE: dac.h +// +// TITLE: C28x DAC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DAC_H +#define DAC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dac_api DAC +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dac.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +// +// A 8-bit register mask +// +#define DAC_REG_BYTE_MASK (0xFFU) //!< Register Byte Mask + +// +// Lock Key +// +#define DAC_LOCK_KEY (0xA000U) //!< DAC Lock Key + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following are defines for the reg parameter of the +// DAC_lockRegister() and DAC_isRegisterLocked() functions. +// +//***************************************************************************** +#define DAC_LOCK_CONTROL (0x1U) //!< Lock the control register +#define DAC_LOCK_SHADOW (0x2U) //!< Lock the shadow value register +#define DAC_LOCK_OUTPUT (0x4U) //!< Lock the output enable register + +#endif // DOXYGEN_PDF_IGNORE + +//***************************************************************************** +// +//! Values that can be passed to DAC_setReferenceVoltage() as the \e source +//! parameter. +// +//***************************************************************************** +typedef enum +{ + DAC_REF_VDAC = 0, //!< VDAC reference voltage + DAC_REF_ADC_VREFHI = 1 //!< ADC VREFHI reference voltage +}DAC_ReferenceVoltage; + +//***************************************************************************** +// +//! Values that can be passed to DAC_setLoadMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + DAC_LOAD_SYSCLK = 0, //!< Load on next SYSCLK + DAC_LOAD_PWMSYNC = 4 //!< Load on next PWMSYNC specified by SYNCSEL +}DAC_LoadMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks DAC base address. +//! +//! \param base specifies the DAC module base address. +//! +//! This function determines if an DAC module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +DAC_isBaseValid(uint32_t base) +{ + return( + (base == DACA_BASE) || + (base == DACB_BASE) || + (base == DACC_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Get the DAC Revision value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC revision value. +//! +//! \return Returns the DAC revision value. +// +//***************************************************************************** +static inline uint16_t +DAC_getRevision(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the revision value. + // + return(HWREGH(base + DAC_O_REV) & DAC_REV_REV_M); +} + +//***************************************************************************** +// +//! Sets the DAC Reference Voltage +//! +//! \param base is the DAC module base address +//! \param source is the selected reference voltage +//! +//! This function sets the DAC reference voltage. +//! +//! The \e source parameter can have the following value: +//! - \b DAC_REF_VDAC - The VDAC reference voltage +//! - \b DAC_REF_ADC_VREFHI - The ADC VREFHI reference voltage +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setReferenceVoltage(uint32_t base, DAC_ReferenceVoltage source) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Set the reference voltage + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_DACREFSEL) | (uint16_t)source; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DAC Load Mode +//! +//! \param base is the DAC module base address +//! \param mode is the selected load mode +//! +//! This function sets the DAC load mode. +//! +//! The \e mode parameter can have one of two values: +//! - \b DAC_LOAD_SYSCLK - Load on next SYSCLK +//! - \b DAC_LOAD_PWMSYNC - Load on next PWMSYNC specified by SYNCSEL +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setLoadMode(uint32_t base, DAC_LoadMode mode) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Set the load mode + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_LOADMODE) | (uint16_t)mode; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DAC PWMSYNC Signal +//! +//! \param base is the DAC module base address +//! \param signal is the selected PWM signal +//! +//! This function sets the DAC PWMSYNC signal. +//! +//! The \e signal parameter must be set to a number that represents the PWM +//! signal that will be set. For instance, passing 2 into \e signal will +//! select PWM sync signal 2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setPWMSyncSignal(uint32_t base, uint16_t pwmSignal) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((pwmSignal > 0U) && (pwmSignal < 17U)); + + // + // Set the PWM sync signal + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_SYNCSEL_M) | + ((uint16_t)(pwmSignal - 1U) << + DAC_CTL_SYNCSEL_S); + + EDIS; +} + +//***************************************************************************** +// +//! Get the DAC Active Output Value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC active output value. +//! +//! \return Returns the DAC active output value. +// +//***************************************************************************** +static inline uint16_t +DAC_getActiveValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the active value + // + return(HWREGH(base + DAC_O_VALA) & DAC_VALA_DACVALA_M); +} + +//***************************************************************************** +// +//! Set the DAC Shadow Output Value +//! +//! \param base is the DAC module base address +//! \param value is the 12-bit code to be loaded into the active value register +//! +//! This function sets the DAC shadow output value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setShadowValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT(value <= DAC_VALS_DACVALS_M); + + // + // Set the shadow value + // + HWREGH(base + DAC_O_VALS) = (HWREGH(base + DAC_O_VALS) & + ~DAC_VALS_DACVALS_M) | + (uint16_t)(value & DAC_VALS_DACVALS_M); +} + +//***************************************************************************** +// +//! Get the DAC Shadow Output Value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC shadow output value. +//! +//! \return Returns the DAC shadow output value. +// +//***************************************************************************** +static inline uint16_t +DAC_getShadowValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the shadow value + // + return(HWREGH(base + DAC_O_VALS) & DAC_VALS_DACVALS_M); +} + +//***************************************************************************** +// +//! Enable the DAC Output +//! +//! \param base is the DAC module base address +//! +//! This function enables the DAC output. +//! +//! \note A delay is required after enabling the DAC. Further details +//! regarding the exact delay time length can be found in the device datasheet. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_enableOutput(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Enable the output + // + EALLOW; + + HWREGH(base + DAC_O_OUTEN) |= DAC_OUTEN_DACOUTEN; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the DAC Output +//! +//! \param base is the DAC module base address +//! +//! This function disables the DAC output. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_disableOutput(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Disable the output + // + EALLOW; + + HWREGH(base + DAC_O_OUTEN) &= ~DAC_OUTEN_DACOUTEN; + + EDIS; +} + +//***************************************************************************** +// +//! Set DAC Offset Trim +//! +//! \param base is the DAC module base address +//! \param offset is the specified value for the offset trim +//! +//! This function sets the DAC offset trim. The \e offset value should be a +//! signed number in the range of -128 to 127. +//! +//! \note The offset should not be modified unless specifically indicated by +//! TI Errata or other documentation. Modifying the offset value could cause +//! this module to operate outside of the datasheet specifications. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setOffsetTrim(uint32_t base, int16_t offset) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((offset > -129) && (offset < 128)); + + // + // Set the offset trim value + // + EALLOW; + + HWREGH(base + DAC_O_TRIM) = (HWREGH(base + DAC_O_TRIM) & + ~DAC_TRIM_OFFSET_TRIM_M) | (int16_t)offset; + + EDIS; +} + +//***************************************************************************** +// +//! Get DAC Offset Trim +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC offset trim value. +//! +//! \return None. +// +//***************************************************************************** +static inline int16_t +DAC_getOffsetTrim(uint32_t base) +{ + uint16_t value; + + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the sign-extended offset trim value + // + value = (HWREGH(base + DAC_O_TRIM) & DAC_TRIM_OFFSET_TRIM_M); + value = ((value & (uint16_t)DAC_REG_BYTE_MASK) ^ (uint16_t)0x80) - + (uint16_t)0x80; + + return((int16_t)value); +} + +//***************************************************************************** +// +//! Lock write-access to DAC Register +//! +//! \param base is the DAC module base address +//! \param reg is the selected DAC registers +//! +//! This function locks the write-access to the specified DAC register. Only a +//! system reset can unlock the register once locked. +//! +//! The \e reg parameter can be an ORed combination of any of the following +//! values: +//! - \b DAC_LOCK_CONTROL - Lock the DAC control register +//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register +//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_lockRegister(uint32_t base, uint16_t reg) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((reg & ~(DAC_LOCK_CONTROL | DAC_LOCK_SHADOW | + DAC_LOCK_OUTPUT)) == 0U); + + // + // Lock the specified registers + // + EALLOW; + + HWREGH(base + DAC_O_LOCK) |= (DAC_LOCK_KEY | reg); + + EDIS; +} + +//***************************************************************************** +// +//! Check if DAC Register is locked +//! +//! \param base is the DAC module base address +//! \param reg is the selected DAC register locks to check +//! +//! This function checks if write-access has been locked on the specified DAC +//! register. +//! +//! The \e reg parameter can be an ORed combination of any of the following +//! values: +//! - \b DAC_LOCK_CONTROL - Lock the DAC control register +//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register +//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register +//! +//! \return Returns \b true if any of the registers specified are locked, and +//! \b false if all specified registers aren't locked. +// +//***************************************************************************** +static inline bool +DAC_isRegisterLocked(uint32_t base, uint16_t reg) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((reg & ~(DAC_LOCK_CONTROL | DAC_LOCK_SHADOW | + DAC_LOCK_OUTPUT)) == 0U); + + // + // Return the lock status on the specified registers + // + return((bool)((HWREGH(base + DAC_O_LOCK) & reg) != 0U)); +} + +//***************************************************************************** +// +//! Tune DAC Offset Trim +//! +//! \param base is the DAC module base address +//! \param referenceVoltage is the reference voltage the DAC +//! module is operating at. +//! +//! This function adjusts/tunes the DAC offset trim. The \e referenceVoltage +//! value should be a floating point number in the range specified in the +//! device data manual. +//! +//! \note Use this function to adjust the DAC offset trim if operating +//! at a reference voltage other than 2.5v. Since this function modifies +//! the DAC offset trim register, it should only be called once after +//! Device_cal. If it is called multiple times after Device_cal, the offset +//! value scaled would be the wrong value. +//! +//! \return None. +// +//***************************************************************************** +extern void +DAC_tuneOffsetTrim(uint32_t base, float32_t referenceVoltage); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DAC_H diff --git a/gpio_bitfield_cpu2/device/driverlib/dcsm.c b/gpio_bitfield_cpu2/device/driverlib/dcsm.c new file mode 100644 index 0000000..808027a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/dcsm.c @@ -0,0 +1,377 @@ +//############################################################################# +// +// FILE: dcsm.c +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#include "dcsm.h" + +//***************************************************************************** +// +// DCSM_unlockZone1CSM +// +//***************************************************************************** +void +DCSM_unlockZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey) +{ + uint32_t linkPointer; + uint32_t zsbBase = (DCSM_Z1OTP_BASE + 0x20U); // base address of the ZSB + int32_t bitPos = 28; // Bits [28:0] point to a ZSB (29-bit link pointer) + int32_t zeroFound = 0; + + // + // Check the arguments. + // + ASSERT(psCMDKey != NULL); + + linkPointer = HWREG(DCSM_Z1_BASE + DCSM_O_Z1_LINKPOINTER); + + // + // Bits 31 and 30 as most-significant 0 are invalid LinkPointer options + // + linkPointer = linkPointer << 3; + + // + // Zone-Select Block (ZSB) selection using Link-Pointers + // and 0's bit position within the Link pointer + // + while((zeroFound == 0) && (bitPos > -1)) + { + // + // The most significant bit position in the resolved link pointer + // which is 0, defines the valid base address for the ZSB. + // + if((linkPointer & 0x80000000U) == 0U) + { + zeroFound = 1; + // + // Base address of the ZSB is calculated using + // 0x10 as the slope/step with which zsbBase expands with + // change in the bitPos and 3*0x10 is the offset + // + zsbBase = (DCSM_Z1OTP_BASE + (((uint32_t)bitPos + 3U) * 0x10U)); + } + else + { + // + // Move through the linkPointer to find the most significant + // bit position of 0 + // + bitPos--; + linkPointer = linkPointer << 1; + } + } + + // + // Perform dummy reads on the 128-bit password + // Using linkPointer because it is no longer needed + // + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD0); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD1); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD2); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD3); + + if(psCMDKey != NULL) + { + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY0) = psCMDKey->csmKey0; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY1) = psCMDKey->csmKey1; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY2) = psCMDKey->csmKey2; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY3) = psCMDKey->csmKey3; + } +} + +//***************************************************************************** +// +// DCSM_unlockZone2CSM +// +//***************************************************************************** +void +DCSM_unlockZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey) +{ + uint32_t linkPointer; + uint32_t zsbBase = (DCSM_Z2OTP_BASE + 0x20U); // base address of the ZSB + int32_t bitPos = 28; // Bits [28:0] point to a ZSB (29-bit link pointer) + int32_t zeroFound = 0; + + // + // Check the arguments. + // + ASSERT(psCMDKey != NULL); + + linkPointer = HWREG(DCSM_Z2_BASE + DCSM_O_Z2_LINKPOINTER); + + // + // Bits 31 and 30 as most-significant 0 are invalid LinkPointer options + // + linkPointer = linkPointer << 3; + + // + // Zone-Select Block (ZSB) selection using Link-Pointers + // and 0's bit position within the Link pointer + // + while((zeroFound == 0) && (bitPos > -1)) + { + // + // The most significant bit position in the resolved link pointer + // which is 0, defines the valid base address for the ZSB. + // + if((linkPointer & 0x80000000U) == 0U) + { + zeroFound = 1; + // + // Base address of the ZSB is calculated using + // 0x10 as the slope/step with which zsbBase expands with + // change in the bitPos and 3*0x10 is the offset + // + zsbBase = (DCSM_Z2OTP_BASE + (((uint32_t)bitPos + 3U) * 0x10U)); + } + else + { + // + // Move through the linkPointer to find the most significant + // bit position of 0 + // + bitPos--; + linkPointer = linkPointer << 1; + } + } + + // + // Perform dummy reads on the 128-bit password + // Using linkPointer because it is no longer needed + // + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD0); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD1); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD2); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD3); + + if(psCMDKey != NULL) + { + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY0) = psCMDKey->csmKey0; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY1) = psCMDKey->csmKey1; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY2) = psCMDKey->csmKey2; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY3) = psCMDKey->csmKey3; + } +} +//***************************************************************************** +// +// DCSM_getZone1FlashEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone1FlashEXEStatus(DCSM_Sector sector) +{ + uint16_t regValue; + DCSM_EXEOnlyStatus status; + + // + // Check if sector belongs to this zone + // + if(DCSM_getFlashSectorZone(sector) != DCSM_MEMORY_ZONE1) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status register + // + regValue = HWREGH(DCSM_Z1_BASE + DCSM_O_Z1_EXEONLYSECTR); + // + // Get the EXE status of the Flash Sector + // + status = (DCSM_EXEOnlyStatus)((uint16_t) + ((regValue >> (uint16_t)sector) & + 0x01U)); + } + return(status); +} + +//***************************************************************************** +// +// DCSM_getZone1RAMEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone1RAMEXEStatus(DCSM_RAMModule module) +{ + ASSERT(module != DCSM_CLA); + uint32_t status; + + // + // Check if module belongs to this zone + // + if(DCSM_getRAMZone(module) != DCSM_MEMORY_ZONE1) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status of the RAM Module + // + status = (uint16_t)((HWREGH(DCSM_Z1_BASE + DCSM_O_Z1_EXEONLYRAMR) >> + (uint16_t)module) & 0x01U); + } + return((DCSM_EXEOnlyStatus)status); +} + +//***************************************************************************** +// +// DCSM_getZone2FlashEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone2FlashEXEStatus(DCSM_Sector sector) +{ + uint16_t regValue; + DCSM_EXEOnlyStatus status; + + // + // Check if sector belongs to this zone + // + if(DCSM_getFlashSectorZone(sector) != DCSM_MEMORY_ZONE2) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status register + // + regValue = HWREGH(DCSM_Z2_BASE + DCSM_O_Z2_EXEONLYSECTR); + // + // Get the EXE status of the Flash Sector + // + status = (DCSM_EXEOnlyStatus)((uint16_t)((regValue >> + (uint16_t)sector) & 0x01U)); + } + + return(status); +} + +//***************************************************************************** +// +// DCSM_getZone2RAMEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone2RAMEXEStatus(DCSM_RAMModule module) +{ + ASSERT(module != DCSM_CLA); + uint32_t status; + + // + // Check if module belongs to this zone + // + if(DCSM_getRAMZone(module) != DCSM_MEMORY_ZONE2) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status of the RAM Module + // + status = (uint16_t)((HWREGH(DCSM_Z2_BASE + + DCSM_O_Z2_EXEONLYRAMR) >> (uint16_t)module) & 0x01U); + } + return((DCSM_EXEOnlyStatus)status); +} + +//***************************************************************************** +// +// DCSM_claimZoneSemaphore +// +//***************************************************************************** +bool +DCSM_claimZoneSemaphore(DCSM_SemaphoreZone zone) +{ + // + // FLSEM register address. + // + uint32_t regAddress = DCSMCOMMON_BASE + DCSM_O_FLSEM; + + EALLOW; + + // + // Write 0xA5 to the key and write the zone that is attempting to claim the + // Flash Pump Semaphore to the semaphore bits. + // + HWREGH(regAddress) = ((uint16_t)FLSEM_KEY << DCSM_FLSEM_KEY_S) | + (uint16_t)zone; + EDIS; + + // + // If the calling function was unable to claim the zone semaphore, then + // return false + // + return(((HWREGH(regAddress) & DCSM_FLSEM_SEM_M) == (uint16_t)zone) ? + true : false); +} + +//***************************************************************************** +// +// DCSM_releaseZoneSemaphore +// +//***************************************************************************** +bool +DCSM_releaseZoneSemaphore(void) +{ + // + // FLSEM register address. + // + uint32_t regAddress = DCSMCOMMON_BASE + DCSM_O_FLSEM; + + EALLOW; + + // + // Write 0xA5 to the key and write the zone that is attempting to claim the + // Flash Pump Semaphore to the semaphore bits. + // + HWREGH(regAddress) = ((uint16_t)FLSEM_KEY << DCSM_FLSEM_KEY_S); + EDIS; + + // + // If the calling function was unable to release the zone semaphore, then + // return false + // + return(((HWREGH(regAddress) & DCSM_FLSEM_SEM_M) == 0x0U) ? true : false); +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/dcsm.h b/gpio_bitfield_cpu2/device/driverlib/dcsm.h new file mode 100644 index 0000000..d181fa7 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/dcsm.h @@ -0,0 +1,669 @@ +//############################################################################# +// +// FILE: dcsm.h +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef DCSM_H +#define DCSM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dcsm_api DCSM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dcsm.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the unlockZone1CSM() and unlockZone2CSM(). +// These are not parameters for any function. +// These are not intended for application code. +// +//***************************************************************************** + +#define DCSM_O_Z1_CSMPSWD0 0x08U //!< Z1 CSMPSWD0 offset +#define DCSM_O_Z1_CSMPSWD1 0x0AU //!< Z1 CSMPSWD1 offset +#define DCSM_O_Z1_CSMPSWD2 0x0CU //!< Z1 CSMPSWD2 offset +#define DCSM_O_Z1_CSMPSWD3 0x0EU //!< Z1 CSMPSWD3 offset +#define DCSM_O_Z2_CSMPSWD0 0x08U //!< Z2 CSMPSWD0 offset +#define DCSM_O_Z2_CSMPSWD1 0x0AU //!< Z2 CSMPSWD1 offset +#define DCSM_O_Z2_CSMPSWD2 0x0CU //!< Z2 CSMPSWD2 offset +#define DCSM_O_Z2_CSMPSWD3 0x0EU //!< Z2 CSMPSWD3 offset + +//***************************************************************************** +// +// Register key defines. +// +//***************************************************************************** +#define FLSEM_KEY 0xA5U //!< Zone semaphore key + +//***************************************************************************** +// +//! Data structures to hold password keys. +// +//***************************************************************************** +typedef struct +{ + uint32_t csmKey0; + uint32_t csmKey1; + uint32_t csmKey2; + uint32_t csmKey3; +} DCSM_CSMPasswordKey; + +//***************************************************************************** +// +//! Values to distinguish the status of RAM or FLASH sectors. These values +//! describe which zone the memory location belongs too. +//! These values can be returned from DCSM_getRAMZone(), +//! DCSM_getFlashSectorZone(). +// +//***************************************************************************** +typedef enum +{ + DCSM_MEMORY_INACCESSIBLE, //!< Inaccessible + DCSM_MEMORY_ZONE1, //!< Zone 1 + DCSM_MEMORY_ZONE2, //!< Zone 2 + DCSM_MEMORY_FULL_ACCESS //!< Full access +} DCSM_MemoryStatus; + +//***************************************************************************** +// +//! Values to pass to DCSM_claimZoneSemaphore(). These values are used +//! to describe the zone that can write to Flash Wrapper registers. +// +//***************************************************************************** +typedef enum +{ + DCSM_FLSEM_ZONE1 = 0x01U, //!< Flash semaphore Zone 1 + DCSM_FLSEM_ZONE2 = 0x02U //!< Flash semaphore Zone 2 +} DCSM_SemaphoreZone; + +//***************************************************************************** +// +//! Values to distinguish the security status of the zones. +//! These values can be returned from DCSM_getZone1CSMSecurityStatus(), +//! DCSM_getZone2CSMSecurityStatus(). +// +//***************************************************************************** +typedef enum +{ + DCSM_STATUS_SECURE, //!< Secure + DCSM_STATUS_UNSECURE, //!< Unsecure + DCSM_STATUS_LOCKED, //!< Locked +} DCSM_SecurityStatus; + +//***************************************************************************** +// +// Values to distinguish the status of the Control Registers. These values +// describe can be used with the return values of +// DCSM_getZone1ControlStatus(), and DCSM_getZone2ControlStatus(). +// +//***************************************************************************** +#define DCSM_ALLZERO 0x08U //!< CSM Passwords all zeros +#define DCSM_ALLONE 0x10U //!< CSM Passwords all ones +#define DCSM_UNSECURE 0x20U //!< Zone is secure/unsecure +#define DCSM_ARMED 0x40U //!< CSM is armed + +//***************************************************************************** +// +//! Values to decribe the EXEONLY Status. +//! These values are returned from to DCSM_getZone1RAMEXEStatus(), +//! DCSM_getZone2RAMEXEStatus(), DCSM_getZone1FlashEXEStatus(), +//! DCSM_getZone2FlashEXEStatus(). +// +//***************************************************************************** +typedef enum +{ + DCSM_PROTECTED, //!< Protected + DCSM_UNPROTECTED, //!< Unprotected + DCSM_INCORRECT_ZONE //!< Incorrect Zone +}DCSM_EXEOnlyStatus; + +//***************************************************************************** +// +//! Values to distinguish RAM Module. +//! These values can be passed to DCSM_getZone1RAMEXEStatus() +//! DCSM_getZone2RAMEXEStatus(), DCSM_getRAMZone(). +// +//***************************************************************************** +typedef enum +{ + // + //C28x RAMs + // + DCSM_RAMLS0, //!< RAMLS0 + DCSM_RAMLS1, //!< RAMLS1 + DCSM_RAMLS2, //!< RAMLS2 + DCSM_RAMLS3, //!< RAMLS3 + DCSM_RAMLS4, //!< RAMLS4 + DCSM_RAMLS5, //!< RAMLS5 + DCSM_RAMD0, //!< RAMD0 + DCSM_RAMD1, //!< RAMD1 + DCSM_CLA = 14U //!> + shift) & 0x03U); + return((DCSM_MemoryStatus)ramStatus); +} + +//***************************************************************************** +// +//! Returns the security zone a flash sector belongs to +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function returns the security zone a flash sector belongs to. +//! +//! \return Returns DCSM_MEMORY_INACCESSIBLE if the section is inaccessible , +//! DCSM_MEMORY_ZONE1 if the section belongs to zone 1, DCSM_MEMORY_ZONE2 if +//! the section belongs to zone 2 and DCSM_MEMORY_FULL_ACCESS if the section +//! doesn't belong to any zone (or if the section is unsecure).. +// +//***************************************************************************** +static inline DCSM_MemoryStatus +DCSM_getFlashSectorZone(DCSM_Sector sector) +{ + uint32_t sectStat; + uint16_t shift; + + // + // Get the Sector status register for the specific bank + // + sectStat = HWREG(DCSMCOMMON_BASE + DCSM_O_SECTSTAT); + shift = (uint16_t)sector * 2U; + + // + //Read the SECTSTAT register for the specific Flash Sector. + // + return((DCSM_MemoryStatus)((uint16_t)((sectStat >> shift) & 0x3U))); +} + +//***************************************************************************** +// +//! Read Zone 1 Link Pointer Error +//! +//! A non-zero value indicates an error on the bit position that is set to 1. +//! +//! \return Returns the value of the Zone 1 Link Pointer error. +// +//***************************************************************************** +static inline uint32_t +DCSM_getZone1LinkPointerError(void) +{ + // + // Return the LinkPointer Error for specific bank + // + return(HWREG(DCSM_Z1_BASE + DCSM_O_Z1_LINKPOINTERERR)); +} + +//***************************************************************************** +// +//! Read Zone 2 Link Pointer Error +//! +//! A non-zero value indicates an error on the bit position that is set to 1. +//! +//! \return Returns the value of the Zone 2 Link Pointer error. +// +//***************************************************************************** +static inline uint32_t +DCSM_getZone2LinkPointerError(void) +{ + // + // Return the LinkPointer Error for specific bank + // + return(HWREG(DCSM_Z2_BASE + DCSM_O_Z2_LINKPOINTERERR)); +} + +//***************************************************************************** +// +//! Unlocks Zone 1 CSM. +//! +//! \param psCMDKey is a pointer to the DCSM_CSMPasswordKey struct that has the +//! CSM password for zone 1. +//! +//! This function unlocks the CSM password. It first reads the +//! four password locations in the User OTP. If any of the password values is +//! different from 0xFFFFFFFF, it unlocks the device by writing the provided +//! passwords into CSM Key registers +//! +//! \return None. +//! +//! \note This function should not be called in an actual application, +//! should only be used for once to program the OTP memory. Ensure flash data +//! cache is disabled before calling this function(Flash_disableCache). +// +//***************************************************************************** +extern void +DCSM_unlockZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey); + +//***************************************************************************** +// +//! Unlocks Zone 2 CSM. +//! +//! \param psCMDKey is a pointer to the CSMPSWDKEY that has the CSM +//! password for zone 2. +//! +//! This function unlocks the CSM password. It first reads +//! the four password locations in the User OTP. If any of the password values +//! is different from 0xFFFFFFFF, it unlocks the device by writing the +//! provided passwords into CSM Key registers +//! +//! \return None. +//! +//! \note This function should not be called in an actual application, +//! should only be used for once to program the OTP memory. Ensure flash data +//! cache is disabled before calling this function(Flash_disableCache). +// +//***************************************************************************** +extern void +DCSM_unlockZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey); +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 1 for a flash sector +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function takes in a valid sector value and returns the status of EXE +//! ONLY security protection for the sector. +//! +//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if sector does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone1FlashEXEStatus(DCSM_Sector sector); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 1 for a RAM module +//! +//! \param module is the RAM module value. Valid values are type DCSM_RAMModule +//! C28x RAMs : +//! - \b DCSM_RAMLS0 +//! - \b DCSM_RAMLS1 +//! - \b DCSM_RAMLS2 +//! - \b DCSM_RAMLS3 +//! - \b DCSM_RAMLS4 +//! - \b DCSM_RAMLS5 +//! - \b DCSM_RAMD0 +//! - \b DCSM_RAMD1 +//! +//! This function takes in a valid module value and returns the status of EXE +//! ONLY security protection for that module. DCSM_CLA is an invalid module +//! value. There is no EXE-ONLY available for DCSM_CLA. +//! +//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if module does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone1RAMEXEStatus(DCSM_RAMModule module); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 2 for a flash sector +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function takes in a valid sector value and returns the status of EXE +//! ONLY security protection for the sector. +//! +//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if sector does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone2FlashEXEStatus(DCSM_Sector sector); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 2 for a RAM module +//! +//! \param module is the RAM module value. Valid values are type DCSM_RAMModule +//! C28x RAMs : +//! - \b DCSM_RAMLS0 +//! - \b DCSM_RAMLS1 +//! - \b DCSM_RAMLS2 +//! - \b DCSM_RAMLS3 +//! - \b DCSM_RAMLS4 +//! - \b DCSM_RAMLS5 +//! - \b DCSM_RAMD0 +//! - \b DCSM_RAMD1 +//! +//! This function takes in a valid module value and returns the status of EXE +//! ONLY security protection for that module. DCSM_CLA is an invalid module +//! value. There is no EXE-ONLY available for DCSM_CLA. +//! +//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if module does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone2RAMEXEStatus(DCSM_RAMModule module); + +//***************************************************************************** +// +//! Claims the zone semaphore which allows access to the Flash Wrapper register +//! for that zone. +//! +//! \param zone is the zone which is trying to claim the semaphore which allows +//! access to the Flash Wrapper registers. +//! +//! \return Returns true for a successful semaphore capture, false if it was +//! unable to capture the semaphore. +// +//***************************************************************************** +extern bool +DCSM_claimZoneSemaphore(DCSM_SemaphoreZone zone); + +//***************************************************************************** +// +//! Releases the zone semaphore. +//! +//! \return Returns true if it was successful in releasing the zone semaphore +//! and false if it was unsuccessful in releasing the zone semaphore. +//! +//! \note If the calling function is not in the right zone to be able +//! to access this register, it will return a false. +// +//***************************************************************************** +extern bool +DCSM_releaseZoneSemaphore(void); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DCSM_H diff --git a/gpio_bitfield_cpu2/device/driverlib/debug.h b/gpio_bitfield_cpu2/device/driverlib/debug.h new file mode 100644 index 0000000..5a2f93a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/debug.h @@ -0,0 +1,91 @@ +//########################################################################### +// +// FILE: debug.h +// +// TITLE: Assert definition macro for debug. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DEBUG_H +#define DEBUG_H + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. It is the +// application's responsibility to define the __error__ function. +// +//***************************************************************************** +extern void __error__(const char *filename, uint32_t line); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#ifdef __TMS320C28XX__ +// +// When called from C28x application +// +#define ASSERT(expr) do \ + { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } \ + while((_Bool)0) +#else +// +// When called from CLA application. Update as needed. +// +#define ASSERT(expr) do \ + { \ + if(!(expr)) \ + { \ + __mdebugstop(); \ + } \ + } \ + while((_Bool)0) +#endif +#else +#define ASSERT(expr) +#endif + +#endif // DEBUG_H diff --git a/gpio_bitfield_cpu2/device/driverlib/dma.c b/gpio_bitfield_cpu2/device/driverlib/dma.c new file mode 100644 index 0000000..ea591b1 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/dma.c @@ -0,0 +1,370 @@ +//########################################################################### +// +// FILE: dma.c +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "dma.h" + +//***************************************************************************** +// +// DMA_configAddresses +// +//***************************************************************************** +void DMA_configAddresses(uint32_t base, const void *destAddr, + const void *srcAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up SOURCE address. + // + HWREG(base + DMA_O_SRC_BEG_ADDR_SHADOW) = (uint32_t)srcAddr; + HWREG(base + DMA_O_SRC_ADDR_SHADOW) = (uint32_t)srcAddr; + + // + // Set up DESTINATION address. + // + HWREG(base + DMA_O_DST_BEG_ADDR_SHADOW) = (uint32_t)destAddr; + HWREG(base + DMA_O_DST_ADDR_SHADOW) = (uint32_t)destAddr; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configBurst +// +//***************************************************************************** +void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep, + int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT((size >= 1U) && (size <= 32U)); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up BURST registers. + // + HWREGH(base + DMA_O_BURST_SIZE) = size - 1U; + HWREGH(base + DMA_O_SRC_BURST_STEP) = srcStep; + HWREGH(base + DMA_O_DST_BURST_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configTransfer +// +//***************************************************************************** +void DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep, + int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT(transferSize <= 0x10000U); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up TRANSFER registers. + // + HWREGH(base + DMA_O_TRANSFER_SIZE) = (uint16_t)(transferSize - 1U); + HWREGH(base + DMA_O_SRC_TRANSFER_STEP) = srcStep; + HWREGH(base + DMA_O_DST_TRANSFER_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configWrap +// +//***************************************************************************** +void DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep, + uint32_t destWrapSize, int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT((srcWrapSize <= 0x10000U) || (destWrapSize <= 0x10000U)); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up WRAP registers. + // + HWREGH(base + DMA_O_SRC_WRAP_SIZE) = (uint16_t)(srcWrapSize - 1U); + HWREGH(base + DMA_O_SRC_WRAP_STEP) = srcStep; + + HWREGH(base + DMA_O_DST_WRAP_SIZE) = (uint16_t)(destWrapSize - 1U); + HWREGH(base + DMA_O_DST_WRAP_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configMode +// +//***************************************************************************** +void DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up trigger selection in the CMA/CLA trigger source selection + // registers. These are considered part of system control. + // + switch(base) + { + case DMA_CH1_BASE: + // + // Channel 1 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH1_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH1_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH1_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH1_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 1U; + break; + + case DMA_CH2_BASE: + // + // Channel 2 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH2_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH2_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH2_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH2_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 2U; + break; + + case DMA_CH3_BASE: + // + // Channel 3 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH3_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH3_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH3_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH3_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 3U; + break; + + case DMA_CH4_BASE: + // + // Channel 4 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH4_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH4_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH4_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH4_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 4U; + break; + + case DMA_CH5_BASE: + // + // Channel 5 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) & + ~((uint32_t)SYSCTL_DMACHSRCSEL2_CH5_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL2_CH5_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH5_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH5_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 5U; + break; + + case DMA_CH6_BASE: + // + // Channel 6 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) & + ~((uint32_t)SYSCTL_DMACHSRCSEL2_CH6_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL2_CH6_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH6_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH6_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 6U; + break; + + default: + // + // Invalid base. + // + break; + } + + // + // Write the configuration to the mode register. + // + HWREGH(base + DMA_O_MODE) &= ~(DMA_MODE_DATASIZE | DMA_MODE_CONTINUOUS | + DMA_MODE_ONESHOT); + HWREGH(base + DMA_O_MODE) |= config; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configChannel +// +//***************************************************************************** +void DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT(((transfParams->configSize == DMA_CFG_SIZE_16BIT) || + (transfParams->configSize == DMA_CFG_SIZE_32BIT)) && + ((transfParams->transferMode == DMA_CFG_ONESHOT_DISABLE) || + (transfParams->transferMode == DMA_CFG_ONESHOT_ENABLE)) && + ((transfParams->reinitMode == DMA_CFG_CONTINUOUS_DISABLE) || + (transfParams->reinitMode == DMA_CFG_CONTINUOUS_ENABLE))); + + // + // Configure DMA Channel + // + DMA_configAddresses(base, (const void *)transfParams->destAddr, + (const void *)transfParams->srcAddr); + + // + // Configure the size of each burst and the address step size + // + DMA_configBurst(base, transfParams->burstSize, transfParams->srcBurstStep, + transfParams->destBurstStep); + + // + // Configure the transfer size and the address step that is + // made after each burst. + // + DMA_configTransfer(base, transfParams->transferSize, + transfParams->srcTransferStep, + transfParams->destTransferStep); + + // + // Configure the DMA channel's wrap settings + // + DMA_configWrap(base, transfParams->srcWrapSize, transfParams->srcWrapStep, + transfParams->destWrapSize, transfParams->destWrapStep); + + // + // Configure the DMA channel's trigger and mode + // + DMA_configMode(base, transfParams->transferTrigger, + transfParams->transferMode | transfParams->reinitMode | + transfParams->configSize); + + // + // Enable the selected peripheral trigger to start a DMA transfer + // + DMA_enableTrigger(base); + + if(transfParams->enableInterrupt) + { + // + // Set the channel interrupt mode + // + DMA_setInterruptMode(base, transfParams->interruptMode); + + // + // Enable the indicated DMA channel interrupt source + // + DMA_enableInterrupt(base); + } + else + { + // + // Disable the indicated DMA channel interrupt source + // + DMA_disableInterrupt(base); + } +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/dma.h b/gpio_bitfield_cpu2/device/driverlib/dma.h new file mode 100644 index 0000000..ae57689 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/dma.h @@ -0,0 +1,1171 @@ +//########################################################################### +// +// FILE: dma.h +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DMA_H +#define DMA_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dma_api DMA +//! \brief This module is used for DMA configurations. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dma.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Values that can be passed to DMA_configMode() as the config parameter. +// +//***************************************************************************** +//! Only one burst transfer performed per trigger. +#define DMA_CFG_ONESHOT_DISABLE 0U +//! Burst transfers occur without additional event triggers after the first. +#define DMA_CFG_ONESHOT_ENABLE DMA_MODE_ONESHOT + +//! DMA channel will be disabled at the end of a transfer. +#define DMA_CFG_CONTINUOUS_DISABLE 0U +//! DMA reinitializes when the transfer count is zero and waits for a trigger. +#define DMA_CFG_CONTINUOUS_ENABLE DMA_MODE_CONTINUOUS + +//! DMA transfers 16 bits at a time. +#define DMA_CFG_SIZE_16BIT 0U +//! DMA transfers 32 bits at a time. +#define DMA_CFG_SIZE_32BIT DMA_MODE_DATASIZE + +//***************************************************************************** +// +//! Values that can be passed to DMA_configMode() as the \e trigger parameter. +// +//***************************************************************************** +typedef enum +{ + DMA_TRIGGER_SOFTWARE = 0, + + DMA_TRIGGER_ADCA1 = 1, + DMA_TRIGGER_ADCA2 = 2, + DMA_TRIGGER_ADCA3 = 3, + DMA_TRIGGER_ADCA4 = 4, + DMA_TRIGGER_ADCAEVT = 5, + DMA_TRIGGER_ADCB1 = 6, + DMA_TRIGGER_ADCB2 = 7, + DMA_TRIGGER_ADCB3 = 8, + DMA_TRIGGER_ADCB4 = 9, + DMA_TRIGGER_ADCBEVT = 10, + DMA_TRIGGER_ADCC1 = 11, + DMA_TRIGGER_ADCC2 = 12, + DMA_TRIGGER_ADCC3 = 13, + DMA_TRIGGER_ADCC4 = 14, + DMA_TRIGGER_ADCCEVT = 15, + DMA_TRIGGER_ADCD1 = 16, + DMA_TRIGGER_ADCD2 = 17, + DMA_TRIGGER_ADCD3 = 18, + DMA_TRIGGER_ADCD4 = 19, + DMA_TRIGGER_ADCDEVT = 20, + + DMA_TRIGGER_XINT1 = 29, + DMA_TRIGGER_XINT2 = 30, + DMA_TRIGGER_XINT3 = 31, + DMA_TRIGGER_XINT4 = 32, + DMA_TRIGGER_XINT5 = 33, + + DMA_TRIGGER_EPWM1SOCA = 36, + DMA_TRIGGER_EPWM1SOCB = 37, + DMA_TRIGGER_EPWM2SOCA = 38, + DMA_TRIGGER_EPWM2SOCB = 39, + DMA_TRIGGER_EPWM3SOCA = 40, + DMA_TRIGGER_EPWM3SOCB = 41, + DMA_TRIGGER_EPWM4SOCA = 42, + DMA_TRIGGER_EPWM4SOCB = 43, + DMA_TRIGGER_EPWM5SOCA = 44, + DMA_TRIGGER_EPWM5SOCB = 45, + DMA_TRIGGER_EPWM6SOCA = 46, + DMA_TRIGGER_EPWM6SOCB = 47, + DMA_TRIGGER_EPWM7SOCA = 48, + DMA_TRIGGER_EPWM7SOCB = 49, + DMA_TRIGGER_EPWM8SOCA = 50, + DMA_TRIGGER_EPWM8SOCB = 51, + DMA_TRIGGER_EPWM9SOCA = 52, + DMA_TRIGGER_EPWM9SOCB = 53, + DMA_TRIGGER_EPWM10SOCA = 54, + DMA_TRIGGER_EPWM10SOCB = 55, + DMA_TRIGGER_EPWM11SOCA = 56, + DMA_TRIGGER_EPWM11SOCB = 57, + DMA_TRIGGER_EPWM12SOCA = 58, + DMA_TRIGGER_EPWM12SOCB = 59, + + DMA_TRIGGER_TINT0 = 68, + DMA_TRIGGER_TINT1 = 69, + DMA_TRIGGER_TINT2 = 70, + + DMA_TRIGGER_MCBSPAMXEVT = 71, + DMA_TRIGGER_MCBSPAMREVT = 72, + DMA_TRIGGER_MCBSPBMXEVT = 73, + DMA_TRIGGER_MCBSPBMREVT = 74, + + + DMA_TRIGGER_SDFM1FLT1 = 95, + DMA_TRIGGER_SDFM1FLT2 = 96, + DMA_TRIGGER_SDFM1FLT3 = 97, + DMA_TRIGGER_SDFM1FLT4 = 98, + + DMA_TRIGGER_SDFM2FLT1 = 99, + DMA_TRIGGER_SDFM2FLT2 = 100, + DMA_TRIGGER_SDFM2FLT3 = 101, + DMA_TRIGGER_SDFM2FLT4 = 102, + + + DMA_TRIGGER_SPIATX = 109, + DMA_TRIGGER_SPIARX = 110, + DMA_TRIGGER_SPIBTX = 111, + DMA_TRIGGER_SPIBRX = 112, + DMA_TRIGGER_SPICTX = 113, + DMA_TRIGGER_SPICRX = 114, + + DMA_TRIGGER_CLB1INT = 127, + DMA_TRIGGER_CLB2INT = 128, + DMA_TRIGGER_CLB3INT = 129, + DMA_TRIGGER_CLB4INT = 130, + +} DMA_Trigger; + +//***************************************************************************** +// +//! Values that can be passed to DMA_setInterruptMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! DMA interrupt is generated at the beginning of a transfer + DMA_INT_AT_BEGINNING, + //! DMA interrupt is generated at the end of a transfer + DMA_INT_AT_END +} DMA_InterruptMode; + +//***************************************************************************** +// +//! Values that can be passed to DMA_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Transmission stops after current read-write access is completed + DMA_EMULATION_STOP, + //! Continue DMA operation regardless of emulation suspend + DMA_EMULATION_FREE_RUN +} DMA_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to DMA_configChannel() as the +//! configure parameter. +// +//***************************************************************************** +typedef struct +{ + DMA_Trigger transferTrigger; //DMA transfer triggers + DMA_InterruptMode interruptMode; //Channel interrupt mode + //! enableInterrupt can have a value 1(Enable) or 0(Disable) + bool enableInterrupt; //Enable/Disable interrupt mode + //! configSize can have a value DMA_CFG_SIZE_16BIT/32BIT + uint32_t configSize; //Data bus width (16 or 32 bits) + //! transferMode can have a value DMA_CFG_ONESHOT_DISABLE/ENABLE + uint32_t transferMode; //Burst transfer mode + //! reinitMode can have a value DMA_CFG_CONTINUOUS_DISABLE/ENABLE + uint32_t reinitMode; //DMA reinitialization mode + //! burstSize value range from 1 word to 32 sixteen-bit words. + uint32_t burstSize; //Number of words transferred per burst + //! transferSize value range from 1 to 65536 + uint32_t transferSize; //Number of bursts per transfer + //! Number of bursts to be transferred before a wrap of the source address + //! occurs. srcWrapSize value range from 1 to 65536 + uint32_t srcWrapSize; + //! Number of bursts to be transferred before a wrap of the destination + //! address occurs. destWrapSize value range from 1 to 65536 + uint32_t destWrapSize; + uint32_t destAddr; //destination address + uint32_t srcAddr; //source address + //! Amount to inc or dec the source address after each word of a burst. + //! srcBurstStep can have only signed values from -4096 to 4095 + int16_t srcBurstStep; + //! Amount to inc or dec the destination address after each word of a burst. + //! destBurstStep can have only signed values from -4096 to 4095 + int16_t destBurstStep; + //! Amount to inc or dec the source address after each burst of a transfer. + //! srcTransferStep can have only signed values from -4096 to 4095 + int16_t srcTransferStep; + //! Amount to inc or dec the destination address after each burst of a + //! transfer. destTransferStep can have only signed values from -4096 to 4095 + int16_t destTransferStep; + //! Amount to inc or dec the source address when the wrap occurs. + //! srcWrapStep can have only signed values from -4096 to 4095 + int16_t srcWrapStep; + //! Amount to inc or dec the destination address when the wrap occurs. + //! destWrapStep can have only signed values from -4096 to 4095 + int16_t destWrapStep; + +} DMA_ConfigParams; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an DMA channel base address. +//! +//! \param base specifies the DMA channel base address. +//! +//! This function determines if a DMA channel base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +DMA_isBaseValid(uint32_t base) +{ + return((base == DMA_CH1_BASE) || (base == DMA_CH2_BASE) || + (base == DMA_CH3_BASE) || (base == DMA_CH4_BASE) || + (base == DMA_CH5_BASE) || (base == DMA_CH6_BASE)); +} +#endif + +//***************************************************************************** +// +//! Initializes the DMA controller to a known state. +//! +//! This function configures does a hard reset of the DMA controller in order +//! to put it into a known state. The function also sets the DMA to run free +//! during an emulation suspend (see the field DEBUGCTRL.FREE for more info). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_initController(void) +{ + EALLOW; + + // + // Set the hard reset bit. One NOP is required after HARDRESET. + // + HWREGH(DMA_BASE + DMA_O_CTRL) |= DMA_CTRL_HARDRESET; + NOP; + + EDIS; +} + +//***************************************************************************** +// +//! Channel Soft Reset +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function does a soft reset to place the channel into its default state +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_triggerSoftReset(uint32_t base) +{ + EALLOW; + + // + // Set the soft reset bit. One NOP is required after SOFTRESET. + // + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_SOFTRESET; + NOP; + + EDIS; +} + +//***************************************************************************** +// +//! Sets DMA emulation mode. +//! +//! \param mode is the emulation mode to be selected. +//! +//! This function sets the behavior of the DMA operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b DMA_EMULATION_STOP - DMA runs until the current read-write access is +//! completed. +//! - \b DMA_EMULATION_FREE_RUN - DMA operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setEmulationMode(DMA_EmulationMode mode) +{ + EALLOW; + + // + // Set emulation mode + // + if(mode == DMA_EMULATION_STOP) + { + HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) &= ~DMA_DEBUGCTRL_FREE; + } + else + { + HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) |= DMA_DEBUGCTRL_FREE; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables peripherals to trigger a DMA transfer. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the selected peripheral trigger to start a DMA +//! transfer on the specified channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the peripheral interrupt trigger enable bit. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_PERINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables peripherals from triggering a DMA transfer. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the selected peripheral trigger from starting a DMA +//! transfer on the specified channel. This also disables the use of the +//! software force using the DMA_forceTrigger() API. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Clear the peripheral interrupt trigger enable bit. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_PERINTE; + EDIS; +} + +//***************************************************************************** +// +//! Force a peripheral trigger to a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function sets the peripheral trigger flag and if triggering a DMA +//! burst is enabled (see DMA_enableTrigger()), a DMA burst transfer will be +//! forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_forceTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the peripheral interrupt trigger force bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTFRC; + EDIS; +} + +//***************************************************************************** +// +//! Clears a DMA channel's peripheral trigger flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function clears the peripheral trigger flag. Normally, you would use +//! this function when initializing the DMA for the first time. The flag is +//! cleared automatically when the DMA starts the first burst of a transfer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_clearTriggerFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Write a one to the clear bit to clear the peripheral trigger flag. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Transfer Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Transfer Status Flag is set, which +//! means a DMA transfer has begun. +//! This flag is cleared when TRANSFER_COUNT reaches zero, or when the +//! HARDRESET or SOFTRESET bit is set. +//! +//! \return Returns \b true if the Transfer Status Flag is set. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getTransferStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Transfer Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_TRANSFERSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Burst Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Burst Status Flag is set, which +//! means a DMA burst has begun. +//! This flag is cleared when BURST_COUNT reaches zero, or when the +//! HARDRESET or SOFTRESET bit is set. +//! +//! \return Returns \b true if the Burst Status Flag is set. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getBurstStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Burst Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_BURSTSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Run Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Run Status Flag is set, which +//! means the DMA channel is enabled. +//! This flag is cleared when a transfer completes (TRANSFER_COUNT = 0) and +//! continuous mode is disabled, or when the HARDRESET, SOFTRESET, or HALT bit +//! is set. +//! +//! \return Returns \b true if the channel is enabled. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getRunStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Run Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_RUNSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Overflow Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Overflow Flag is set, which +//! means peripheral event trigger was received while Peripheral Event Trigger +//! Flag was already set. +//! This flag can be cleared by writing to ERRCLR bit, using the function +//! DMA_clearErrorFlag(). +//! +//! \return Returns \b true if the channel is enabled. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getOverflowFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Overflow Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_OVRFLG) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's peripheral trigger flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if a peripheral trigger event has occurred +//! The flag is automatically cleared when the first burst transfer begins, but +//! if needed, it can be cleared using DMA_clearTriggerFlag(). +//! +//! \return Returns \b true if a peripheral trigger event has occurred and its +//! flag is set. Returns \b false otherwise. +// +//***************************************************************************** +static inline bool +DMA_getTriggerFlagStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the peripheral trigger flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_PERINTFLG) != 0U); +} + +//***************************************************************************** +// +//! Starts a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function starts the DMA running, typically after you have configured +//! it. It will wait for the first trigger event to start operation. To halt +//! the channel use DMA_stopChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_startChannel(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the run bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_RUN; + EDIS; +} + +//***************************************************************************** +// +//! Halts a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function halts the DMA at its current state and any current read-write +//! access is completed. To start the channel again use DMA_startChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_stopChannel(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the halt bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_HALT; + EDIS; +} + +//***************************************************************************** +// +//! Enables a DMA channel interrupt source. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the indicated DMA channel interrupt source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Enable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables a DMA channel interrupt source. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the indicated DMA channel interrupt source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Disable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTE; + EDIS; +} + +//***************************************************************************** +// +//! Enables the DMA channel overrun interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the indicated DMA channel's ability to generate an +//! interrupt upon the detection of an overrun. An overrun is when a peripheral +//! event trigger is received by the DMA before a previous trigger on that +//! channel had been serviced and its flag had been cleared. +//! +//! Note that this is the same interrupt signal as the interrupt that gets +//! generated at the beginning/end of a transfer. That interrupt must first be +//! enabled using DMA_enableInterrupt() in order for the overrun interrupt to +//! be generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableOverrunInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Enable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_OVRINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables the DMA channel overrun interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the indicated DMA channel's ability to generate an +//! interrupt upon the detection of an overrun. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableOverrunInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Disable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_OVRINTE; + EDIS; +} + +//***************************************************************************** +// +//! Clears the DMA channel error flags. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function clears both the DMA channel's sync error flag and its +//! overrun error flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_clearErrorFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Write to the error clear bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_ERRCLR; + EDIS; +} + +//***************************************************************************** +// +//! Sets the interrupt generation mode of a DMA channel interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param mode is a flag to indicate the channel interrupt mode. +//! +//! This function sets the channel interrupt mode. When the \e mode parameter +//! is \b DMA_INT_AT_END, the DMA channel interrupt will be generated at the +//! end of the transfer. If \b DMA_INT_AT_BEGINNING, the interrupt will be +//! generated at the beginning of a new transfer. Generating at the beginning +//! of a new transfer is the default behavior. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setInterruptMode(uint32_t base, DMA_InterruptMode mode) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Write the selected interrupt generation mode to the register. + // + if(mode == DMA_INT_AT_END) + { + HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTMODE; + } + else + { + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTMODE; + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DMA channel priority mode. +//! +//! \param ch1IsHighPri is a flag to indicate the channel interrupt mode. +//! +//! This function sets the channel interrupt mode. When the \e ch1IsHighPri +//! parameter is \b false, the DMA channels are serviced in round-robin mode. +//! This is the default behavior. +//! +//! If \b true, channel 1 will be given higher priority than the other +//! channels. This means that if a channel 1 trigger occurs, the current word +//! transfer on any other channel is completed and channel 1 is serviced for +//! the complete burst count. The lower-priority channel's interrupted transfer +//! will then resume. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setPriorityMode(bool ch1IsHighPri) +{ + EALLOW; + + // + // Write the selected priority mode to the register. + // + if(ch1IsHighPri) + { + HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) |= + DMA_PRIORITYCTRL1_CH1PRIORITY; + } + else + { + HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) &= + ~DMA_PRIORITYCTRL1_CH1PRIORITY; + } + + EDIS; +} + +//***************************************************************************** +// +//! Configures the source address for the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *srcAddr is a source address. +//! +//! This function configures the source address of a DMA +//! channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_configSourceAddress(uint32_t base, const void *srcAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up SOURCE address. + // + HWREG(base + DMA_O_SRC_BEG_ADDR_SHADOW) = (uint32_t)srcAddr; + HWREG(base + DMA_O_SRC_ADDR_SHADOW) = (uint32_t)srcAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the destination address for the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *destAddr is the destination address. +//! +//! This function configures the destinaton address of a DMA +//! channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_configDestAddress(uint32_t base, const void *destAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up DESTINATION address. + // + HWREG(base + DMA_O_DST_BEG_ADDR_SHADOW) = (uint32_t)destAddr; + HWREG(base + DMA_O_DST_ADDR_SHADOW) = (uint32_t)destAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Setup DMA to transfer data on the specified channel. +//! +//! \param base is Base address of the DMA channel control register +//! \param *transfParams configuration parameter +//! Refer struct #DMA_ConfigParams +//! +//! This function configures the DMA transfer on the specified channel. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams); + +//***************************************************************************** +// +//! Configures the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *destAddr is the destination address. +//! \param *srcAddr is a source address. +//! +//! This function configures the source and destination addresses of a DMA +//! channel. The parameters are pointers to the data to be transferred. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configAddresses(uint32_t base, const void *destAddr, const void *srcAddr); + +//***************************************************************************** +// +//! Configures the DMA channel's burst settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param size is the number of words transferred per burst. +//! \param srcStep is the amount to increment or decrement the source address +//! after each word of a burst. +//! \param destStep is the amount to increment or decrement the destination +//! address after each word of a burst. +//! +//! This function configures the size of each burst and the address step size. +//! +//! The \e size parameter is the number of words that will be transferred +//! during a single burst. Possible amounts range from 1 word to 32 words. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses after each +//! transferred word of a burst. Only signed values from -4096 to 4095 are +//! valid. +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep, + int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel's transfer settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param transferSize is the number of bursts per transfer. +//! \param srcStep is the amount to increment or decrement the source address +//! after each burst of a transfer unless a wrap occurs. +//! \param destStep is the amount to increment or decrement the destination +//! address after each burst of a transfer unless a wrap occurs. +//! +//! This function configures the transfer size and the address step that is +//! made after each burst. +//! +//! The \e transferSize parameter is the number of bursts per transfer. If DMA +//! channel interrupts are enabled, they will occur after this number of bursts +//! have completed. The maximum number of bursts is 65536. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses after each +//! transferred burst of a transfer. Only signed values from -4096 to 4095 are +//! valid. If a wrap occurs, these step values will be ignored. Wrapping is +//! configured with DMA_configWrap(). +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep, + int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel's wrap settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param srcWrapSize is the number of bursts to be transferred before a wrap +//! of the source address occurs. +//! \param srcStep is the amount to increment or decrement the source address +//! after each burst of a transfer unless a wrap occurs. +//! \param destWrapSize is the number of bursts to be transferred before a wrap +//! of the destination address occurs. +//! \param destStep is the amount to increment or decrement the destination +//! address after each burst of a transfer unless a wrap occurs. +//! +//! This function configures the DMA channel's wrap settings. +//! +//! The \e srcWrapSize and \e destWrapSize parameters are the number of bursts +//! that are to be transferred before their respective addresses are wrapped. +//! The maximum wrap size is 65536 bursts. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses when the wrap +//! occurs. Only signed values from -4096 to 4095 are valid. +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep, + uint32_t destWrapSize, int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel trigger and mode. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param trigger is the interrupt source that triggers a DMA transfer. +//! \param config is a bit field of several configuration selections. +//! +//! This function configures the DMA channel's trigger and mode. +//! +//! The \e trigger parameter is the interrupt source that will trigger the +//! start of a DMA transfer. +//! +//! The \e config parameter is the logical OR of the following values: +//! - \b DMA_CFG_ONESHOT_DISABLE or \b DMA_CFG_ONESHOT_ENABLE. If enabled, +//! the subsequent burst transfers occur without additional event triggers +//! after the first event trigger. If disabled, only one burst transfer is +//! performed per event trigger. +//! - \b DMA_CFG_CONTINUOUS_DISABLE or \b DMA_CFG_CONTINUOUS_ENABLE. If enabled +//! the DMA reinitializes when the transfer count is zero and waits for the +//! next interrupt event trigger. If disabled, the DMA stops and clears the +//! run status bit. +//! - \b DMA_CFG_SIZE_16BIT or \b DMA_CFG_SIZE_32BIT. This setting selects +//! whether the databus width is 16 or 32 bits. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DMA_H diff --git a/gpio_bitfield_cpu2/device/driverlib/driver_inclusive_terminology_mapping.h b/gpio_bitfield_cpu2/device/driverlib/driver_inclusive_terminology_mapping.h new file mode 100644 index 0000000..00e9ac6 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/driver_inclusive_terminology_mapping.h @@ -0,0 +1,109 @@ +#ifndef DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ +#define DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ + + +//***************************************************************************** +// CLB +//***************************************************************************** +#define CLB_LOCAL_IN_MUX_SPISIMO_SLAVE CLB_LOCAL_IN_MUX_SPIPICO_PERIPHERAL +#define CLB_LOCAL_IN_MUX_SPISIMO_MASTER CLB_LOCAL_IN_MUX_SPIPICO_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI1_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI1_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI1_SPISTE CLB_GLOBAL_IN_MUX_SPI1_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI2_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI2_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI2_SPISTE CLB_GLOBAL_IN_MUX_SPI2_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI3_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI3_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI3_SPISTE CLB_GLOBAL_IN_MUX_SPI3_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI4_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI4_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI4_SPISTE CLB_GLOBAL_IN_MUX_SPI4_SPIPTE + + + +//***************************************************************************** +// SPI +//***************************************************************************** +#define SPI_MODE_SLAVE SPI_MODE_PERIPHERAL +#define SPI_MODE_MASTER SPI_MODE_CONTROLLER +#define SPI_MODE_SLAVE_OD SPI_MODE_PERIPHERAL_OD +#define SPI_MODE_MASTER_OD SPI_MODE_CONTROLLER_OD + +#define SPI_STE_ACTIVE_LOW SPI_PTE_ACTIVE_LOW +#define SPI_STE_ACTIVE_HIGH SPI_PTE_ACTIVE_HIGH + +#define SPI_setSTESignalPolarity SPI_setPTESignalPolarity + + +//***************************************************************************** +// Interrupt +//***************************************************************************** +#define Interrupt_enableMaster Interrupt_enableGlobal +#define Interrupt_disableMaster Interrupt_disableGlobal + + +//***************************************************************************** +// SysCtrl +//***************************************************************************** +#define SysCtl_AccessMaster SysCtl_AccessController +#define SYSCTL_SEC_MASTER_CLA SYSCTL_SEC_CONTROLLER_CLA +#define SYSCTL_SEC_MASTER_DMA SYSCTL_SEC_CONTROLLER_DMA +#define SysCtl_selectSecMaster SysCtl_selectSecController + + +//***************************************************************************** +// GPIO +//***************************************************************************** +#define GPIO_setMasterCore GPIO_setControllerCore + + + +//***************************************************************************** +// Memcfg +//***************************************************************************** +#define MemCfg_LSRAMMMasterSel MemCfg_LSRAMMControllerSel +#define MEMCFG_LSRAMMASTER_CPU_ONLY MEMCFG_LSRAMCONTROLLER_CPU_ONLY +#define MEMCFG_LSRAMMASTER_CPU_CLA1 MEMCFG_LSRAMCONTROLLER_CPU_CLA1 +#define MemCfg_setLSRAMMasterSel MemCfg_setLSRAMControllerSel + +#define MemCfg_GSRAMMasterSel MemCfg_GSRAMControllerSel +#define MEMCFG_GSRAMMASTER_CPU1 MEMCFG_GSRAMCONTROLLER_CPU1 +#define MEMCFG_GSRAMMASTER_CPU2 MEMCFG_GSRAMCONTROLLER_CPU2 +#define MemCfg_setGSRAMMasterSel MemCfg_setGSRAMControllerSel + +//***************************************************************************** +// EMIF +//***************************************************************************** +#define EMIF_MasterSelect EMIF_ControllerSelect +#define EMIF_selectMaster EMIF_selectController +#define EMIF_MASTER_CPU1_NG EMIF_CONTROLLER_CPU1_NG +#define EMIF_MASTER_CPU1_G EMIF_CONTROLLER_CPU1_G +#define EMIF_MASTER_CPU2_G EMIF_CONTROLLER_CPU2_G +#define EMIF_MASTER_CPU1_NG2 EMIF_CONTROLLER_CPU1_NG2 + + +//***************************************************************************** +// I2C +//***************************************************************************** +#define I2C_MASTER_SEND_MODE I2C_CONTROLLER_SEND_MODE +#define I2C_MASTER_RECEIVE_MODE I2C_CONTROLLER_RECEIVE_MODE +#define I2C_SLAVE_SEND_MODE I2C_TARGET_SEND_MODE +#define I2C_SLAVE_RECEIVE_MODE I2C_TARGET_RECEIVE_MODE +#define I2C_INT_ADDR_SLAVE I2C_INT_ADDR_TARGET +#define I2C_STS_ADDR_SLAVE I2C_STS_ADDR_TARGET +#define I2C_STS_SLAVE_DIR I2C_STS_TARGET_DIR +#define I2C_INTSRC_ADDR_SLAVE I2C_INTSRC_ADDR_TARGET + +#define I2C_initMaster I2C_initController +#define I2C_setSlaveAddress I2C_setTargetAddress +#define I2C_setOwnSlaveAddress I2C_setOwnAddress + + +//***************************************************************************** +// SDFM +//***************************************************************************** +#define SDFM_enableMasterInterrupt SDFM_enableMainInterrupt +#define SDFM_disableMasterInterrupt SDFM_disableMainInterrupt +#define SDFM_enableMasterFilter SDFM_enableMainFilter +#define SDFM_disableMasterFilter SDFM_disableMainFilter + +#define SDFM_MASTER_INTERRUPT_FLAG SDFM_MAIN_INTERRUPT_FLAG + +#endif /* DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ */ diff --git a/gpio_bitfield_cpu2/device/driverlib/ecap.c b/gpio_bitfield_cpu2/device/driverlib/ecap.c new file mode 100644 index 0000000..4a48441 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/ecap.c @@ -0,0 +1,61 @@ +//########################################################################### +// +// FILE: ecap.c +// +// TITLE: C28x ECAP driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "ecap.h" + +//***************************************************************************** +// +// ECAP_setEmulationMode +// +//***************************************************************************** +void ECAP_setEmulationMode(uint32_t base, ECAP_EmulationMode mode) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to FREE/SOFT bit + // + HWREGH(base + ECAP_O_ECCTL1) = + ((HWREGH(base + ECAP_O_ECCTL1) & (~ECAP_ECCTL1_FREE_SOFT_M)) | + ((uint16_t)mode << ECAP_ECCTL1_FREE_SOFT_S)); +} diff --git a/gpio_bitfield_cpu2/device/driverlib/ecap.h b/gpio_bitfield_cpu2/device/driverlib/ecap.h new file mode 100644 index 0000000..577d7a8 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/ecap.h @@ -0,0 +1,1164 @@ +//########################################################################### +// +// FILE: ecap.h +// +// TITLE: C28x ECAP driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef ECAP_H +#define ECAP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup ecap_api eCAP +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Includes +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ecap.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// eCAP minimum and maximum values +// +//***************************************************************************** +#define ECAP_MAX_PRESCALER_VALUE 32U // Maximum Pre-scaler value + +//***************************************************************************** +// +// Values that can be passed to ECAP_enableInterrupt(), +// ECAP_disableInterrupt(), ECAP_clearInterrupt() and ECAP_forceInterrupt() as +// the intFlags parameter and returned by ECAP_getInterruptSource(). +// +//***************************************************************************** +//! Event 1 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_1 0x2U +//! Event 2 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_2 0x4U +//! Event 3 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_3 0x8U +//! Event 4 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_4 0x10U +//! Counter overflow ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_OVERFLOW 0x20U +//! Counter equals period ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_PERIOD 0x40U +//! Counter equals compare ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_COMPARE 0x80U + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEmulationMode() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! TSCTR is stopped on emulation suspension + ECAP_EMULATION_STOP = 0x0U, + //! TSCTR runs until 0 before stopping on emulation suspension + ECAP_EMULATION_RUN_TO_ZERO = 0x1U, + //! TSCTR is not affected by emulation suspension + ECAP_EMULATION_FREE_RUN = 0x2U +}ECAP_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setCaptureMode() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! eCAP operates in continuous capture mode + ECAP_CONTINUOUS_CAPTURE_MODE = 0U, + //! eCAP operates in one shot capture mode + ECAP_ONE_SHOT_CAPTURE_MODE = 1U +}ECAP_CaptureMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEventPolarity(),ECAP_setCaptureMode(), +//! ECAP_enableCounterResetOnEvent(),ECAP_disableCounterResetOnEvent(), +//! ECAP_getEventTimeStamp(),ECAP_setDMASource() as the \e event parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_EVENT_1 = 0U, //!< eCAP event 1 + ECAP_EVENT_2 = 1U, //!< eCAP event 2 + ECAP_EVENT_3 = 2U, //!< eCAP event 3 + ECAP_EVENT_4 = 3U //!< eCAP event 4 +}ECAP_Events; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setSyncOutMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! sync out on the sync in signal and software force + ECAP_SYNC_OUT_SYNCI = 0x00U, + //! sync out on counter equals period + ECAP_SYNC_OUT_COUNTER_PRD = 0x40U, + //! Disable sync out signal + ECAP_SYNC_OUT_DISABLED = 0x80U +}ECAP_SyncOutMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setAPWMPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_APWM_ACTIVE_HIGH = 0x000, //!< APWM is active high + ECAP_APWM_ACTIVE_LOW = 0x400 //!< APWM is active low +}ECAP_APWMPolarity; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEventPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_EVNT_RISING_EDGE = 0U, //!< Rising edge polarity + ECAP_EVNT_FALLING_EDGE = 1U //!< Falling edge polarity +}ECAP_EventPolarity; + +//***************************************************************************** +// +//! \internal +//! Checks eCAP base address. +//! +//! \param base specifies the eCAP module base address. +//! +//! This function determines if an eCAP module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool ECAP_isBaseValid(uint32_t base) +{ + return( + (base == ECAP1_BASE) || + (base == ECAP2_BASE) || + (base == ECAP3_BASE) || + (base == ECAP4_BASE) || + (base == ECAP5_BASE) || + (base == ECAP6_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Sets the input prescaler. +//! +//! \param base is the base address of the ECAP module. +//! \param preScalerValue is the pre scaler value for ECAP input +//! +//! This function divides the ECAP input scaler. The pre scale value is +//! doubled inside the module. For example a preScalerValue of 5 will divide +//! the scaler by 10. Use a value of 1 to divide the pre scaler by 1. +//! The \e preScalerValue should be less than \b ECAP_MAX_PRESCALER_VALUE. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setEventPrescaler(uint32_t base, + uint16_t preScalerValue) +{ + ASSERT(ECAP_isBaseValid(base)); + + ASSERT(preScalerValue < ECAP_MAX_PRESCALER_VALUE); + + + // + // Write to PRESCALE bit + // + HWREGH(base + ECAP_O_ECCTL1) = + ((HWREGH(base + ECAP_O_ECCTL1) & (~ECAP_ECCTL1_PRESCALE_M)) | + (preScalerValue << ECAP_ECCTL1_PRESCALE_S)); +} + +//***************************************************************************** +// +//! Sets the Capture event polarity. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number. +//! \param polarity is the polarity of the event. +//! +//! This function sets the polarity of a given event. The value of event +//! is between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 inclusive corresponding to +//! the four available events.For each event the polarity value determines the +//! edge on which the capture is activated. For a rising edge use a polarity +//! value of \b ECAP_EVNT_RISING_EDGE and for a falling edge use a polarity of +//! \b ECAP_EVNT_FALLING_EDGE. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setEventPolarity(uint32_t base, + ECAP_Events event, + ECAP_EventPolarity polarity) +{ + + uint16_t shift; + + ASSERT(ECAP_isBaseValid(base)); + + shift = ((uint16_t)event) << 1U; + + + // + // Write to CAP1POL, CAP2POL, CAP3POL or CAP4POL + // + HWREGH(base + ECAP_O_ECCTL1) = + (HWREGH(base + ECAP_O_ECCTL1) & ~(1U << shift)) | + ((uint16_t)polarity << shift); +} + +//***************************************************************************** +// +//! Sets the capture mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the capture mode. +//! \param event is the event number at which the counter stops or wraps. +//! +//! This function sets the eCAP module to a continuous or one-shot mode. +//! The value of mode should be either \b ECAP_CONTINUOUS_CAPTURE_MODE or +//! \b ECAP_ONE_SHOT_CAPTURE_MODE corresponding to continuous or one-shot mode +//! respectively. +//! +//! The value of event determines the event number at which the counter stops +//! (in one-shot mode) or the counter wraps (in continuous mode). The value of +//! event should be between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 corresponding +//! to the valid event numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setCaptureMode(uint32_t base, + ECAP_CaptureMode mode, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to CONT/ONESHT + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_CONT_ONESHT)) | + (uint16_t)mode); + + // + // Write to STOP_WRAP + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_STOP_WRAP_M)) | + (((uint16_t)event) << ECAP_ECCTL2_STOP_WRAP_S )); +} + +//***************************************************************************** +// +//! Re-arms the eCAP module. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function re-arms the eCAP module. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_reArm(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to RE-ARM bit + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_REARM; +} + +//***************************************************************************** +// +//! Enables interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source to be enabled. +//! +//! This function sets and enables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + + // + // Set bits in ECEINT register + // + HWREGH(base + ECAP_O_ECEINT) |= intFlags; +} + +//***************************************************************************** +// +//! Disables interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source to be disabled. +//! +//! This function clears and disables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableInterrupt(uint32_t base, + uint16_t intFlags) +{ + + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + // + // Clear bits in ECEINT register + // + HWREGH(base + ECAP_O_ECEINT) &= ~intFlags; +} + +//***************************************************************************** +// +//! Returns the interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the eCAP interrupt flag. The following are valid +//! interrupt sources corresponding to the eCAP interrupt flag. +//! +//! \return Returns the eCAP interrupt that has occurred. The following are +//! valid return values. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \note - User can check if a combination of various interrupts have occurred +//! by ORing the above return values. +// +//***************************************************************************** +static inline uint16_t ECAP_getInterruptSource(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Return contents of ECFLG register + // + return(HWREGH(base + ECAP_O_ECFLG) & 0xFEU); +} + +//***************************************************************************** +// +//! Returns the Global interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the eCAP Global interrupt flag. +//! +//! \return Returns true if there is a global eCAP interrupt, false otherwise. +// +//***************************************************************************** +static inline bool ECAP_getGlobalInterruptStatus(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Return contents of Global interrupt bit + // + return((HWREGH(base + ECAP_O_ECFLG) & 0x1U) == 0x1U); +} + +//***************************************************************************** +// +//! Clears interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source. +//! +//! This function clears eCAP interrupt flags. The following are valid +//! interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_clearInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + // + // Write to ECCLR register + // + HWREGH(base + ECAP_O_ECCLR) = intFlags; +} + +//***************************************************************************** +// +//! Clears global interrupt flag +//! +//! \param base is the base address of the ECAP module. +//! +//! This function clears the global interrupt bit. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_clearGlobalInterrupt(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to INT bit + // + HWREGH(base + ECAP_O_ECCLR) = ECAP_ECCLR_INT; +} + +//***************************************************************************** +// +//! Forces interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source. +//! +//! This function forces and enables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_forceInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + // + // Write to ECFRC register + // + HWREGH(base + ECAP_O_ECFRC) = intFlags; +} + +//***************************************************************************** +// +//! Sets eCAP in Capture mode. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function sets the eCAP module to operate in Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableCaptureMode(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CAP/APWM bit + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM; +} + +//***************************************************************************** +// +//! Sets eCAP in APWM mode. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function sets the eCAP module to operate in APWM mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableAPWMMode(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CAP/APWM bit + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_CAP_APWM; +} + +//***************************************************************************** +// +//! Enables counter reset on an event. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number the time base gets reset. +//! +//! This function enables the base timer, TSCTR, to be reset on capture +//! event provided by the variable event. Valid inputs for event are +//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableCounterResetOnEvent(uint32_t base, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits + // + HWREGH(base + ECAP_O_ECCTL1) |= 1U << ((2U * (uint16_t)event) + 1U); +} + +//***************************************************************************** +// +//! Disables counter reset on events. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number the time base gets reset. +//! +//! This function disables the base timer, TSCTR, from being reset on capture +//! event provided by the variable event. Valid inputs for event are +//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableCounterResetOnEvent(uint32_t base, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits + // + HWREGH(base + ECAP_O_ECCTL1) &= ~(1U << ((2U * (uint16_t)event) + 1U)); +} + +//***************************************************************************** +// +//! Enables time stamp capture. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function enables time stamp count to be captured +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableTimeStampCapture(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CAPLDEN bit + // + HWREGH(base + ECAP_O_ECCTL1) |= ECAP_ECCTL1_CAPLDEN; +} + +//***************************************************************************** +// +//! Disables time stamp capture. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function disables time stamp count to be captured +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableTimeStampCapture(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CAPLDEN bit + // + HWREGH(base + ECAP_O_ECCTL1) &= ~ECAP_ECCTL1_CAPLDEN; +} + +//***************************************************************************** +// +//! Sets a phase shift value count. +//! +//! \param base is the base address of the ECAP module. +//! \param shiftCount is the phase shift value. +//! +//! This function writes a phase shift value to be loaded into the main time +//! stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setPhaseShiftCount(uint32_t base, uint32_t shiftCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CTRPHS + // + HWREG(base + ECAP_O_CTRPHS) = shiftCount; +} + +//***************************************************************************** +// +//! Enable counter loading with phase shift value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function enables loading of the counter with the value present in the +//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableLoadCounter(uint32_t base) +{ + + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCI_EN + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_SYNCI_EN; +} + +//***************************************************************************** +// +//! Disable counter loading with phase shift value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function disables loading of the counter with the value present in the +//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableLoadCounter(uint32_t base) +{ + + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCI_EN + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_SYNCI_EN; +} + +//***************************************************************************** +// +//! Load time stamp counter +//! +//! \param base is the base address of the ECAP module. +//! +//! This function forces the value in the phase shift counter register to be +//! loaded into Time stamp counter register. +//! Make sure to enable loading of Time stamp counter by calling +//! ECAP_enableLoadCounter() function before calling this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_loadCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SWSYNC + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_SWSYNC; +} + +//***************************************************************************** +// +//! Configures Sync out signal mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the sync out mode. +//! +//! This function sets the sync out mode. Valid parameters for mode are: +//! - ECAP_SYNC_OUT_SYNCI - Trigger sync out on sync-in event. +//! - ECAP_SYNC_OUT_COUNTER_PRD - Trigger sync out when counter equals period. +//! - ECAP_SYNC_OUT_DISABLED - Disable sync out. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setSyncOutMode(uint32_t base, + ECAP_SyncOutMode mode) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCO_SEL + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_SYNCO_SEL_M)) | + (uint16_t)mode); +} + +//***************************************************************************** +// +//! Stops Time stamp counter. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function stops the time stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_stopCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear TSCTR + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_TSCTRSTOP; +} + +//***************************************************************************** +// +//! Starts Time stamp counter. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function starts the time stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_startCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set TSCTR + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_TSCTRSTOP; +} + +//***************************************************************************** +// +//! Set eCAP APWM polarity. +//! +//! \param base is the base address of the ECAP module. +//! \param polarity is the polarity of APWM +//! +//! This function sets the polarity of the eCAP in APWM mode. Valid inputs for +//! polarity are: +//! - ECAP_APWM_ACTIVE_HIGH - For active high. +//! - ECAP_APWM_ACTIVE_LOW - For active low. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMPolarity(uint32_t base, + ECAP_APWMPolarity polarity) +{ + ASSERT(ECAP_isBaseValid(base)); + + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & ~ECAP_ECCTL2_APWMPOL) | + (uint16_t)polarity); +} + +//***************************************************************************** +// +//! Set eCAP APWM period. +//! +//! \param base is the base address of the ECAP module. +//! \param periodCount is the period count for APWM. +//! +//! This function sets the period count of the APWM waveform. +//! periodCount takes the actual count which is written to the register. The +//! user is responsible for converting the desired frequency or time into +//! the period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMPeriod(uint32_t base, uint32_t periodCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP1 + // + HWREG(base + ECAP_O_CAP1) = periodCount; +} + +//***************************************************************************** +// +//! Set eCAP APWM on or off time count. +//! +//! \param base is the base address of the ECAP module. +//! \param compareCount is the on or off count for APWM. +//! +//! This function sets the on or off time count of the APWM waveform depending +//! on the polarity of the output. If the output , as set by +//! ECAP_setAPWMPolarity(), is active high then compareCount determines the on +//! time. If the output is active low then compareCount determines the off +//! time. compareCount takes the actual count which is written to the register. +//! The user is responsible for converting the desired frequency or time into +//! the appropriate count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMCompare(uint32_t base, uint32_t compareCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP2 + // + HWREG(base + ECAP_O_CAP2) = compareCount; +} + +//***************************************************************************** +// +//! Load eCAP APWM shadow period. +//! +//! \param base is the base address of the ECAP module. +//! \param periodCount is the shadow period count for APWM. +//! +//! This function sets the shadow period count of the APWM waveform. +//! periodCount takes the actual count which is written to the register. The +//! user is responsible for converting the desired frequency or time into +//! the period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMShadowPeriod(uint32_t base, + uint32_t periodCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP3 + // + HWREG(base + ECAP_O_CAP3) = periodCount; +} + +//***************************************************************************** +// +//! Set eCAP APWM shadow on or off time count. +//! +//! \param base is the base address of the ECAP module. +//! \param compareCount is the on or off count for APWM. +//! +//! This function sets the shadow on or off time count of the APWM waveform +//! depending on the polarity of the output. If the output , as set by +//! ECAP_setAPWMPolarity() , is active high then compareCount determines the +//! on time. If the output is active low then compareCount determines the off +//! time. compareCount takes the actual count which is written to the register. +//! The user is responsible for converting the desired frequency or time into +//! the appropriate count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMShadowCompare(uint32_t base, + uint32_t compareCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP4 + // + HWREG(base + ECAP_O_CAP4) = compareCount; +} + +//***************************************************************************** +// +//! Returns the time base counter value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the time base counter value. +//! +//! \return Returns the time base counter value. +// +//***************************************************************************** +static inline uint32_t ECAP_getTimeBaseCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Read the Time base counter value + // + return(HWREG(base + ECAP_O_TSCTR)); +} + +//***************************************************************************** +// +//! Returns event time stamp. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number. +//! +//! This function returns the current time stamp count of the given event. +//! Valid values for event are \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return Event time stamp value or 0 if \e event is invalid. +// +//***************************************************************************** +static inline uint32_t ECAP_getEventTimeStamp(uint32_t base, ECAP_Events event) +{ + uint32_t count; + + ASSERT(ECAP_isBaseValid(base)); + + + switch(event) + { + case ECAP_EVENT_1: + + // + // Read CAP1 register + // + count = HWREG(base + ECAP_O_CAP1); + break; + + case ECAP_EVENT_2: + // + // Read CAP2 register + // + count = HWREG(base + ECAP_O_CAP2); + break; + + case ECAP_EVENT_3: + + // + // Read CAP3 register + // + count = HWREG(base + ECAP_O_CAP3); + break; + + case ECAP_EVENT_4: + + // + // Read CAP4 register + // + count = HWREG(base + ECAP_O_CAP4); + break; + + default: + + // + // Invalid event parameter + // + count = 0U; + break; + } + + return(count); +} + +//***************************************************************************** +// +//! Configures emulation mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the emulation mode. +//! +//! This function configures the eCAP counter, TSCTR, to the desired emulation +//! mode when emulation suspension occurs. Valid inputs for mode are: +//! - ECAP_EMULATION_STOP - Counter is stopped immediately. +//! - ECAP_EMULATION_RUN_TO_ZERO - Counter runs till it reaches 0. +//! - ECAP_EMULATION_FREE_RUN - Counter is not affected. +//! +//! \return None. +// +//***************************************************************************** +extern void ECAP_setEmulationMode(uint32_t base, ECAP_EmulationMode mode); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ECAP_H diff --git a/gpio_bitfield_cpu2/device/driverlib/emif.c b/gpio_bitfield_cpu2/device/driverlib/emif.c new file mode 100644 index 0000000..a862104 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/emif.c @@ -0,0 +1,46 @@ +//########################################################################### +// +// FILE: emif.c +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "emif.h" + diff --git a/gpio_bitfield_cpu2/device/driverlib/emif.h b/gpio_bitfield_cpu2/device/driverlib/emif.h new file mode 100644 index 0000000..7177421 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/emif.h @@ -0,0 +1,1369 @@ +//########################################################################### +// +// FILE: emif.h +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef EMIF_H +#define EMIF_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup emif_api EMIF +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_emif.h" +#include "inc/hw_memcfg.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Defines to specify access protection to EMIF_setAccessProtection(). +// +//***************************************************************************** +//! This flag is used to specify whether CPU fetches are allowed/blocked +//! for EMIF. +#define EMIF_ACCPROT0_FETCHPROT MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 + +//! This flag is used to specify whether CPU writes are allowed/blocked +//! for EMIF. +#define EMIF_ACCPROT0_CPUWRPROT MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 + +//! This flag is used to specify whether DMA writes are allowed/blocked +//! for EMIF. It is valid only for EMIF1 instance. +#define EMIF_ACCPROT0_DMAWRPROT MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1 + +//***************************************************************************** +// +// Define to mask out the bits in the EMIF1ACCPROT0 register that aren't +// associated with EMIF1 access protection. +// +//***************************************************************************** +#define EMIF_ACCPROT0_MASK_EMIF1 \ + ((uint16_t)MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 |\ + (uint16_t)MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 |\ + (uint16_t)MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1) + +//***************************************************************************** +// +// Define to mask out the bits in the EMIF2ACCPROT0 register that aren't +// associated with EMIF2 access protection. +// +//***************************************************************************** +#define EMIF_ACCPROT0_MASK_EMIF2 \ + ((uint16_t)MEMCFG_EMIF2ACCPROT0_FETCHPROT_EMIF2 |\ + (uint16_t)MEMCFG_EMIF2ACCPROT0_CPUWRPROT_EMIF2) + +//***************************************************************************** +// +// Define to mask out the bits in the ASYNC_CSx_CR register that +// aren't associated with async configuration. +// +//***************************************************************************** +#define EMIF_ASYNC_CS_CR_MASK ((uint32_t)EMIF_ASYNC_CS2_CR_R_HOLD_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_R_STROBE_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_R_SETUP_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_HOLD_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_STROBE_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_SETUP_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_TA_M) + +//***************************************************************************** +// +// Define to mask out the bits in the INT_MSK register that aren't associated +// with interrupts. +// +//***************************************************************************** +#define EMIF_ASYNC_INT_MASK ((uint16_t)EMIF_INT_MSK_SET_AT_MASK_SET | \ + (uint16_t)EMIF_INT_MSK_SET_LT_MASK_SET | \ + (uint16_t)EMIF_INT_MSK_SET_WR_MASK_SET_M) + +//***************************************************************************** +// +// Defines to specify interrupt sources to EMIF_enableAsyncInterrupt() and +// EMIF_disableAsyncInterrupt().Three interrupts are available for asynchronous +// memory interface: Masked Asyncronous Timeout(AT) to indicate EMxWAIT signal +// remains active even after maximum wait cycles are reached. Masked Line Trap +// (LT) to indicate illegal memory access or invalid cache line size. +// Masked Wait Rise(WR) to indicate rising edge on EMxWAIT is detected. +// +//***************************************************************************** +//! This flag is used to allow/block EMIF to generate Masked Asynchronous +//! Timeout interrupt. +#define EMIF_ASYNC_INT_AT EMIF_INT_MSK_SET_AT_MASK_SET + +//! This flag is used to allow/block EMIF to generate Masked Line Trap +//! interrupt. +#define EMIF_ASYNC_INT_LT EMIF_INT_MSK_SET_LT_MASK_SET + +//! This flag is used to allow/block EMIF to generate Masked Wait Rise +//! interrupt. +#define EMIF_ASYNC_INT_WR EMIF_INT_MSK_SET_WR_MASK_SET_M + +//***************************************************************************** +// +// Define for key for EMIF1MSEL register that enables the register write. +// +//***************************************************************************** +#define EMIF_MSEL_KEY 0x93A5CE70U + +//***************************************************************************** +// +// Define to mask out the bits in the SDRAM_CR register that aren't +// associated with SDRAM configuration parameters. +// +//***************************************************************************** +#define EMIF_SYNC_SDRAM_CR_MASK ((uint32_t)EMIF_SDRAM_CR_PAGESIGE_M | \ + (uint32_t)EMIF_SDRAM_CR_IBANK_M | \ + (uint32_t)EMIF_SDRAM_CR_BIT_11_9_LOCK | \ + (uint32_t)EMIF_SDRAM_CR_CL_M | \ + (uint32_t)EMIF_SDRAM_CR_NM | \ + (uint32_t)EMIF_SDRAM_CR_SR) + +//***************************************************************************** +// +// Define to mask out the bits in the SDRAM_TR register that aren't +// associated with SDRAM timings parameters. +// +//***************************************************************************** +#define EMIF_SYNC_SDRAM_TR_MASK ((uint32_t)EMIF_SDRAM_TR_T_RRD_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RC_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RAS_M | \ + (uint32_t)EMIF_SDRAM_TR_T_WR_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RCD_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RP_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RFC_M) + +//***************************************************************************** +// +//! Values that can be passed to EMIF_setAsyncMode(), +//! EMIF_setAsyncTimingParams(), EMIF_setAsyncDataBusWidth(), +//! EMIF_enableAsyncExtendedWait() and EMIF_disableAsyncExtendedWait() +//! as the \e offset parameter. Three chip selects are available in +//! asynchronous memory interface so there are three configuration registers +//! available for each EMIF instance. All the three chip select offsets are +//! valid for EMIF1 while only EMIF_ASYNC_CS2_OFFSET is valid for EMIF2. +// +//***************************************************************************** +typedef enum +{ + EMIF_ASYNC_CS2_OFFSET = EMIF_O_ASYNC_CS2_CR, //! It is valid only for EMIF1 instance and not for EMIF2 instance. +//! Valid value for configBase parameter is EMIF1CONFIG_BASE. Valid +//! values for select parameter can be \e EMIF_CONTROLLER_CPU1_NG, +//! \e EMIF_CONTROLLER_CPU1_G, \e EMIF_CONTROLLER_CPU2_G or +//! \e EMIF_CONTROLLER_CPU1_NG2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_selectController(uint32_t configBase, EMIF_ControllerSelect select) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase)); + + // + // Sets the bits that enables EMIF1 controller selection. + // + EALLOW; + HWREG(configBase + MEMCFG_O_EMIF1MSEL) = (EMIF_MSEL_KEY | (uint32_t)select); + EDIS; +} + +//***************************************************************************** +// +//! Sets the access protection. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! \param access is the required access protection configuration. +//! +//! This function sets the access protection for an EMIF instance from CPU +//! and DMA. The \e access parameter can be any of \b EMIF_ACCPROT0_FETCHPROT, +//! \b EMIF_ACCPROT0_CPUWRPROT \b EMIF_ACCPROT0_DMAWRPROT values or their +//! combination. EMIF_ACCPROT0_DMAWRPROT value is valid as access parameter +//! for EMIF1 instance only . +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAccessProtection(uint32_t configBase, uint16_t access) +{ + uint16_t temp; + // + // Check the arguments. + // + + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + if(configBase == EMIF1CONFIG_BASE) + { + ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF1); + temp = EMIF_ACCPROT0_MASK_EMIF1; + } + else + { + ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF2); + temp = EMIF_ACCPROT0_MASK_EMIF2; + } + + // + // Sets the bits that enables access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) = + (HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) & ~(temp)) | access; + EDIS; +} + +//***************************************************************************** +// +//! Commits the lock configuration. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function commits the access protection for an EMIF instance from +//! CPU & DMA. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_commitAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that commits access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1COMMIT) |= + MEMCFG_EMIF1COMMIT_COMMIT_EMIF1; + EDIS; +} + +//***************************************************************************** +// +//! Locks the write to access configuration fields. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function locks the write to access configuration fields i.e +//! ACCPROT0 & Mselect fields, for an EMIF instance. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_lockAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that locks access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1LOCK) |= MEMCFG_EMIF1LOCK_LOCK_EMIF1; + EDIS; +} + +//***************************************************************************** +// +//! Unlocks the write to access configuration fields. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function unlocks the write to access configuration fields such as +//! ACCPROT0 & Mselect fields, for an EMIF instance. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_unlockAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that unlocks access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1LOCK) &= + ~((uint16_t)MEMCFG_EMIF1LOCK_LOCK_EMIF1); + EDIS; +} + +//***************************************************************************** +// +// Prototypes for Asynchronous Memory Interface +// +//***************************************************************************** +//***************************************************************************** +// +//! Selects the asynchronous mode of operation. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param mode is the desired mode of operation for external memory. +//! +//! +//! This function sets the mode of operation for asynchronous memory +//! between Normal or Strobe mode. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! Valid values for param \e mode can be \e EMIF_ASYNC_STROBE_MODE or +//! \e EMIF_ASYNC_NORMAL_MODE. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncMode(uint32_t base, EMIF_AsyncCSOffset offset, + EMIF_AsyncMode mode) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async mode of operation. + // + HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset) + & ~((uint32_t)EMIF_ASYNC_CS2_CR_SS)) + | (uint32_t)mode; +} + +//***************************************************************************** +// +//! Enables the Extended Wait Mode. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of the +//! EMIF instance +//! +//! This function enables the extended wait mode for an asynchronous +//! external memory.Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the bit that enables extended wait mode. + // + HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) | + EMIF_ASYNC_CS2_CR_EW; +} + +//***************************************************************************** +// +//! Disables the Extended Wait Mode. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! This function disables the extended wait mode for an asynchronous external +//! memory.Valid values for param \e offset can be \e EMIF_ASYNC_CS2_OFFSET, +//! \e EMIF_ASYNC_CS3_OFFSET & \e EMIF_ASYNC_C43_OFFSET for EMIF1 and +//! \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset) + { + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the bit that disables extended wait mode. + // + HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) & + ~((uint32_t)EMIF_ASYNC_CS2_CR_EW); +} + +//***************************************************************************** +// +//! Sets the wait polarity. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param polarity is desired wait polarity. +//! +//! This function sets the wait polarity for an asynchronous external memory. +//! Valid values for param \e polarity can be \e EMIF_ASYNC_WAIT_POLARITY_LOW +//! or \e EMIF_ASYNC_WAIT_POLARITY_HIGH. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncWaitPolarity(uint32_t base, EMIF_AsyncWaitPolarity polarity) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the polarity for async extended wait mode. + // + HWREG(base + EMIF_O_ASYNC_WCCR) = (HWREG(base + EMIF_O_ASYNC_WCCR) + & ~((uint32_t)EMIF_ASYNC_WCCR_WP0)) + | (uint32_t)polarity; +} + +//***************************************************************************** +// +//! Sets the Maximum Wait Cycles. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param value is the desired maximum wait cycles. +//! +//! This function sets the maximum wait cycles for extended asynchronous cycle. +//! Valid values for parameter \e value lies b/w 0x0U-0xFFU or 0-255. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncMaximumWaitCycles(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(value <= (EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M)); + + // + // Sets the bit that enables extended wait mode. + // + HWREGH(base + EMIF_O_ASYNC_WCCR) = (HWREGH(base + EMIF_O_ASYNC_WCCR) + & ~((uint16_t)EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M)) + | value; +} + +//***************************************************************************** +// +//! Sets the Asynchronous Memory Timing Characteristics. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param tParam is the desired timing parameters. +//! +//! This function sets timing characteristics for an external asynchronous +//! memory to be interfaced. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET and +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 & EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncTimingParams(uint32_t base, EMIF_AsyncCSOffset offset, + const EMIF_AsyncTimingParams *tParam) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async memory timing parameters. + // + temp = (tParam->turnArnd << EMIF_ASYNC_CS2_CR_TA_S) | + (tParam->rHold << EMIF_ASYNC_CS2_CR_R_HOLD_S) | + (tParam->rStrobe << EMIF_ASYNC_CS2_CR_R_STROBE_S) | + (tParam->rSetup << EMIF_ASYNC_CS2_CR_R_SETUP_S) | + (tParam->wHold << EMIF_ASYNC_CS2_CR_W_HOLD_S) | + (tParam->wStrobe << EMIF_ASYNC_CS2_CR_W_STROBE_S) | + (tParam->wSetup << EMIF_ASYNC_CS2_CR_W_SETUP_S); + + HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset) & + ~EMIF_ASYNC_CS_CR_MASK) | temp; +} + +//***************************************************************************** +// +//! Sets the Asynchronous Data Bus Width. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param width is the data bus width of the memory. +//! +//! This function sets the data bus size for an external asynchronous memory +//! to be interfaced. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! Valid values of param \e width can be \e EMIF_ASYNC_DATA_WIDTH_8, +//! \e EMIF_ASYNC_DATA_WIDTH_16 or \e EMIF_ASYNC_DATA_WIDTH_32. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncDataBusWidth(uint32_t base, EMIF_AsyncCSOffset offset, + EMIF_AsyncDataWidth width) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async memory data bus width. + // + HWREGH(base + (uint32_t)offset) = (HWREGH(base + (uint32_t)offset) + & ~((uint16_t)EMIF_ASYNC_CS2_CR_ASIZE_M)) + | (uint32_t)width; +} + +//***************************************************************************** +// +// Prototypes for Interrupt Handling +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables the Asynchronous Memory Interrupts. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for desired interrupts. +//! +//! This function enables the desired interrupts for an external asynchronous +//! memory interface. Valid values for param \e intFlags can be +//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or their +//! combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableAsyncInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bits that enables async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK_SET) = intFlags; +} + +//***************************************************************************** +// +//! Disables the Asynchronous Memory Interrupts. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for interrupts to be disabled. +//! +//! This function disables the desired interrupts for an external asynchronous +//! memory interface. Valid values for param \e intFlags can be +//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or +//! their combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableAsyncInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bits that disables async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK_CLR) = intFlags; + +} + +//***************************************************************************** +// +//! Gets the interrupt status. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function gets the interrupt status for an EMIF instance. +//! +//! \return Returns the current interrupt status. +// +//***************************************************************************** +static inline uint16_t +EMIF_getAsyncInterruptStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets the async memory interrupt status. + // + return(HWREGH(base + EMIF_O_INT_MSK) & EMIF_ASYNC_INT_MASK); +} + +//***************************************************************************** +// +//! Clears the interrupt status for an EMIF instance. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for the interrupt status to be cleared. +//! +//! This function clears the interrupt status for an EMIF instance. +//! The \e intFlags parameter can be any of \b EMIF_INT_MSK_SET_AT_MASK_SET, +//! \b EMIF_INT_MSK_SET_LT_MASK_SET, or \b EMIF_INT_MSK_SET_WR_MASK_SET_M +//! values or their combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_clearAsyncInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bit that clears desired async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK) = intFlags; +} + +//***************************************************************************** +// +// Prototypes for Synchronous Memory Interface +// +//***************************************************************************** +//***************************************************************************** +// +//! Sets the Synchronous Memory Timing Parameters. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param tParam is parameters from memory datasheet in \e ns. +//! +//! This function sets the timing characteristics for an external +//! synchronous memory to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncTimingParams(uint32_t base, const EMIF_SyncTimingParams *tParam) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets sync memory timing parameters. + // + temp = ((tParam->tRrd << EMIF_SDRAM_TR_T_RRD_S) + & EMIF_SDRAM_TR_T_RRD_M) + | ((tParam->tRc << EMIF_SDRAM_TR_T_RC_S) + & EMIF_SDRAM_TR_T_RC_M) + | ((tParam->tRas << EMIF_SDRAM_TR_T_RAS_S) + & EMIF_SDRAM_TR_T_RAS_M) + | ((tParam->tWr << EMIF_SDRAM_TR_T_WR_S) + & EMIF_SDRAM_TR_T_WR_M) + | ((tParam->tRcd << EMIF_SDRAM_TR_T_RCD_S) + & EMIF_SDRAM_TR_T_RCD_M) + | ((tParam->tRp << EMIF_SDRAM_TR_T_RP_S) + & EMIF_SDRAM_TR_T_RP_M) + | ((tParam->tRfc << EMIF_SDRAM_TR_T_RFC_S) + & EMIF_SDRAM_TR_T_RFC_M); + + HWREG(base + EMIF_O_SDRAM_TR) = (HWREG(base + EMIF_O_SDRAM_TR) & + ~EMIF_SYNC_SDRAM_TR_MASK) | temp; +} + +//***************************************************************************** +// +//! Sets the SDRAM Self Refresh Exit Timing. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param tXs is the desired timing value. +//! +//! This function sets the self refresh exit timing for an external +//! synchronous memory to be interfaced. tXs values must lie between +//! 0x0U-0x1FU or 0-31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncSelfRefreshExitTmng(uint32_t base, uint16_t tXs) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(tXs <= EMIF_SDR_EXT_TMNG_T_XS_M); + + // + // Sets the self refresh exit timing for sync memory. + // + HWREGH(base + EMIF_O_SDR_EXT_TMNG) = (HWREGH(base + EMIF_O_SDR_EXT_TMNG) + & ~((uint16_t)EMIF_SDR_EXT_TMNG_T_XS_M)) + | tXs; +} + +//***************************************************************************** +// +//! Sets the SDR Refresh Rate. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param refRate is the refresh rate. +//! +//! This function sets the refresh rate for an external synchronous memory +//! to be interfaced. Valid values for refRate lies b/w 0x0U-0x1FFFU or +//! 0-8191. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncRefreshRate(uint32_t base, uint16_t refRate) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(refRate <= EMIF_SDRAM_RCR_REFRESH_RATE_M); + + // + // Sets the sync memory refresh rate. + // + HWREGH(base + EMIF_O_SDRAM_RCR) = (HWREGH(base + EMIF_O_SDRAM_RCR) + & (~(uint16_t)EMIF_SDRAM_RCR_REFRESH_RATE_M)) + | refRate; +} + +//***************************************************************************** +// +//! Sets the Synchronous Memory configuration parameters. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param config is the desired configuration parameters. +//! +//! This function sets configuration parameters like CL, NM, IBANK +//! and PAGESIZE for an external synchronous memory to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncMemoryConfig(uint32_t base, const EMIF_SyncConfig *config) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the sync memory configuration bits. + // + temp = ((uint32_t)config->casLatency | (uint32_t)config->iBank | + (uint32_t)config->narrowMode | (uint32_t)config->pageSize); + + HWREG(base + EMIF_O_SDRAM_CR) = (HWREG(base + EMIF_O_SDRAM_CR) & + ~EMIF_SYNC_SDRAM_CR_MASK) | temp; +} + +//***************************************************************************** +// +// Prototypes for EMIF Low Power Modes +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables Self Refresh. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function enables Self Refresh Mode for EMIF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncSelfRefresh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables sync memory self refresh mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_SR; +} + +//***************************************************************************** +// +//! Disables Self Refresh. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Self Refresh Mode for EMIF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncSelfRefresh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables sync memory self refresh mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_SR); +} + +//***************************************************************************** +// +//! Enables Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function Enables Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables sync memory power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PD; +} + +//***************************************************************************** +// +//! Disables Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables sync memory power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PD); +} + +//***************************************************************************** +// +//! Enables Refresh in Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function enables Refresh in Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncRefreshInPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables refresh in power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PDWR; +} + +//***************************************************************************** +// +//! Disables Refresh in Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Refresh in Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncRefreshInPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables refresh in power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PDWR); +} + +//***************************************************************************** +// +//! Gets total number of SDRAM accesses. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function returns total number of SDRAM accesses +//! from a controller(CPUx/CPUx.DMA). +//! +//! \return \e Returns total number of accesses to SDRAM. +// +//***************************************************************************** +static inline uint32_t +EMIF_getSyncTotalAccesses(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets total accesses to sync memory. + // + return(HWREG(base + EMIF_O_TOTAL_SDRAM_AR)); + +} + +//***************************************************************************** +// +//! Gets total number of SDRAM accesses which require activate command. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function returns total number of accesses to SDRAM which +//! require activate command. +//! +//!\return \e Returns total number of accesses to SDRAM which require activate. +// +//***************************************************************************** +static inline uint32_t +EMIF_getSyncTotalActivateAccesses(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets total accesses to sync memory which requires activate command. + // + return(HWREG(base + EMIF_O_TOTAL_SDRAM_ACTR)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EMIF_H diff --git a/gpio_bitfield_cpu2/device/driverlib/epwm.c b/gpio_bitfield_cpu2/device/driverlib/epwm.c new file mode 100644 index 0000000..76e09bb --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/epwm.c @@ -0,0 +1,363 @@ +//########################################################################### +// +// FILE: epwm.c +// +// TITLE: C28x EPWM driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "epwm.h" + +//***************************************************************************** +// +// EPWM_setEmulationMode +// +//***************************************************************************** +void EPWM_setEmulationMode(uint32_t base, EPWM_EmulationMode emulationMode) +{ + // + // Check the arguments. + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to FREE_SOFT bits + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & (~EPWM_TBCTL_FREE_SOFT_M)) | + ((uint16_t)emulationMode << EPWM_TBCTL_FREE_SOFT_S)); +} + +//***************************************************************************** +// +// EPWM_configureSignal +// +//***************************************************************************** +void EPWM_configureSignal(uint32_t base, const EPWM_SignalParams *signalParams) +{ + float32_t tbClkInHz = 0.0F; + uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U; + + // + // Check the arguments. + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Valid values in the function for TBCTR Mode are UP, DOWN + // and UP-DOWN count. + // + ASSERT((uint16_t)signalParams->tbCtrMode <= 2U); + + // + // Configure EPWM clock Divider + // + SysCtl_setEPWMClockDivider(signalParams->epwmClkDiv); + + // + // Configure Time Base counter Clock + // + EPWM_setClockPrescaler(base, signalParams->tbClkDiv, + signalParams->tbHSClkDiv); + + // + // Configure Time Base Counter Mode + // + EPWM_setTimeBaseCounterMode(base, signalParams->tbCtrMode); + + // + // Calculate TBCLK, TBPRD and CMPx values to be configured for + // achieving desired signal + // + tbClkInHz = ((float32_t)signalParams->sysClkInHz / + (float32_t)(1U << ((uint16_t)signalParams->epwmClkDiv + + (uint16_t)signalParams->tbClkDiv))); + + if(signalParams->tbHSClkDiv <= EPWM_HSCLOCK_DIVIDER_4) + { + tbClkInHz /= (float32_t)(1U << (uint16_t)signalParams->tbHSClkDiv); + } + else + { + tbClkInHz /= (float32_t)(2U * (uint16_t)signalParams->tbHSClkDiv); + } + + if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP) + { + tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f); + cmpAVal = (uint16_t)(signalParams->dutyValA * + (float32_t)(tbPrdVal + 1U)); + cmpBVal = (uint16_t)(signalParams->dutyValB * + (float32_t)(tbPrdVal + 1U)); + } + else if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_DOWN) + { + tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f); + cmpAVal = (uint16_t)((float32_t)(tbPrdVal + 1U) - + (signalParams->dutyValA * (float32_t)(tbPrdVal + 1U))); + cmpBVal = (uint16_t)((float32_t)(tbPrdVal + 1U) - + (signalParams->dutyValB * (float32_t)(tbPrdVal + 1U))); + } + else + { + tbPrdVal = (uint16_t)(tbClkInHz / (2.0f * signalParams->freqInHz)); + cmpAVal = (uint16_t)(((float32_t)tbPrdVal - + ((signalParams->dutyValA * + (float32_t)tbPrdVal))) + 0.5f); + cmpBVal = (uint16_t)(((float32_t)tbPrdVal - + ((signalParams->dutyValB * + (float32_t)tbPrdVal))) + 0.5f); + } + + // + // Configure TBPRD value + // + EPWM_setTimeBasePeriod(base, tbPrdVal); + + // + // Default Configurations. + // + EPWM_disablePhaseShiftLoad(base); + EPWM_setPhaseShift(base, 0U); + EPWM_setTimeBaseCounter(base, 0U); + + // + // Setup shadow register load on ZERO + // + EPWM_setCounterCompareShadowLoadMode(base, + EPWM_COUNTER_COMPARE_A, + EPWM_COMP_LOAD_ON_CNTR_ZERO); + EPWM_setCounterCompareShadowLoadMode(base, + EPWM_COUNTER_COMPARE_B, + EPWM_COMP_LOAD_ON_CNTR_ZERO); + // + // Set Compare values + // + EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, + cmpAVal); + EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B, + cmpBVal); + + // + // Set actions for ePWMxA & ePWMxB + // + if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP) + { + // + // Set PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxA on event A, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Set PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + } + else + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Clear PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + + } + } + else if((signalParams->tbCtrMode == EPWM_COUNTER_MODE_DOWN)) + { + // + // Set PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxA on event A, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Set PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + else + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Clear PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + } + else + { + // + // Clear PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Set PWMxA on event A, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); + + // + // Clear PWMxA on event A, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + // + // Set PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + else + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Set PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + // + // Clear PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + } +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/epwm.h b/gpio_bitfield_cpu2/device/driverlib/epwm.h new file mode 100644 index 0000000..ada9b80 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/epwm.h @@ -0,0 +1,7496 @@ +//############################################################################# +// +// FILE: epwm.h +// +// TITLE: C28x EPWM Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef EPWM_H +#define EPWM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup epwm_api ePWM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_epwm.h" +#include "cpu.h" +#include "debug.h" +#include "sysctl.h" + + +// +// Time Base Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setEmulationMode() as the +//! \e emulationMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Stop after next Time Base counter increment or decrement + EPWM_EMULATION_STOP_AFTER_NEXT_TB = 0, + //! Stop when counter completes whole cycle + EPWM_EMULATION_STOP_AFTER_FULL_CYCLE = 1, + //! Free run + EPWM_EMULATION_FREE_RUN = 2 +} EPWM_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setCountModeAfterSync() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNT_MODE_DOWN_AFTER_SYNC = 0, //!< Count down after sync event + EPWM_COUNT_MODE_UP_AFTER_SYNC = 1 //!< Count up after sync event +} EPWM_SyncCountMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setClockPrescaler() as the +//! \e prescaler parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_CLOCK_DIVIDER_1 = 0, //!< Divide clock by 1 + EPWM_CLOCK_DIVIDER_2 = 1, //!< Divide clock by 2 + EPWM_CLOCK_DIVIDER_4 = 2, //!< Divide clock by 4 + EPWM_CLOCK_DIVIDER_8 = 3, //!< Divide clock by 8 + EPWM_CLOCK_DIVIDER_16 = 4, //!< Divide clock by 16 + EPWM_CLOCK_DIVIDER_32 = 5, //!< Divide clock by 32 + EPWM_CLOCK_DIVIDER_64 = 6, //!< Divide clock by 64 + EPWM_CLOCK_DIVIDER_128 = 7 //!< Divide clock by 128 +} EPWM_ClockDivider; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setClockPrescaler() as the +//! \e highSpeedPrescaler parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_HSCLOCK_DIVIDER_1 = 0, //!< Divide clock by 1 + EPWM_HSCLOCK_DIVIDER_2 = 1, //!< Divide clock by 2 + EPWM_HSCLOCK_DIVIDER_4 = 2, //!< Divide clock by 4 + EPWM_HSCLOCK_DIVIDER_6 = 3, //!< Divide clock by 6 + EPWM_HSCLOCK_DIVIDER_8 = 4, //!< Divide clock by 8 + EPWM_HSCLOCK_DIVIDER_10 = 5, //!< Divide clock by 10 + EPWM_HSCLOCK_DIVIDER_12 = 6, //!< Divide clock by 12 + EPWM_HSCLOCK_DIVIDER_14 = 7 //!< Divide clock by 14 +} EPWM_HSClockDivider; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setSyncOutPulseMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Sync pulse is generated by software + EPWM_SYNC_OUT_PULSE_ON_SOFTWARE = 0, + //! Sync pulse is passed from EPWMxSYNCIN + EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN = 0, + //! Sync pulse is generated when time base counter equals zero + EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO = 1, + //! Sync pulse is generated when time base counter equals compare B value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B = 2, + //! Sync pulse is disabled + EPWM_SYNC_OUT_PULSE_DISABLED = 4, + //! Sync pulse is generated when time base counter equals compare C value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C = 5, + //! Sync pulse is generated when time base counter equals compare D value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D = 6 +} EPWM_SyncOutPulseMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setPeriodLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! PWM Period register access is through shadow register + EPWM_PERIOD_SHADOW_LOAD = 0, + //! PWM Period register access is directly + EPWM_PERIOD_DIRECT_LOAD = 1 +} EPWM_PeriodLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTimeBaseCounterMode() as the +//! \e counterMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNTER_MODE_UP = 0, //!< Up - count mode + EPWM_COUNTER_MODE_DOWN = 1, //!< Down - count mode + EPWM_COUNTER_MODE_UP_DOWN = 2, //!< Up - down - count mode + EPWM_COUNTER_MODE_STOP_FREEZE = 3 //!< Stop - Freeze counter +} EPWM_TimeBaseCountMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectPeriodLoadEvent() as the +//! \e shadowLoadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Shadow to active load occurs when time base counter reaches 0 + EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO = 0, + //! Shadow to active load occurs when time base counter reaches 0 and a + //! SYNC occurs + EPWM_SHADOW_LOAD_MODE_COUNTER_SYNC = 1, + //! Shadow to active load occurs only when a SYNC occurs + EPWM_SHADOW_LOAD_MODE_SYNC = 2 +} EPWM_PeriodShadowLoadMode; + +//***************************************************************************** +// +// Values that can be returned by the EPWM_getTimeBaseCounterDirection() +// +//***************************************************************************** +//! Time base counter is counting up +//! +#define EPWM_TIME_BASE_STATUS_COUNT_UP 1U +//! Time base counter is counting down +//! +#define EPWM_TIME_BASE_STATUS_COUNT_DOWN 0U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setupEPWMLinks() as the \e epwmLink +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_LINK_WITH_EPWM_1 = 0, //!< link current ePWM with ePWM1 + EPWM_LINK_WITH_EPWM_2 = 1, //!< link current ePWM with ePWM2 + EPWM_LINK_WITH_EPWM_3 = 2, //!< link current ePWM with ePWM3 + EPWM_LINK_WITH_EPWM_4 = 3, //!< link current ePWM with ePWM4 + EPWM_LINK_WITH_EPWM_5 = 4, //!< link current ePWM with ePWM5 + EPWM_LINK_WITH_EPWM_6 = 5, //!< link current ePWM with ePWM6 + EPWM_LINK_WITH_EPWM_7 = 6, //!< link current ePWM with ePWM7 + EPWM_LINK_WITH_EPWM_8 = 7, //!< link current ePWM with ePWM8 + EPWM_LINK_WITH_EPWM_9 = 8, //!< link current ePWM with ePWM9 + EPWM_LINK_WITH_EPWM_10 = 9, //!< link current ePWM with ePWM10 + EPWM_LINK_WITH_EPWM_11 = 10, //!< link current ePWM with ePWM11 + EPWM_LINK_WITH_EPWM_12 = 11 //!< link current ePWM with ePWM12 +} EPWM_CurrentLink; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setupEPWMLinks() as the \e linkComp +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_LINK_TBPRD = 0U, //!< link TBPRD registers + EPWM_LINK_COMP_A = 4U, //!< link COMPA registers + EPWM_LINK_COMP_B = 8U, //!< link COMPB registers + EPWM_LINK_COMP_C = 12U, //!< link COMPC registers + EPWM_LINK_COMP_D = 16U, //!< link COMPD registers + EPWM_LINK_GLDCTL2 = 28U //!< link GLDCTL2 registers +} EPWM_LinkComponent; + +// +// Counter Compare Module +// +//***************************************************************************** +// +//! Values that can be passed to the EPWM_getCounterCompareShadowStatus(), +//! EPWM_setCounterCompareValue(), EPWM_setCounterCompareShadowLoadMode(), +//! EPWM_disableCounterCompareShadowLoadMode() +//! as the \e compModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNTER_COMPARE_A = 0, //!< Counter compare A + EPWM_COUNTER_COMPARE_B = 2, //!< Counter compare B + EPWM_COUNTER_COMPARE_C = 5, //!< Counter compare C + EPWM_COUNTER_COMPARE_D = 7 //!< Counter compare D +} EPWM_CounterCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setCounterCompareShadowLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_COMP_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_COMP_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_COMP_LOAD_FREEZE = 3, + //! Load on sync or when counter equals zero + EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO = 4, + //! Load on sync or when counter equals period + EPWM_COMP_LOAD_ON_SYNC_CNTR_PERIOD = 5, + //! Load on sync or when counter equals zero or period + EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO_PERIOD = 6, + //! Load on sync only + EPWM_COMP_LOAD_ON_SYNC_ONLY = 8 +} EPWM_CounterCompareLoadMode; + +// +// Action Qualifier Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierShadowLoadMode() and +//! EPWM_disableActionQualifierShadowLoadMode() as the \e aqModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_ACTION_QUALIFIER_A = 0, //!< Action Qualifier A + EPWM_ACTION_QUALIFIER_B = 2 //!< Action Qualifier B +} EPWM_ActionQualifierModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierShadowLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_AQ_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_AQ_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_AQ_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_AQ_LOAD_FREEZE = 3, + //! Load on sync or when counter equals zero + EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO = 4, + //! Load on sync or when counter equals period + EPWM_AQ_LOAD_ON_SYNC_CNTR_PERIOD = 5, + //! Load on sync or when counter equals zero or period + EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO_PERIOD = 6, + //! Load on sync only + EPWM_AQ_LOAD_ON_SYNC_ONLY = 8 +} EPWM_ActionQualifierLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierT1TriggerSource() and +//! EPWM_setActionQualifierT2TriggerSource() as the \e trigger parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 = 0, //!< Digital compare event A 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 = 1, //!< Digital compare event A 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 = 2, //!< Digital compare event B 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 = 3, //!< Digital compare event B 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 = 4, //!< Trip zone 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 = 5, //!< Trip zone 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 = 6, //!< Trip zone 3 + EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN = 7 //!< ePWM sync +} EPWM_ActionQualifierTriggerSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierAction() as the \e +//! event parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals zero + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO = 0, + //! Time base counter equals period + EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD = 2, + //! Time base counter up equals COMPA + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA = 4, + //! Time base counter down equals COMPA + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA = 6, + //! Time base counter up equals COMPB + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB = 8, + //! Time base counter down equals COMPB + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB = 10, + //! T1 event on count up + EPWM_AQ_OUTPUT_ON_T1_COUNT_UP = 1, + //! T1 event on count down + EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN = 3, + //! T2 event on count up + EPWM_AQ_OUTPUT_ON_T2_COUNT_UP = 5, + //! T2 event on count down + EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN = 7 +} EPWM_ActionQualifierOutputEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierSWAction(), +//! EPWM_setActionQualifierAction() as the \e outPut parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_OUTPUT_NO_CHANGE = 0, //!< No change in the output pins + EPWM_AQ_OUTPUT_LOW = 1, //!< Set output pins to low + EPWM_AQ_OUTPUT_HIGH = 2, //!< Set output pins to High + EPWM_AQ_OUTPUT_TOGGLE = 3 //!< Toggle the output pins +} EPWM_ActionQualifierOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierContSWForceAction() +//! as the \e outPut parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_SW_DISABLED = 0, //!< Software forcing disabled + EPWM_AQ_SW_OUTPUT_LOW = 1, //!< Set output pins to low + EPWM_AQ_SW_OUTPUT_HIGH = 2 //!< Set output pins to High +} EPWM_ActionQualifierSWOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierActionComplete() +//! as the \e action parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals zero and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_ZERO = 0x0, + //! Time base counter equals zero and set output pins to low + EPWM_AQ_OUTPUT_LOW_ZERO = 0x1, + //! Time base counter equals zero and set output pins to high + EPWM_AQ_OUTPUT_HIGH_ZERO = 0x2, + //! Time base counter equals zero and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_ZERO = 0x3, + //! Time base counter equals period and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_PERIOD = 0x0, + //! Time base counter equals period and set output pins to low + EPWM_AQ_OUTPUT_LOW_PERIOD = 0x4, + //! Time base counter equals period and set output pins to high + EPWM_AQ_OUTPUT_HIGH_PERIOD = 0x8, + //! Time base counter equals period and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_PERIOD = 0xC, + //! Time base counter up equals COMPA and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPA = 0x00, + //! Time base counter up equals COMPA and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_CMPA = 0x10, + //! Time base counter up equals COMPA and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_CMPA = 0x20, + //! Time base counter up equals COMPA and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_CMPA = 0x30, + //! Time base counter down equals COMPA and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPA = 0x00, + //! Time base counter down equals COMPA and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_CMPA = 0x40, + //! Time base counter down equals COMPA and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA = 0x80, + //! Time base counter down equals COMPA and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPA = 0xC0, + //! Time base counter up equals COMPB and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPB = 0x000, + //! Time base counter up equals COMPB and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_CMPB = 0x100, + //! Time base counter up equals COMPB and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_CMPB = 0x200, + //! Time base counter up equals COMPB and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_CMPB = 0x300, + //! Time base counter down equals COMPB and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPB = 0x000, + //! Time base counter down equals COMPB and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_CMPB = 0x400, + //! Time base counter down equals COMPB and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_CMPB = 0x800, + //! Time base counter down equals COMPB and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPB = 0xC00 +} EPWM_ActionQualifierEventAction; + +//***************************************************************************** +// +//! Values that can be passed to +//! EPWM_setAdditionalActionQualifierActionComplete() as the \e action +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! T1 event on count up and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_T1 = 0x0, + //! T1 event on count up and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_T1 = 0x1, + //! T1 event on count up and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_T1 = 0x2, + //! T1 event on count up and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_T1 = 0x3, + //! T1 event on count down and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T1 = 0x0, + //! T1 event on count down and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_T1 = 0x4, + //! T1 event on count down and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_T1 = 0x8, + //! T1 event on count down and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_T1 = 0xC, + //! T2 event on count up and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_T2 = 0x00, + //! T2 event on count up and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_T2 = 0x10, + //! T2 event on count up and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_T2 = 0x20, + //! T2 event on count up and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_T2 = 0x30, + //! T2 event on count down and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T2 = 0x00, + //! T2 event on count down and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_T2 = 0x40, + //! T2 event on count down and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_T2 = 0x80, + //! T2 event on count down and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_T2 = 0xC0 +} EPWM_AdditionalActionQualifierEventAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_forceActionQualifierSWAction(), +//! EPWM_setActionQualifierSWAction(), EPWM_setActionQualifierAction() +//! EPWM_setActionQualifierContSWForceAction() as the \e epwmOutput parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_OUTPUT_A = 0, //!< ePWMxA output + EPWM_AQ_OUTPUT_B = 2 //!< ePWMxB output +} EPWM_ActionQualifierOutputModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierContSWForceShadowMode() +//! as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Shadow mode load when counter equals zero + EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO = 0, + //! Shadow mode load when counter equals period + EPWM_AQ_SW_SH_LOAD_ON_CNTR_PERIOD = 1, + //! Shadow mode load when counter equals zero or period + EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! No shadow load mode. Immediate mode only. + EPWM_AQ_SW_IMMEDIATE_LOAD = 3 +} EPWM_ActionQualifierContForce; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandOutputSwapMode() +//! as the \e output parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_OUTPUT_A = 1, //!< DB output is ePWMA + EPWM_DB_OUTPUT_B = 0 //!< DB output is ePWMB +} EPWM_DeadBandOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandDelayPolarity(), +//! EPWM_setDeadBandDelayMode() as the \e delayMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_RED = 1, //!< DB RED (Rising Edge Delay) mode + EPWM_DB_FED = 0 //!< DB FED (Falling Edge Delay) mode +} EPWM_DeadBandDelayMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandDelayPolarity as the +//! \e polarity parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_POLARITY_ACTIVE_HIGH = 0, //!< DB polarity is not inverted + EPWM_DB_POLARITY_ACTIVE_LOW = 1 //!< DB polarity is inverted +} EPWM_DeadBandPolarity; + +//***************************************************************************** +// +// Values that can be passed to EPWM_setRisingEdgeDeadBandDelayInput(), +// EPWM_setFallingEdgeDeadBandDelayInput() as the input parameter. +// +//***************************************************************************** +//! Input signal is ePWMA +//! +#define EPWM_DB_INPUT_EPWMA 0U +//! Input signal is ePWMB +//! +#define EPWM_DB_INPUT_EPWMB 1U +//! Input signal is the output of Rising Edge delay +//! +#define EPWM_DB_INPUT_DB_RED 2U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandControlShadowLoadMode() as +//! the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_DB_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_DB_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_DB_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_DB_LOAD_FREEZE = 3 +} EPWM_DeadBandControlLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setRisingEdgeDelayCountShadowLoadMode() +//! as the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_RED_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_RED_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_RED_LOAD_FREEZE = 3 +} EPWM_RisingEdgeDelayLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setFallingEdgeDelayCountShadowLoadMode() +//! as the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_FED_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_FED_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_FED_LOAD_FREEZE = 3 +} EPWM_FallingEdgeDelayLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandCounterClock() as the +//! \e clockMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Dead band counter runs at TBCLK rate + EPWM_DB_COUNTER_CLOCK_FULL_CYCLE = 0, + //! Dead band counter runs at 2*TBCLK rate + EPWM_DB_COUNTER_CLOCK_HALF_CYCLE = 1 +} EPWM_DeadBandClockMode; + +// +// Trip Zone +// +//***************************************************************************** +// +// Values that can be passed to EPWM_enableTripZoneSignals() and +// EPWM_disableTripZoneSignals() as the tzSignal parameter. +// +//***************************************************************************** +//! TZ1 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC1 0x1U +//! TZ2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC2 0x2U +//! TZ3 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC3 0x4U +//! TZ4 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC4 0x8U +//! TZ5 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC5 0x10U +//! TZ6 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC6 0x20U +//! DCAEVT2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_DCAEVT2 0x40U +//! DCBEVT2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_DCBEVT2 0x80U +//! One-shot TZ1 +//! +#define EPWM_TZ_SIGNAL_OSHT1 0x100U +//! One-shot TZ2 +//! +#define EPWM_TZ_SIGNAL_OSHT2 0x200U +//! One-shot TZ3 +//! +#define EPWM_TZ_SIGNAL_OSHT3 0x400U +//! One-shot TZ4 +//! +#define EPWM_TZ_SIGNAL_OSHT4 0x800U +//! One-shot TZ5 +//! +#define EPWM_TZ_SIGNAL_OSHT5 0x1000U +//! One-shot TZ6 +//! +#define EPWM_TZ_SIGNAL_OSHT6 0x2000U +//! One-shot DCAEVT1 +//! +#define EPWM_TZ_SIGNAL_DCAEVT1 0x4000U +//! One-shot DCBEVT1 +//! +#define EPWM_TZ_SIGNAL_DCBEVT1 0x8000U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneDigitalCompareEventCondition() +//! as the \e dcType parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_DC_OUTPUT_A1 = 0, //!< Digital Compare output 1 A + EPWM_TZ_DC_OUTPUT_A2 = 3, //!< Digital Compare output 2 A + EPWM_TZ_DC_OUTPUT_B1 = 6, //!< Digital Compare output 1 B + EPWM_TZ_DC_OUTPUT_B2 = 9 //!< Digital Compare output 2 B +} EPWM_TripZoneDigitalCompareOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneDigitalCompareEventCondition() +//! as the \e dcEvent parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_EVENT_DC_DISABLED = 0, //!< Event is disabled + EPWM_TZ_EVENT_DCXH_LOW = 1, //!< Event when DCxH low + EPWM_TZ_EVENT_DCXH_HIGH = 2, //!< Event when DCxH high + EPWM_TZ_EVENT_DCXL_LOW = 3, //!< Event when DCxL low + EPWM_TZ_EVENT_DCXL_HIGH = 4, //!< Event when DCxL high + EPWM_TZ_EVENT_DCXL_HIGH_DCXH_LOW = 5 //!< Event when DCxL high DCxH low +} EPWM_TripZoneDigitalCompareOutputEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAction() as the \e tzEvent +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ACTION_EVENT_TZA = 0, //!< TZ1 - TZ6, DCAEVT2, DCAEVT1 + EPWM_TZ_ACTION_EVENT_TZB = 2, //!< TZ1 - TZ6, DCBEVT2, DCBEVT1 + EPWM_TZ_ACTION_EVENT_DCAEVT1 = 4, //!< DCAEVT1 (Digital Compare A event 1) + EPWM_TZ_ACTION_EVENT_DCAEVT2 = 6, //!< DCAEVT2 (Digital Compare A event 2) + EPWM_TZ_ACTION_EVENT_DCBEVT1 = 8, //!< DCBEVT1 (Digital Compare B event 1) + EPWM_TZ_ACTION_EVENT_DCBEVT2 = 10 //!< DCBEVT2 (Digital Compare B event 2) +} EPWM_TripZoneEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAction() as the +//! \e tzAction parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ACTION_HIGH_Z = 0, //!< High impedance output + EPWM_TZ_ACTION_HIGH = 1, //!< High voltage state + EPWM_TZ_ACTION_LOW = 2, //!< Low voltage state + EPWM_TZ_ACTION_DISABLE = 3 //!< Disable action +} EPWM_TripZoneAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvAction() as the +//! \e tzAdvEvent parameter. +// +//***************************************************************************** +typedef enum +{ + //! TZ1 - TZ6, DCBEVT2, DCBEVT1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_TZB_D = 9, + //! TZ1 - TZ6, DCBEVT2, DCBEVT1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_TZB_U = 6, + //! TZ1 - TZ6, DCAEVT2, DCAEVT1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_TZA_D = 3, + //! TZ1 - TZ6, DCAEVT2, DCAEVT1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_TZA_U = 0 +} EPWM_TripZoneAdvancedEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvDigitalCompareActionA(), +//! EPWM_setTripZoneAdvDigitalCompareActionB(),EPWM_setTripZoneAdvAction() +//! as the \e tzAdvDCAction parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ADV_ACTION_HIGH_Z = 0, //!< High impedance output + EPWM_TZ_ADV_ACTION_HIGH = 1, //!< High voltage state + EPWM_TZ_ADV_ACTION_LOW = 2, //!< Low voltage state + EPWM_TZ_ADV_ACTION_TOGGLE = 3, //!< Toggle the output + EPWM_TZ_ADV_ACTION_DISABLE = 7 //!< Disable action +} EPWM_TripZoneAdvancedAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvDigitalCompareActionA() and +//! EPWM_setTripZoneAdvDigitalCompareActionB() as the \e tzAdvDCEvent +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Digital Compare event A/B 1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U = 0, + //! Digital Compare event A/B 1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D = 3, + //! Digital Compare event A/B 2 while counting up + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U = 6, + //! Digital Compare event A/B 2 while counting down + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D = 9 +} EPWM_TripZoneAdvDigitalCompareEvent; + + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableTripZoneInterrupt()and +// EPWM_disableTripZoneInterrupt() as the tzInterrupt parameter . +// +//***************************************************************************** +//! Trip Zones Cycle By Cycle interrupt +//! +#define EPWM_TZ_INTERRUPT_CBC 0x2U +//! Trip Zones One Shot interrupt +//! +#define EPWM_TZ_INTERRUPT_OST 0x4U +//! Digital Compare A Event 1 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCAEVT1 0x8U +//! Digital Compare A Event 2 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCAEVT2 0x10U +//! Digital Compare B Event 1 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCBEVT1 0x20U +//! Digital Compare B Event 2 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCBEVT2 0x40U + +//***************************************************************************** +// +// Values that can be returned by EPWM_getTripZoneFlagStatus() . +// +//***************************************************************************** +//! Trip Zones Cycle By Cycle flag +//! +#define EPWM_TZ_FLAG_CBC 0x2U +//! Trip Zones One Shot flag +//! +#define EPWM_TZ_FLAG_OST 0x4U +//! Digital Compare A Event 1 flag +//! +#define EPWM_TZ_FLAG_DCAEVT1 0x8U +//! Digital Compare A Event 2 flag +//! +#define EPWM_TZ_FLAG_DCAEVT2 0x10U +//! Digital Compare B Event 1 flag +//! +#define EPWM_TZ_FLAG_DCBEVT1 0x20U +//! Digital Compare B Event 2 flag +//! +#define EPWM_TZ_FLAG_DCBEVT2 0x40U + +//***************************************************************************** +// +// Value can be passed to EPWM_clearTripZoneFlag() as the +// tzInterrupt parameter and returned by EPWM_getTripZoneFlagStatus(). +// +//***************************************************************************** +//! Trip Zone interrupt +//! +#define EPWM_TZ_INTERRUPT 0x1U + +//***************************************************************************** +// +// Values that can be passed to EPWM_clearCycleByCycleTripZoneFlag() +// as the tzCbcFlag parameter and returned by +// EPWM_getCycleByCycleTripZoneFlagStatus(). +// +//***************************************************************************** +//! CBC flag 1 +//! +#define EPWM_TZ_CBC_FLAG_1 0x1U +//! CBC flag 2 +//! +#define EPWM_TZ_CBC_FLAG_2 0x2U +//! CBC flag 3 +//! +#define EPWM_TZ_CBC_FLAG_3 0x4U +//! CBC flag 4 +//! +#define EPWM_TZ_CBC_FLAG_4 0x8U +//! CBC flag 5 +//! +#define EPWM_TZ_CBC_FLAG_5 0x10U +//! CBC flag 6 +//! +#define EPWM_TZ_CBC_FLAG_6 0x20U +//! CBC flag Digital compare event A2 +//! +#define EPWM_TZ_CBC_FLAG_DCAEVT2 0x40U +//! CBC flag Digital compare event B2 +//! +#define EPWM_TZ_CBC_FLAG_DCBEVT2 0x80U + +//***************************************************************************** +// +// Values that can be passed to EPWM_clearOneShotTripZoneFlag() as +// the tzCbcFlag parameter and returned by the +// EPWM_getOneShotTripZoneFlagStatus() . +// +//***************************************************************************** +//! OST flag OST1 +//! +#define EPWM_TZ_OST_FLAG_OST1 0x1U +//! OST flag OST2 +//! +#define EPWM_TZ_OST_FLAG_OST2 0x2U +//! OST flag OST3 +//! +#define EPWM_TZ_OST_FLAG_OST3 0x4U +//! OST flag OST4 +//! +#define EPWM_TZ_OST_FLAG_OST4 0x8U +//! OST flag OST5 +//! +#define EPWM_TZ_OST_FLAG_OST5 0x10U +//! OST flag OST6 +//! +#define EPWM_TZ_OST_FLAG_OST6 0x20U +//! OST flag Digital compare event A1 +//! +#define EPWM_TZ_OST_FLAG_DCAEVT1 0x40U +//! OST flag Digital compare event B1 +//! +#define EPWM_TZ_OST_FLAG_DCBEVT1 0x80U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectCycleByCycleTripZoneClearEvent() as +//! the \e clearMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Clear CBC pulse when counter equals zero + EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO = 0, + //! Clear CBC pulse when counter equals period + EPWM_TZ_CBC_PULSE_CLR_CNTR_PERIOD = 1, + //! Clear CBC pulse when counter equals zero or period + EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD = 2 +} EPWM_CycleByCycleTripZoneClearMode; + +//***************************************************************************** +// +// Values that can be passed to EPWM_forceTripZoneEvent() as the +// tzForceEvent parameter. +// +//***************************************************************************** +//! Force Cycle By Cycle trip event +//! +#define EPWM_TZ_FORCE_EVENT_CBC 0x2U +//! Force a One-Shot Trip Event +//! +#define EPWM_TZ_FORCE_EVENT_OST 0x4U +//! Force Digital Compare Output A Event 1 +//! +#define EPWM_TZ_FORCE_EVENT_DCAEVT1 0x8U +//! Force Digital Compare Output A Event 2 +//! +#define EPWM_TZ_FORCE_EVENT_DCAEVT2 0x10U +//! Force Digital Compare Output B Event 1 +//! +#define EPWM_TZ_FORCE_EVENT_DCBEVT1 0x20U +//! Force Digital Compare Output B Event 2 +//! +#define EPWM_TZ_FORCE_EVENT_DCBEVT2 0x40U + +//***************************************************************************** +// +// Values that can be passed to EPWM_setInterruptSource() as the +// interruptSource parameter. +// +//***************************************************************************** +//! Time-base counter is disabled +//! +#define EPWM_INT_TBCTR_DISABLED 0U +//! Time-base counter equal to zero +//! +#define EPWM_INT_TBCTR_ZERO 1U +//! Time-base counter equal to period +//! +#define EPWM_INT_TBCTR_PERIOD 2U +//! Time-base counter equal to zero or period +//! +#define EPWM_INT_TBCTR_ZERO_OR_PERIOD 3U +//! time-base counter equal to CMPA when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPA 4U +//! time-base counter equal to CMPC when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPC 8U +//! time-base counter equal to CMPA when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPA 5U +//! time-base counter equal to CMPC when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPC 10U +//! time-base counter equal to CMPB when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPB 6U +//! time-base counter equal to CMPD when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPD 12U +//! time-base counter equal to CMPB when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPB 7U +//! time-base counter equal to CMPD when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPD 14U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_enableADCTrigger(), +//! EPWM_disableADCTrigger(),EPWM_setADCTriggerSource(), +//! EPWM_setADCTriggerEventPrescale(),EPWM_getADCTriggerFlagStatus(), +//! EPWM_clearADCTriggerFlag(),EPWM_enableADCTriggerEventCountInit(), +//! EPWM_disableADCTriggerEventCountInit(),EPWM_forceADCTriggerEventCountInit(), +//! EPWM_setADCTriggerEventCountInitValue(),EPWM_getADCTriggerEventCount(), +//! EPWM_forceADCTrigger() as the \e adcSOCType parameter +// +//***************************************************************************** +typedef enum +{ + EPWM_SOC_A = 0, //!< SOC A + EPWM_SOC_B = 1 //!< SOC B +} EPWM_ADCStartOfConversionType; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setADCTriggerSource() as the +//! \e socSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Event is based on DCxEVT1 + EPWM_SOC_DCxEVT1 = 0, + //! Time-base counter equal to zero + EPWM_SOC_TBCTR_ZERO = 1, + //! Time-base counter equal to period + EPWM_SOC_TBCTR_PERIOD = 2, + //! Time-base counter equal to zero or period + EPWM_SOC_TBCTR_ZERO_OR_PERIOD = 3, + //! Time-base counter equal to CMPA when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPA = 4, + //! Time-base counter equal to CMPC when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPC = 8, + //! Time-base counter equal to CMPA when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPA = 5, + //! Time-base counter equal to CMPC when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPC = 10, + //! Time-base counter equal to CMPB when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPB = 6, + //! Time-base counter equal to CMPD when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPD = 12, + //! Time-base counter equal to CMPB when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPB = 7, + //! Time-base counter equal to CMPD when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPD = 14 +} EPWM_ADCStartOfConversionSource; + +// +// Digital Compare Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectDigitalCompareTripInput(), +//! EPWM_enableDigitalCompareTripCombinationInput(), +//! EPWM_disableDigitalCompareTripCombinationInput() as the \e dcType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_TYPE_DCAH = 0, //!< Digital Compare A High + EPWM_DC_TYPE_DCAL = 1, //!< Digital Compare A Low + EPWM_DC_TYPE_DCBH = 2, //!< Digital Compare B High + EPWM_DC_TYPE_DCBL = 3 //!< Digital Compare B Low +} EPWM_DigitalCompareType; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectDigitalCompareTripInput() +//! as the \e tripSource parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_TRIP_TRIPIN1 = 0, //!< Trip 1 + EPWM_DC_TRIP_TRIPIN2 = 1, //!< Trip 2 + EPWM_DC_TRIP_TRIPIN3 = 2, //!< Trip 3 + EPWM_DC_TRIP_TRIPIN4 = 3, //!< Trip 4 + EPWM_DC_TRIP_TRIPIN5 = 4, //!< Trip 5 + EPWM_DC_TRIP_TRIPIN6 = 5, //!< Trip 6 + EPWM_DC_TRIP_TRIPIN7 = 6, //!< Trip 7 + EPWM_DC_TRIP_TRIPIN8 = 7, //!< Trip 8 + EPWM_DC_TRIP_TRIPIN9 = 8, //!< Trip 9 + EPWM_DC_TRIP_TRIPIN10 = 9, //!< Trip 10 + EPWM_DC_TRIP_TRIPIN11 = 10, //!< Trip 11 + EPWM_DC_TRIP_TRIPIN12 = 11, //!< Trip 12 + EPWM_DC_TRIP_TRIPIN14 = 13, //!< Trip 14 + EPWM_DC_TRIP_TRIPIN15 = 14, //!< Trip 15 + EPWM_DC_TRIP_COMBINATION = 15 //!< All Trips (Trip1 - Trip 15) are selected +} EPWM_DigitalCompareTripInput; + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableDigitalCompareTripCombinationInput(), +// EPWM_disableDigitalCompareTripCombinationInput() as the tripInput +// parameter. +// +//***************************************************************************** +//! Combinational Trip 1 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN1 0x1U +//! Combinational Trip 2 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN2 0x2U +//! Combinational Trip 3 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN3 0x4U +//! Combinational Trip 4 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN4 0x8U +//! Combinational Trip 5 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN5 0x10U +//! Combinational Trip 6 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN6 0x20U +//! Combinational Trip 7 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN7 0x40U +//! Combinational Trip 8 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN8 0x80U +//! Combinational Trip 9 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN9 0x100U +//! Combinational Trip 10 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN10 0x200U +//! Combinational Trip 11 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN11 0x400U +//! Combinational Trip 12 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN12 0x800U +//! Combinational Trip 14 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN14 0x2000U +//! Combinational Trip 15 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN15 0x4000U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareBlankingEvent() as the +//! the \e blankingPulse parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals period + EPWM_DC_WINDOW_START_TBCTR_PERIOD = 0, + //! Time base counter equals zero + EPWM_DC_WINDOW_START_TBCTR_ZERO = 1, + //! Time base counter equals zero or period + EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD = 2 +} EPWM_DigitalCompareBlankingPulse; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareFilterInput() +//! as the \e filterInput parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_WINDOW_SOURCE_DCAEVT1 = 0, //!< DC filter signal source is DCAEVT1 + EPWM_DC_WINDOW_SOURCE_DCAEVT2 = 1, //!< DC filter signal source is DCAEVT2 + EPWM_DC_WINDOW_SOURCE_DCBEVT1 = 2, //!< DC filter signal source is DCBEVT1 + EPWM_DC_WINDOW_SOURCE_DCBEVT2 = 3 //!< DC filter signal source is DCBEVT2 +} EPWM_DigitalCompareFilterInput; + +//***************************************************************************** +// +//! Values that can be assigned to EPWM_setDigitalCompareEventSource(), +//! EPWM_setDigitalCompareEventSyncMode(),EPWM_enableDigitalCompareSyncEvent() +//! EPWM_enableDigitalCompareADCTrigger(),EPWM_disableDigitalCompareSyncEvent() +//! EPWM_disableDigitalCompareADCTrigger() as the \e dcModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_MODULE_A = 0, //!< Digital Compare Module A + EPWM_DC_MODULE_B = 1 //!< Digital Compare Module B +} EPWM_DigitalCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSource(), +//! EPWM_setDigitalCompareEventSyncMode as the \e dcEvent parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EVENT_1 = 0, //!< Digital Compare Event number 1 + EPWM_DC_EVENT_2 = 1 //!< Digital Compare Event number 2 +} EPWM_DigitalCompareEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSource() as the +//! \e dcEventSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Signal source is unfiltered (DCAEVT1/2) + EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL = 0, + //! Signal source is filtered (DCEVTFILT) + EPWM_DC_EVENT_SOURCE_FILT_SIGNAL = 1 +} EPWM_DigitalCompareEventSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSyncMode() as the +//! \e syncMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! DC input signal is synced with TBCLK + EPWM_DC_EVENT_INPUT_SYNCED = 0, + //! DC input signal is not synced with TBCLK + EPWM_DC_EVENT_INPUT_NOT_SYNCED = 1 +} EPWM_DigitalCompareSyncMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setGlobalLoadTrigger() as the +//! \e loadTrigger parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter is equal to zero + EPWM_GL_LOAD_PULSE_CNTR_ZERO = 0x0, + //! Load when counter is equal to period + EPWM_GL_LOAD_PULSE_CNTR_PERIOD = 0x1, + //! Load when counter is equal to zero or period + EPWM_GL_LOAD_PULSE_CNTR_ZERO_PERIOD = 0x2, + //! Load on sync event + EPWM_GL_LOAD_PULSE_SYNC = 0x3, + //! Load on sync event or when counter is equal to zero + EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_ZERO = 0x4, + //! Load on sync event or when counter is equal to period + EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_PERIOD = 0x5, + //! Load on sync event or when counter is equal to period or zero + EPWM_GL_LOAD_PULSE_SYNC_CNTR_ZERO_PERIOD = 0x6, + //! Load on global force + EPWM_GL_LOAD_PULSE_GLOBAL_FORCE = 0xF +} EPWM_GlobalLoadTrigger; + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableGlobalLoadRegisters(), +// EPWM_disableGlobalLoadRegisters() as theloadRegister parameter. +// +//***************************************************************************** +//! Global load TBPRD:TBPRDHR +//! +#define EPWM_GL_REGISTER_TBPRD_TBPRDHR 0x1U +//! Global load CMPA:CMPAHR +//! +#define EPWM_GL_REGISTER_CMPA_CMPAHR 0x2U +//! Global load CMPB:CMPBHR +//! +#define EPWM_GL_REGISTER_CMPB_CMPBHR 0x4U +//! Global load CMPC +//! +#define EPWM_GL_REGISTER_CMPC 0x8U +//! Global load CMPD +//! +#define EPWM_GL_REGISTER_CMPD 0x10U +//! Global load DBRED:DBREDHR +//! +#define EPWM_GL_REGISTER_DBRED_DBREDHR 0x20U +//! Global load DBFED:DBFEDHR +//! +#define EPWM_GL_REGISTER_DBFED_DBFEDHR 0x40U +//! Global load DBCTL +//! +#define EPWM_GL_REGISTER_DBCTL 0x80U +//! Global load AQCTLA/A2 +//! +#define EPWM_GL_REGISTER_AQCTLA_AQCTLA2 0x100U +//! Global load AQCTLB/B2 +//! +#define EPWM_GL_REGISTER_AQCTLB_AQCTLB2 0x200U +//! Global load AQCSFRC +//! +#define EPWM_GL_REGISTER_AQCSFRC 0x400U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setValleyTriggerSource() as the \e +//! trigger parameter. +// +//***************************************************************************** +typedef enum +{ + //! Valley capture trigged by software + EPWM_VALLEY_TRIGGER_EVENT_SOFTWARE = 0U, + //! Valley capture trigged by when counter is equal to zero + EPWM_VALLEY_TRIGGER_EVENT_CNTR_ZERO = 1U, + //! Valley capture trigged by when counter is equal period + EPWM_VALLEY_TRIGGER_EVENT_CNTR_PERIOD = 2U, + //! Valley capture trigged when counter is equal to zero or period + EPWM_VALLEY_TRIGGER_EVENT_CNTR_ZERO_PERIOD = 3U, + //! Valley capture trigged by DCAEVT1 (Digital Compare A event 1) + EPWM_VALLEY_TRIGGER_EVENT_DCAEVT1 = 4U, + //! Valley capture trigged by DCAEVT2 (Digital Compare A event 2) + EPWM_VALLEY_TRIGGER_EVENT_DCAEVT2 = 5U, + //! Valley capture trigged by DCBEVT1 (Digital Compare B event 1) + EPWM_VALLEY_TRIGGER_EVENT_DCBEVT1 = 6U, + //! Valley capture trigged by DCBEVT2 (Digital Compare B event 2) + EPWM_VALLEY_TRIGGER_EVENT_DCBEVT2 = 7U +} EPWM_ValleyTriggerSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_getValleyCountEdgeStatus() as the \e edge +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_VALLEY_COUNT_START_EDGE = 0, //!< Valley count start edge + EPWM_VALLEY_COUNT_STOP_EDGE = 1 //!< Valley count stop edge +} EPWM_ValleyCounterEdge; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setValleyDelayValue() as the \e delayMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Delay value equals the offset value defines by software + EPWM_VALLEY_DELAY_MODE_SW_DELAY = 0U, + //! Delay value equals the sum of the Hardware counter value and the offset + //! value defines by software + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SW_DELAY = 1U, + //! Delay value equals the the Hardware counter shifted by + //! (1 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_1_SW_DELAY = 2U, + //! Delay value equals the the Hardware counter shifted by + //! (2 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_2_SW_DELAY = 3U, + //! Delay value equals the the Hardware counter shifted by + //! (4 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_4_SW_DELAY = 4U +} EPWM_ValleyDelayMode; + +// +// DC Edge Filter +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEdgeFilterMode() +//! as the \e edgeMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EDGEFILT_MODE_RISING = 0, //!< Digital Compare Edge filter low + //!< to high edge mode + EPWM_DC_EDGEFILT_MODE_FALLING = 1, //!< Digital Compare Edge filter high + //!< to low edge mode + EPWM_DC_EDGEFILT_MODE_BOTH = 2 //!< Digital Compare Edge filter both + //!< edges mode +} EPWM_DigitalCompareEdgeFilterMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEdgeFilterEdgeCount() +//! as the \e edgeCount parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EDGEFILT_EDGECNT_0 = 0, //!< Digital Compare Edge filter edge + //!< count = 0 + EPWM_DC_EDGEFILT_EDGECNT_1 = 1, //!< Digital Compare Edge filter edge + //!< count = 1 + EPWM_DC_EDGEFILT_EDGECNT_2 = 2, //!< Digital Compare Edge filter edge + //!< count = 2 + EPWM_DC_EDGEFILT_EDGECNT_3 = 3, //!< Digital Compare Edge filter edge + //!< count = 3 + EPWM_DC_EDGEFILT_EDGECNT_4 = 4, //!< Digital Compare Edge filter edge + //!< count = 4 + EPWM_DC_EDGEFILT_EDGECNT_5 = 5, //!< Digital Compare Edge filter edge + //!< count = 5 + EPWM_DC_EDGEFILT_EDGECNT_6 = 6, //!< Digital Compare Edge filter edge + //!< count = 6 + EPWM_DC_EDGEFILT_EDGECNT_7 = 7 //!< Digital Compare Edge filter edge + //!< count = 7 +} EPWM_DigitalCompareEdgeFilterEdgeCount; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_configureSignal() as the +//! \e signalParams parameter. +// +//***************************************************************************** +typedef struct +{ + float32_t freqInHz; //!< Desired Signal Frequency(in Hz) + float32_t dutyValA; //!< Desired ePWMxA Signal Duty + float32_t dutyValB; //!< Desired ePWMxB Signal Duty + bool invertSignalB; //!< Invert ePWMxB Signal if true + float32_t sysClkInHz; //!< SYSCLK Frequency(in Hz) + SysCtl_EPWMCLKDivider epwmClkDiv; //!< EPWM Clock Divider + EPWM_TimeBaseCountMode tbCtrMode; //!< Time Base Counter Mode + EPWM_ClockDivider tbClkDiv; //!< Time Base Counter Clock Divider + EPWM_HSClockDivider tbHSClkDiv; //!< Time Base Counter HS Clock Divider +} EPWM_SignalParams; + +//***************************************************************************** +// +// Functions APIs shared with HRPWM module +// +//***************************************************************************** + +// +// Period Control related API +// +#define EPWM_setSyncPulseSource HRPWM_setSyncPulseSource + +//***************************************************************************** +// +// Prototypes for the API. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \internal +//! Checks ePWM base address. +//! +//! \param base specifies the ePWM module base address. +//! +//! This function determines if an ePWM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool EPWM_isBaseValid(uint32_t base) +{ + return( + (base == EPWM1_BASE) || + (base == EPWM2_BASE) || + (base == EPWM3_BASE) || + (base == EPWM4_BASE) || + (base == EPWM5_BASE) || + (base == EPWM6_BASE) || + (base == EPWM7_BASE) || + (base == EPWM8_BASE) || + (base == EPWM9_BASE) || + (base == EPWM10_BASE) || + (base == EPWM11_BASE) || + (base == EPWM12_BASE) + ); +} +#endif + +// +// Time Base Sub Module related APIs +// +//***************************************************************************** +// +//! Set the time base count +//! +//! \param base is the base address of the EPWM module. +//! \param count is the time base count value. +//! +//! This function sets the 16 bit counter value of the time base counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBaseCounter(uint32_t base, uint16_t count) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBCTR register + // + HWREGH(base + EPWM_O_TBCTR) = count; +} + +//***************************************************************************** +// +//! Set count mode after phase shift sync +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the count mode. +//! +//! This function sets the time base count to count up or down after a new +//! phase value set by the EPWM_setPhaseShift(). The count direction is +//! determined by the variable mode. Valid inputs for mode are: +//! - EPWM_COUNT_MODE_UP_AFTER_SYNC - Count up after sync +//! - EPWM_COUNT_MODE_DOWN_AFTER_SYNC - Count down after sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCountModeAfterSync(uint32_t base, EPWM_SyncCountMode mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(mode == EPWM_COUNT_MODE_UP_AFTER_SYNC) + { + // + // Set PHSDIR bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PHSDIR; + } + else + { + // + // Clear PHSDIR bit + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PHSDIR; + } +} + +//***************************************************************************** +// +//! Set the time base clock and the high speed time base clock count pre-scaler +//! +//! \param base is the base address of the EPWM module. +//! \param prescaler is the time base count pre scale value. +//! \param highSpeedPrescaler is the high speed time base count pre scale +//! value. +//! +//! This function sets the pre scaler(divider)value for the time base clock +//! counter and the high speed time base clock counter. +//! Valid values for pre-scaler and highSpeedPrescaler are EPWM_CLOCK_DIVIDER_X, +//! where X is 1,2,4,8,16, 32,64 or 128. +//! The actual numerical values for these macros represent values 0,1...7. +//! The equation for the output clock is: +//! TBCLK = EPWMCLK/(highSpeedPrescaler * pre-scaler) +//! +//! \b Note: EPWMCLK is a scaled version of SYSCLK. At reset EPWMCLK is half +//! SYSCLK. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setClockPrescaler(uint32_t base, EPWM_ClockDivider prescaler, + EPWM_HSClockDivider highSpeedPrescaler) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to CLKDIV and HSPCLKDIV bit + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & + ~(EPWM_TBCTL_CLKDIV_M | EPWM_TBCTL_HSPCLKDIV_M)) | + (((uint16_t)prescaler << EPWM_TBCTL_CLKDIV_S) | + ((uint16_t)highSpeedPrescaler << EPWM_TBCTL_HSPCLKDIV_S))); +} + +//***************************************************************************** +// +//! Force a software sync pulse +//! +//! \param base is the base address of the EPWM module. +//! +//! This function causes a single software initiated sync pulse. Make sure the +//! appropriate mode is selected using EPWM_setupSyncOutputMode() before using +//! this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceSyncPulse(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SWFSYNC bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_SWFSYNC; +} + +//***************************************************************************** +// +//! Set up the sync out pulse event +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the sync out mode. +//! +//! This function set the sync out pulse mode. +//! Valid values for mode are: +//! - EPWM_SYNC_OUT_PULSE_ON_SOFTWARE - sync pulse is generated by software +//! when EPWM_forceSyncPulse() +//! function is called or by EPWMxSYNCI +//! signal. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO - sync pulse is generated when +//! time base counter equals zero. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B - sync pulse is generated when +//! time base counter equals compare +//! B value. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C - sync pulse is generated when +//! time base counter equals compare +//! C value. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D - sync pulse is generated when +//! time base counter equals compare +//! D value. +//! - EPWM_SYNC_OUT_PULSE_DISABLED - sync pulse is disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setSyncOutPulseMode(uint32_t base, EPWM_SyncOutPulseMode mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // No extended mode support + // + if(mode < EPWM_SYNC_OUT_PULSE_DISABLED) + { + // + // Write to SYNCOSEL bits + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & ~(EPWM_TBCTL_SYNCOSEL_M)) | + ((uint16_t)mode << EPWM_TBCTL_SYNCOSEL_S)); + } + // + // Extended modes and sync out disable mode + // + else + { + // + // Write 0x3 to SYNCOSEL to enable selection from SYNCOSELX + // + HWREGH(base + EPWM_O_TBCTL) = HWREGH(base + EPWM_O_TBCTL) | + EPWM_TBCTL_SYNCOSEL_M; + + // + // Write to SYNCOSELX bit + // + HWREGH(base + EPWM_O_TBCTL2) = + ((HWREGH(base + EPWM_O_TBCTL2) & ~(EPWM_TBCTL2_SYNCOSELX_M)) | + (((uint16_t)mode & 0x3U) << EPWM_TBCTL2_SYNCOSELX_S)); + } +} + +//***************************************************************************** +// +//! Set PWM period load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the PWM period load mode. +//! +//! This function sets the load mode for the PWM period. If loadMode is set to +//! EPWM_PERIOD_SHADOW_LOAD, a write or read to the TBPRD (PWM Period count +//! register) accesses the shadow register. If loadMode is set to +//! EPWM_PERIOD_DIRECT_LOAD, a write or read to the TBPRD register accesses the +//! register directly. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setPeriodLoadMode(uint32_t base, EPWM_PeriodLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(loadMode == EPWM_PERIOD_SHADOW_LOAD) + { + // + // Clear PRDLD + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PRDLD; + } + else + { + // + // Set PRDLD + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PRDLD; + } +} + +//***************************************************************************** +// +//! Enable phase shift load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables loading of phase shift when the appropriate sync +//! event occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set PHSEN bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PHSEN; +} + +//***************************************************************************** +// +//! Disable phase shift load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables loading of phase shift. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear PHSEN bit + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PHSEN; +} + +//***************************************************************************** +// +//! Set time base counter mode +//! +//! \param base is the base address of the EPWM module. +//! \param counterMode is the time base counter mode. +//! +//! This function sets up the time base counter mode. +//! Valid values for counterMode are: +//! - EPWM_COUNTER_MODE_UP - Up - count mode. +//! - EPWM_COUNTER_MODE_DOWN - Down - count mode. +//! - EPWM_COUNTER_MODE_UP_DOWN - Up - down - count mode. +//! - EPWM_COUNTER_MODE_STOP_FREEZE - Stop - Freeze counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBaseCounterMode(uint32_t base, EPWM_TimeBaseCountMode counterMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to CTRMODE bit + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & ~(EPWM_TBCTL_CTRMODE_M)) | + ((uint16_t)counterMode)); +} + +//***************************************************************************** +// +//! Set shadow to active period load on sync mode +//! +//! \param base is the base address of the EPWM module. +//! \param shadowLoadMode is the shadow to active load mode. +//! +//! This function sets up the shadow to active Period register load mode with +//! respect to a sync event. Valid values for shadowLoadMode are: +//! - EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO - shadow to active load occurs when +//! time base counter reaches 0. +//! - EPWM_SHADOW_LOAD_MODE_COUNTER_SYNC - shadow to active load occurs when +//! time base counter reaches 0 and a +//! SYNC occurs. +//! - EPWM_SHADOW_LOAD_MODE_SYNC - shadow to active load occurs only +//! when a SYNC occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_selectPeriodLoadEvent(uint32_t base, + EPWM_PeriodShadowLoadMode shadowLoadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to PRDLDSYNC bit + // + HWREGH(base + EPWM_O_TBCTL2) = + ((HWREGH(base + EPWM_O_TBCTL2) & ~(EPWM_TBCTL2_PRDLDSYNC_M)) | + ((uint16_t)shadowLoadMode << EPWM_TBCTL2_PRDLDSYNC_S)); +} +//***************************************************************************** +// +//! Enable one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables one shot sync mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set OSHTSYNCMODE bit + // + HWREGH(base + EPWM_O_TBCTL2) |= EPWM_TBCTL2_OSHTSYNCMODE; +} + +//***************************************************************************** +// +//! Disable one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables one shot sync mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear OSHTSYNCMODE bit + // + HWREGH(base + EPWM_O_TBCTL2) &= ~EPWM_TBCTL2_OSHTSYNCMODE; +} + +//***************************************************************************** +// +//! Start one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function propagates a one shot sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_startOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set OSHTSYNC bit + // + HWREGH(base + EPWM_O_TBCTL2) |= EPWM_TBCTL2_OSHTSYNC; +} + +//***************************************************************************** +// +//! Returns time base counter value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the current value of the time base counter. +//! +//! \return returns time base counter value +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBaseCounterValue(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Returns TBCTR value + // + return(HWREGH(base + EPWM_O_TBCTR)); +} + +//***************************************************************************** +// +//! Return time base counter maximum status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the status of the time base max counter. +//! +//! \return Returns true if the counter has reached 0xFFFF. +//! Returns false if the counter hasn't reached 0xFFFF. +// +//***************************************************************************** +static inline bool +EPWM_getTimeBaseCounterOverflowStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return true if CTRMAX bit is set, false otherwise + // + return(((HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_CTRMAX) == + EPWM_TBSTS_CTRMAX) ? true : false); +} + +//***************************************************************************** +// +//! Clear max time base counter event. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the max time base counter latch event. The latch event +//! occurs when the time base counter reaches its maximum value of 0xFFFF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_clearTimeBaseCounterOverflowEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set CTRMAX bit + // + HWREGH(base + EPWM_O_TBSTS) = EPWM_TBSTS_CTRMAX; +} + +//***************************************************************************** +// +//! Return external sync signal status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the external sync signal status. +//! +//! \return Returns true if if an external sync signal event +//! Returns false if there is no event. +// +//***************************************************************************** +static inline bool +EPWM_getSyncStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return true if SYNCI bit is set, false otherwise + // + return(((HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_SYNCI) == + EPWM_TBSTS_SYNCI) ? true : false); +} + +//***************************************************************************** +// +//! Clear external sync signal event. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the external sync signal latch event. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_clearSyncEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SYNCI bit + // + HWREGH(base + EPWM_O_TBSTS) = EPWM_TBSTS_SYNCI; +} + +//***************************************************************************** +// +//! Return time base counter direction. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the direction of the time base counter. +//! +//! \return returns EPWM_TIME_BASE_STATUS_COUNT_UP if the counter is counting +//! up or EPWM_TIME_BASE_STATUS_COUNT_DOWN if the counter is +//! counting down. +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBaseCounterDirection(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return CTRDIR bit + // + return(HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_CTRDIR); +} + +//***************************************************************************** +// +//! Sets the phase shift offset counter value. +//! +//! \param base is the base address of the EPWM module. +//! \param phaseCount is the phase shift count value. +//! +//! This function sets the 16 bit time-base counter phase of the ePWM relative +//! to the time-base that is supplying the synchronization input signal. Call +//! the EPWM_enablePhaseShiftLoad() function to enable loading of the +//! phaseCount phase shift value when a sync event occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setPhaseShift(uint32_t base, uint16_t phaseCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBPHS bit + // + HWREG(base + EPWM_O_TBPHS) = + ((HWREG(base + EPWM_O_TBPHS) & + ~((uint32_t)EPWM_TBPHS_TBPHS_M)) | + ((uint32_t)phaseCount << EPWM_TBPHS_TBPHS_S)); +} + +//***************************************************************************** +// +//! Sets the PWM period count. +//! +//! \param base is the base address of the EPWM module. +//! \param periodCount is period count value. +//! +//! This function sets the period of the PWM count. The value of periodCount is +//! the value written to the register. User should map the desired period or +//! frequency of the waveform into the correct periodCount. +//! Invoke the function EPWM_selectPeriodLoadEvent() with the appropriate +//! parameter to set the load mode of the Period count. periodCount has a +//! maximum valid value of 0xFFFF +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBasePeriod(uint32_t base, uint16_t periodCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBPRD bit + // + HWREGH(base + EPWM_O_TBPRD) = periodCount; +} + +//***************************************************************************** +// +//! Gets the PWM period count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets the period of the PWM count. +//! +//! \return The period count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBasePeriod(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read from TBPRD bit + // + return(HWREGH(base + EPWM_O_TBPRD)); +} + +//***************************************************************************** +// +//! Sets the EPWM links. +//! +//! \param base is the base address of the EPWM module. +//! \param epwmLink is the ePWM instance to link with. +//! \param linkComp is the ePWM component to link. +//! +//! This function links the component defined in linkComp in the current ePWM +//! instance with the linkComp component of the ePWM instance defined by +//! epwmLink. A change (a write) in the value of linkComp component of epwmLink +//! instance, causes a change in the current ePWM linkComp component. +//! For example if the current ePWM is ePWM3 and the values of epwmLink and +//! linkComp are EPWM_LINK_WITH_EPWM_1 and EPWM_LINK_COMP_C respectively, +//! then a write to COMPC register in ePWM1, will result in a simultaneous +//! write to COMPC register in ePWM3. +//! Valid values for epwmLink are: +//! - EPWM_LINK_WITH_EPWM_1 - link current ePWM with ePWM1 +//! - EPWM_LINK_WITH_EPWM_2 - link current ePWM with ePWM2 +//! - EPWM_LINK_WITH_EPWM_3 - link current ePWM with ePWM3 +//! - EPWM_LINK_WITH_EPWM_4 - link current ePWM with ePWM4 +//! - EPWM_LINK_WITH_EPWM_5 - link current ePWM with ePWM5 +//! - EPWM_LINK_WITH_EPWM_6 - link current ePWM with ePWM6 +//! - EPWM_LINK_WITH_EPWM_7 - link current ePWM with ePWM7 +//! - EPWM_LINK_WITH_EPWM_8 - link current ePWM with ePWM8 +//! - EPWM_LINK_WITH_EPWM_9 - link current ePWM with ePWM9 +//! - EPWM_LINK_WITH_EPWM_10 - link current ePWM with ePWM10 +//! - EPWM_LINK_WITH_EPWM_11 - link current ePWM with ePWM11 +//! - EPWM_LINK_WITH_EPWM_12 - link current ePWM with ePWM12 +//! +//! Valid values for linkComp are: +//! - EPWM_LINK_TBPRD - link TBPRD:TBPRDHR registers +//! - EPWM_LINK_COMP_A - link COMPA registers +//! - EPWM_LINK_COMP_B - link COMPB registers +//! - EPWM_LINK_COMP_C - link COMPC registers +//! - EPWM_LINK_COMP_D - link COMPD registers +//! - EPWM_LINK_GLDCTL2 - link GLDCTL2 registers +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setupEPWMLinks(uint32_t base, EPWM_CurrentLink epwmLink, + EPWM_LinkComponent linkComp) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + uint32_t registerOffset; + registerOffset = base + EPWM_O_XLINK; + + // + // Configure EPWM links + // + HWREG(registerOffset) = + ((HWREG(registerOffset) & ~((uint32_t)EPWM_XLINK_TBPRDLINK_M << (uint32_t)linkComp)) | + ((uint32_t)epwmLink << (uint32_t)linkComp)); +} + + +//***************************************************************************** +// +//! Sets up the Counter Compare shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the counter compare module. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets up the counter compare shadow load mode. +//! Valid values for the variables are: +//! - compModule +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! - loadMode +//! - EPWM_COMP_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - EPWM_COMP_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_COMP_LOAD_FREEZE - Freeze shadow to active load +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO - load when counter equals zero +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_PERIOD -load when counter equals period +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_COMP_LOAD_ON_SYNC_ONLY - load on sync only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCounterCompareShadowLoadMode(uint32_t base, + EPWM_CounterCompareModule compModule, + EPWM_CounterCompareLoadMode loadMode) +{ + uint16_t syncModeOffset; + uint16_t loadModeOffset; + uint16_t shadowModeOffset; + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_C)) + { + syncModeOffset = 10U; + loadModeOffset = 0U; + shadowModeOffset = 4U; + } + else + { + syncModeOffset = 12U; + loadModeOffset = 2U; + shadowModeOffset = 6U; + } + + // + // Get the register offset. EPWM_O_CMPCTL for A&B or + // EPWM_O_CMPCTL2 for C&D + // + registerOffset = base + EPWM_O_CMPCTL + ((uint32_t)compModule & 0x1U); + + // + // Set the appropriate sync and load mode bits and also enable shadow + // load mode. Shadow to active load can also be frozen. + // + HWREGH(registerOffset) = ((HWREGH(registerOffset) & + ~((0x3U << syncModeOffset) | // Clear sync mode + (0x3U << loadModeOffset) | // Clear load mode + (0x1U << shadowModeOffset))) | // shadow mode + ((((uint16_t)loadMode >> 2U) << syncModeOffset) | + (((uint16_t)loadMode & 0x3U) << loadModeOffset))); +} + +//***************************************************************************** +// +//! Disable Counter Compare shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the counter compare module. +//! +//! This function disables counter compare shadow load mode. +//! Valid values for the variables are: +//! - compModule +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableCounterCompareShadowLoadMode(uint32_t base, + EPWM_CounterCompareModule compModule) +{ + uint16_t shadowModeOffset; + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_C)) + { + shadowModeOffset = 4U; + } + else + { + shadowModeOffset = 6U; + } + + // + // Get the register offset. EPWM_O_CMPCTL for A&B or + // EPWM_O_CMPCTL2 for C&D + // + registerOffset = base + EPWM_O_CMPCTL + ((uint32_t)compModule & 0x1U); + + // + // Disable shadow load mode. + // + HWREGH(registerOffset) = (HWREGH(registerOffset) | + (0x1U << shadowModeOffset)); +} + +//***************************************************************************** +// +//! Set counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! \param compCount is the counter compare count value. +//! +//! This function sets the counter compare value for counter compare registers. +//! The maximum value for compCount is 0xFFFF. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule, + uint16_t compCount) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset for the Counter compare + // + registerOffset = EPWM_O_CMPA + (uint32_t)compModule; + + // + // Write to the counter compare registers. + // + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)) + { + // + // Write to COMPA or COMPB bits + // + HWREGH(base + registerOffset + 0x1U) = compCount; + } + else + { + // + // Write to COMPC or COMPD bits + // + HWREGH(base + registerOffset) = compCount; + } +} + +//***************************************************************************** +// +//! Get counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! +//! This function gets the counter compare value for counter compare registers. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return The counter compare count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule) +{ + uint32_t registerOffset; + uint16_t compCount; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset for the Counter compare + // + registerOffset = EPWM_O_CMPA + (uint32_t)compModule; + + // + // Read from the counter compare registers. + // + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)) + { + // + // Read COMPA or COMPB bits + // + compCount = (uint16_t)((HWREG(base + registerOffset) & + 0xFFFF0000UL) >> 16U); + } + else + { + // + // Read COMPC or COMPD bits + // + compCount = HWREGH(base + registerOffset); + } + return(compCount); +} + +//***************************************************************************** +// +//! Return the counter compare shadow register full status. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! +//! This function returns the counter Compare shadow register full status flag. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \return Returns true if the shadow register is full. +//! Returns false if the shadow register is not full. +// +//***************************************************************************** +static inline bool +EPWM_getCounterCompareShadowStatus(uint32_t base, + EPWM_CounterCompareModule compModule) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Check the validity of input. + // COMPA and COMPB are valid input arguments. + // + ASSERT((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)); + + // + // Read the value of SHDWAFULL or SHDWBFULL bit + // + return((((HWREG(base + EPWM_O_CMPCTL) >> + ((((uint16_t)compModule >> 1U) & 0x1U) + 8U)) & + 0x1U) == 0x1U) ? true:false); +} + +// +// Action Qualifier module related APIs +// +//***************************************************************************** +// +//! Sets the Action Qualifier shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param aqModule is the Action Qualifier module value. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets the Action Qualifier shadow load mode. +//! Valid values for the variables are: +//! - aqModule +//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A. +//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B. +//! - loadMode +//! - EPWM_AQ_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - EPWM_AQ_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - EPWM_AQ_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_AQ_LOAD_FREEZE - Freeze shadow to active load +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO - load on sync or when counter +//! equals zero +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_PERIOD - load on sync or when counter +//! equals period +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO_PERIOD - load on sync or when +//! counter equals zero or period +//! - EPWM_AQ_LOAD_ON_SYNC_ONLY - load on sync only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierShadowLoadMode(uint32_t base, + EPWM_ActionQualifierModule aqModule, + EPWM_ActionQualifierLoadMode loadMode) +{ + uint16_t syncModeOffset; + uint16_t shadowModeOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + syncModeOffset = 8U + (uint16_t)aqModule; + shadowModeOffset = 4U + (uint16_t)aqModule; + + // + // Set the appropriate sync and load mode bits and also enable shadow + // load mode. Shadow to active load can also be frozen. + // + HWREGH(base + EPWM_O_AQCTL) = ((HWREGH(base + EPWM_O_AQCTL) & + (~((0x3U << (uint16_t)aqModule) | + (0x3U << (uint16_t)syncModeOffset))) | + (0x1U << shadowModeOffset)) | + ((((uint16_t)loadMode >> 2U) << + syncModeOffset) | (((uint16_t)loadMode & + 0x3U) << (uint16_t)aqModule))); +} + +//***************************************************************************** +// +//! Disable Action Qualifier shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param aqModule is the Action Qualifier module value. +//! +//! This function disables the Action Qualifier shadow load mode. +//! Valid values for the variables are: +//! - aqModule +//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A. +//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableActionQualifierShadowLoadMode(uint32_t base, + EPWM_ActionQualifierModule aqModule) +{ + uint16_t shadowModeOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + shadowModeOffset = 4U + (uint16_t)aqModule; + + // + // Disable shadow load mode. Action qualifier is loaded on + // immediate mode only. + // + HWREGH(base + EPWM_O_AQCTL) &= ~(1U << shadowModeOffset); +} + +//***************************************************************************** +// +//! Set up Action qualifier trigger source for event T1 +//! +//! \param base is the base address of the EPWM module. +//! \param trigger sources for Action Qualifier triggers. +//! +//! This function sets up the sources for Action Qualifier event T1. +//! Valid values for trigger are: +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierT1TriggerSource(uint32_t base, + EPWM_ActionQualifierTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set T1 trigger source + // + HWREGH(base + EPWM_O_AQTSRCSEL) = + ((HWREGH(base + EPWM_O_AQTSRCSEL) & (~EPWM_AQTSRCSEL_T1SEL_M)) | + ((uint16_t)trigger)); +} + +//***************************************************************************** +// +//! Set up Action qualifier trigger source for event T2 +//! +//! \param base is the base address of the EPWM module. +//! \param trigger sources for Action Qualifier triggers. +//! +//! This function sets up the sources for Action Qualifier event T2. +//! Valid values for trigger are: +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierT2TriggerSource(uint32_t base, + EPWM_ActionQualifierTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set T2 trigger source + // + HWREGH(base + EPWM_O_AQTSRCSEL) = + ((HWREGH(base + EPWM_O_AQTSRCSEL) & (~EPWM_AQTSRCSEL_T2SEL_M)) | + ((uint16_t)trigger << EPWM_AQTSRCSEL_T2SEL_S)); +} + +//***************************************************************************** +// +//! Set up Action qualifier outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! \param event is the event that causes a change in output. +//! +//! This function sets up the Action Qualifier output on ePWM A or ePWMB, +//! depending on the value of epwmOutput, to a value specified by outPut based +//! on the input events - specified by event. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins +//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High +//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins +//! - event +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO - Time base counter equals +//! zero +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD - Time base counter equals +//! period +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA - Time base counter up equals +//! COMPA +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA - Time base counter down +//! equals COMPA +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB - Time base counter up equals +//! COMPB +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB - Time base counter down +//! equals COMPB +//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_UP - T1 event on count up +//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN - T1 event on count down +//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_UP - T2 event on count up +//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN - T2 event on count down +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierOutput output, + EPWM_ActionQualifierOutputEvent event) +{ + uint32_t registerOffset; + uint32_t registerTOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerOffset = EPWM_O_AQCTLA + (uint32_t)epwmOutput; + registerTOffset = EPWM_O_AQCTLA2 + (uint32_t)epwmOutput; + + // + // If the event occurs on T1 or T2 events + // + if(((uint16_t)event & 0x1U) == 1U) + { + // + // Write to T1U,T1D,T2U or T2D of AQCTLA2 register + // + HWREGH(base + registerTOffset) = + ((HWREGH(base + registerTOffset) & ~(3U << ((uint16_t)event - 1U))) | + ((uint16_t)output << ((uint16_t)event - 1U))); + } + else + { + // + // Write to ZRO,PRD,CAU,CAD,CBU or CBD bits of AQCTLA register + // + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~(3U << (uint16_t)event)) | + ((uint16_t)output << (uint16_t)event)); + } +} + +//***************************************************************************** +// +//! Set up Action qualifier event outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param action is the desired action when the specified event occurs +//! +//! This function sets up the Action Qualifier output on ePWMA or ePWMB, +//! depending on the value of epwmOutput, to a value specified by action. +//! Valid action param values from different time base counter scenarios +//! should be OR'd together to configure complete action for a pwm output. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! +//! - action +//! - When time base counter equals zero +//! - EPWM_AQ_OUTPUT_NO_CHANGE_ZERO - Time base counter equals zero +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_ZERO - Time base counter equals zero +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_ZERO - Time base counter equals zero +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_ZERO - Time base counter equals zero +//! and toggle the output pins +//! - When time base counter equals period +//! - EPWM_AQ_OUTPUT_NO_CHANGE_PERIOD - Time base counter equals period +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_PERIOD - Time base counter equals period +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_PERIOD - Time base counter equals period +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_PERIOD - Time base counter equals period +//! and toggle the output pins +//! - When time base counter equals CMPA during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPA - Time base counter up equals +//! COMPA and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_CMPA - Time base counter up equals +//! COMPA and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPA - Time base counter up equals +//! COMPA and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPA - Time base counter up equals +//! COMPA and toggle output pins +//! - When time base counter equals CMPA during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPA - Time base counter down equals +//! COMPA and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPA - Time base counter down equals +//! COMPA and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA - Time base counter down equals +//! COMPA and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPA - Time base counter down equals +//! COMPA and toggle output pins +//! - When time base counter equals CMPB during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPB - Time base counter up equals +//! COMPB and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_CMPB - Time base counter up equals +//! COMPB and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPB - Time base counter up equals +//! COMPB and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPB - Time base counter up equals +//! COMPB and toggle output pins +//! - When time base counter equals CMPB during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPB- Time base counter down equals +//! COMPB and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPB - Time base counter down equals +//! COMPB and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPB - Time base counter down equals +//! COMPB and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPB - Time base counter down equals +//! COMPB and toggle output pins +//! +//! \b note: A logical OR of the valid values should be passed as the action +//! parameter. Single action should be configured for each time base +//! counter scenario. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierActionComplete(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + uint16_t action) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerOffset = EPWM_O_AQCTLA + (uint32_t)epwmOutput; + + // + // Write to ZRO, PRD, CAU, CAD, CBU or CBD bits of AQCTLA register + // + HWREGH(base + registerOffset) = (uint16_t)action; +} + +//***************************************************************************** +// +//! Set up Additional action qualifier event outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param action is the desired action when the specified event occurs +//! +//! This function sets up the Additional Action Qualifier output on ePWMA or +//! ePWMB depending on the value of epwmOutput, to a value specified by action. +//! Valid action param values from different event scenarios should be OR'd +//! together to configure complete action for a pwm output. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - action +//! - When T1 event occurs during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T1 - T1 event on count up +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_T1 - T1 event on count up +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_UP_T1 - T1 event on count up +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T1 - T1 event on count up +//! and toggle the output pins +//! - When T1 event occurs during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T1- T1 event on count down +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_T1 - T1 event on count down +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T1 - T1 event on count down +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T1 - T1 event on count down +//! and toggle the output pins +//! - When T2 event occurs during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T2 - T2 event on count up +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_T2 - T2 event on count up +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_UP_T2 - T2 event on count up +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T2 - T2 event on count up +//! and toggle the output pins +//! - When T2 event occurs during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T2 - T2 event on count down +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_T2 - T2 event on count down +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T2 - T2 event on count down +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T2 - T2 event on count down +//! and toggle the output pins +//! +//! \b note: A logical OR of the valid values should be passed as the action +//! parameter. Single action should be configured for each event +//! scenario. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setAdditionalActionQualifierActionComplete(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + uint16_t action) +{ + uint32_t registerTOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerTOffset = EPWM_O_AQCTLA2 + (uint32_t)epwmOutput; + + // + // Write to T1U, T1D, T2U or T2D of AQCTLA2 register + // + HWREGH(base + registerTOffset) = (uint16_t)action; +} + +//***************************************************************************** +// +//! Sets up Action qualifier continuous software load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the mode for shadow to active load mode. +//! +//! This function sets up the AQCFRSC register load mode for continuous +//! software force reload mode. The software force actions are determined by +//! the EPWM_setActionQualifierContSWForceAction() function. +//! Valid values for mode are: +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO - shadow mode load when counter +//! equals zero +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_PERIOD - shadow mode load when counter +//! equals period +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD - shadow mode load when counter +//! equals zero or period +//! - EPWM_AQ_SW_IMMEDIATE_LOAD - immediate mode load only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierContSWForceShadowMode(uint32_t base, + EPWM_ActionQualifierContForce mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Action qualifier software action reload mode. + // Write to RLDCSF bit + // + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_RLDCSF_M) | + ((uint16_t)mode << EPWM_AQSFRC_RLDCSF_S)); +} + +//***************************************************************************** +// +//! Triggers a continuous software forced event. +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! +//! This function triggers a continuous software forced Action Qualifier output +//! on ePWM A or B based on the value of epwmOutput. +//! Valid values for the parameters are: +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_SW_DISABLED - Software forcing disabled. +//! - EPWM_AQ_SW_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_SW_OUTPUT_HIGH - Set output pins to High +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierContSWForceAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierSWOutput output) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Initiate a continuous software forced output + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQCSFRC) = + ((HWREGH(base + EPWM_O_AQCSFRC) & ~EPWM_AQCSFRC_CSFA_M) | + ((uint16_t)output)); + } + else + { + HWREGH(base + EPWM_O_AQCSFRC) = + ((HWREGH(base + EPWM_O_AQCSFRC) & ~EPWM_AQCSFRC_CSFB_M) | + ((uint16_t)output << EPWM_AQCSFRC_CSFB_S)) ; + } +} + +//***************************************************************************** +// +//! Set up one time software forced Action qualifier outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! +//! This function sets up the one time software forced Action Qualifier output +//! on ePWM A or ePWMB, depending on the value of epwmOutput to a value +//! specified by outPut. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins +//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High +//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierSWAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierOutput output) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the one time software forced action + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_ACTSFA_M) | + ((uint16_t)output)); + } + else + { + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_ACTSFB_M) | + ((uint16_t)output << EPWM_AQSFRC_ACTSFB_S)); + } +} + +//***************************************************************************** +// +//! Triggers a one time software forced event on Action qualifier +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! +//! This function triggers a one time software forced Action Qualifier event +//! on ePWM A or B based on the value of epwmOutput. +//! Valid values for epwmOutput are: +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceActionQualifierSWAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Initiate a software forced event + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQSFRC) |= EPWM_AQSFRC_OTSFA; + } + else + { + HWREGH(base + EPWM_O_AQSFRC) |= EPWM_AQSFRC_OTSFB; + } +} + +// +// Dead Band Module related APIs +// +//***************************************************************************** +// +//! Sets Dead Band signal output swap mode. +//! +//! \param base is the base address of the EPWM module. +//! \param output is the ePWM Dead Band output. +//! \param enableSwapMode is the output swap mode. +//! +//! This function sets up the output signal swap mode. For example if the +//! output variable is set to EPWM_DB_OUTPUT_A and enableSwapMode is true, then +//! the ePWM A output gets its signal from the ePWM B signal path. Valid values +//! for the input variables are: +//! - output +//! - EPWM_DB_OUTPUT_A - ePWM output A +//! - EPWM_DB_OUTPUT_B - ePWM output B +//! - enableSwapMode +//! - true - the output is swapped +//! - false - the output and the signal path are the same. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandOutputSwapMode(uint32_t base, EPWM_DeadBandOutput output, + bool enableSwapMode) +{ + uint16_t mask; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + mask = (uint16_t)1U << ((uint16_t)output + EPWM_DBCTL_OUTSWAP_S); + + if(enableSwapMode) + { + // + // Set the appropriate outswap bit to swap output + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) | mask); + } + else + { + // + // Clear the appropriate outswap bit to disable output swap + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) & ~mask); + } +} + +//***************************************************************************** +// +//! Sets Dead Band signal output mode. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Dead Band delay type. +//! \param enableDelayMode is the dead band delay mode. +//! +//! This function sets up the dead band delay mode. The delayMode variable +//! determines if the applied delay is Rising Edge or Falling Edge. The +//! enableDelayMode determines if a dead band delay should be applied. +//! Valid values for the variables are: +//! - delayMode +//! - EPWM_DB_RED - Rising Edge delay +//! - EPWM_DB_FED - Falling Edge delay +//! - enableDelayMode +//! - true - Falling edge or Rising edge delay is applied. +//! - false - Dead Band delay is bypassed. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandDelayMode(uint32_t base, EPWM_DeadBandDelayMode delayMode, + bool enableDelayMode) +{ + uint16_t mask; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + mask = (uint16_t)1U << ((uint16_t)delayMode + EPWM_DBCTL_OUT_MODE_S); + + if(enableDelayMode) + { + // + // Set the appropriate outmode bit to enable Dead Band delay + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) | mask); + } + else + { + // + // Clear the appropriate outswap bit to disable output swap + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) & ~ mask); + } +} + +//***************************************************************************** +// +//! Sets Dead Band delay polarity. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Dead Band delay type. +//! \param polarity is the polarity of the delayed signal. +//! +//! This function sets up the polarity as determined by the variable polarity +//! of the Falling Edge or Rising Edge delay depending on the value of +//! delayMode. Valid values for the variables are: +//! - delayMode +//! - EPWM_DB_RED - Rising Edge delay +//! - EPWM_DB_FED - Falling Edge delay +//! - polarity +//! - EPWM_DB_POLARITY_ACTIVE_HIGH - polarity is not inverted. +//! - EPWM_DB_POLARITY_ACTIVE_LOW - polarity is inverted. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandDelayPolarity(uint32_t base, + EPWM_DeadBandDelayMode delayMode, + EPWM_DeadBandPolarity polarity) +{ + uint16_t shift; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + shift = (((uint16_t)delayMode ^ 0x1U) + EPWM_DBCTL_POLSEL_S); + + // + // Set the appropriate polsel bits for dead band polarity + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~ (1U << shift)) | + ((uint16_t)polarity << shift)); +} + +//***************************************************************************** +// +//! Sets Rising Edge Dead Band delay input. +//! +//! \param base is the base address of the EPWM module. +//! \param input is the input signal to the dead band. +//! +//! This function sets up the rising Edge delay input signal. +//! Valid values for input are: +//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA( Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB( Valid for both Falling +//! Edge and Rising Edge) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDeadBandDelayInput(uint32_t base, uint16_t input) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((input == EPWM_DB_INPUT_EPWMA) || + (input == EPWM_DB_INPUT_EPWMB)); + + // + // Set the Rising Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~(1U << (EPWM_DBCTL_IN_MODE_S))) | + (input << EPWM_DBCTL_IN_MODE_S)); +} + +//***************************************************************************** +// +//! Sets Dead Band delay input. +//! +//! \param base is the base address of the EPWM module. +//! \param input is the input signal to the dead band. +//! +//! This function sets up the rising Edge delay input signal. +//! Valid values for input are: +//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA(Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB(Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_DB_RED - Input signal is the output of Rising +//! Edge delay. +//! (Valid only for Falling Edge delay) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDeadBandDelayInput(uint32_t base, uint16_t input) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((input == EPWM_DB_INPUT_EPWMA) || + (input == EPWM_DB_INPUT_EPWMB) || + (input == EPWM_DB_INPUT_DB_RED)); + + if(input == EPWM_DB_INPUT_DB_RED) + { + // + // Set the Falling Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) |= EPWM_DBCTL_DEDB_MODE; + } + else + { + // + // Set the Falling Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) &= ~EPWM_DBCTL_DEDB_MODE; + + // + // Set the Rising Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~(1U << (EPWM_DBCTL_IN_MODE_S + 1U))) | + (input << (EPWM_DBCTL_IN_MODE_S + 1U))); + } +} + +//***************************************************************************** +// +//! Set the Dead Band control shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets the Dead Band control register shadow +//! load mode. +//! Valid values for the \e loadMode parameter are: +//! - EPWM_DB_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_DB_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_DB_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_DB_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandControlShadowLoadMode(uint32_t base, + EPWM_DeadBandControlLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode and setup the load event + // + HWREGH(base + EPWM_O_DBCTL2) = + ((HWREGH(base + EPWM_O_DBCTL2) & ~EPWM_DBCTL2_LOADDBCTLMODE_M) | + (EPWM_DBCTL2_SHDWDBCTLMODE | (uint16_t)loadMode)); +} + +//***************************************************************************** +// +//! Disable Dead Band control shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Dead Band control register shadow +//! load mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDeadBandControlShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow load mode. Only immediate load mode only. + // + HWREGH(base + EPWM_O_DBCTL2) = + (HWREGH(base + EPWM_O_DBCTL2) & ~EPWM_DBCTL2_SHDWDBCTLMODE); +} + +//***************************************************************************** +// +//! Set the RED (Rising Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load event. +//! +//! This function sets the Rising Edge Delay register shadow load mode. +//! Valid values for the \e loadMode parameter are: +//! - EPWM_RED_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_RED_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_RED_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDelayCountShadowLoadMode(uint32_t base, + EPWM_RisingEdgeDelayLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode. Set-up the load mode + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_LOADREDMODE_M) | + ((uint16_t)EPWM_DBCTL_SHDWDBREDMODE | + ((uint16_t)loadMode << EPWM_DBCTL_LOADREDMODE_S))); + +} + +//***************************************************************************** +// +//! Disable the RED (Rising Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Rising Edge Delay register shadow load mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableRisingEdgeDelayCountShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow mode. + // + HWREGH(base + EPWM_O_DBCTL) = + (HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_SHDWDBREDMODE); + +} + +//***************************************************************************** +// +//! Set the FED (Falling Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load event. +//! +//! This function enables and sets the Falling Edge Delay register shadow load +//! mode. Valid values for the \e loadMode parameters are: +//! - EPWM_FED_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_FED_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_FED_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDelayCountShadowLoadMode(uint32_t base, + EPWM_FallingEdgeDelayLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode. Setup the load mode. + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_LOADFEDMODE_M) | + (EPWM_DBCTL_SHDWDBFEDMODE | + ((uint16_t)loadMode << EPWM_DBCTL_LOADFEDMODE_S))); + +} + +//***************************************************************************** +// +//! Disables the FED (Falling Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Falling Edge Delay register shadow load mode. +//! Valid values for the parameters are: +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableFallingEdgeDelayCountShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow mode. + // + HWREGH(base + EPWM_O_DBCTL) = + (HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_SHDWDBFEDMODE); +} + +//***************************************************************************** +// +//! Sets Dead Band Counter clock rate. +//! +//! \param base is the base address of the EPWM module. +//! \param clockMode is the Dead Band counter clock mode. +//! +//! This function sets up the Dead Band counter clock rate with respect to +//! TBCLK (ePWM time base counter). +//! Valid values for clockMode are: +//! - EPWM_DB_COUNTER_CLOCK_FULL_CYCLE -Dead band counter runs at TBCLK +//! (ePWM Time Base Counter) rate. +//! - EPWM_DB_COUNTER_CLOCK_HALF_CYCLE -Dead band counter runs at 2*TBCLK +//! (twice ePWM Time Base Counter)rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandCounterClock(uint32_t base, + EPWM_DeadBandClockMode clockMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the DB clock mode + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_HALFCYCLE) | + ((uint16_t)clockMode << 15U)); +} + +//***************************************************************************** +// +//! Set ePWM RED count +//! +//! \param base is the base address of the EPWM module. +//! \param redCount is the RED(Rising Edge Delay) count. +//! +//! This function sets the RED (Rising Edge Delay) count value. +//! The value of redCount should be less than 0x4000U. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDelayCount(uint32_t base, uint16_t redCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(redCount < 0x4000U); + + // + // Set the RED (Rising Edge Delay) count + // + HWREGH(base + EPWM_O_DBRED) = redCount; +} + +//***************************************************************************** +// +//! Set ePWM FED count +//! +//! \param base is the base address of the EPWM module. +//! \param fedCount is the FED(Falling Edge Delay) count. +//! +//! This function sets the FED (Falling Edge Delay) count value. +//! The value of fedCount should be less than 0x4000U. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDelayCount(uint32_t base, uint16_t fedCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(fedCount < 0x4000U); + + // + // Set the RED (Rising Edge Delay) count + // + HWREGH(base + EPWM_O_DBFED) = fedCount; +} + +// +// Chopper module related APIs +// +//***************************************************************************** +// +//! Enable chopper mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables ePWM chopper module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableChopper(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set CHPEN bit. Enable Chopper + // + HWREGH(base + EPWM_O_PCCTL) |= EPWM_PCCTL_CHPEN; +} + +//***************************************************************************** +// +//! Disable chopper mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables ePWM chopper module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableChopper(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear CHPEN bit. Disable Chopper + // + HWREGH(base + EPWM_O_PCCTL) &= ~EPWM_PCCTL_CHPEN; +} + +//***************************************************************************** +// +//! Set chopper duty cycle. +//! +//! \param base is the base address of the EPWM module. +//! \param dutyCycleCount is the chopping clock duty cycle count. +//! +//! This function sets the chopping clock duty cycle. The value of +//! dutyCycleCount should be less than 7. The dutyCycleCount value is converted +//! to the actual chopper duty cycle value base on the following equation: +//! chopper duty cycle = (dutyCycleCount + 1) / 8 +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperDutyCycle(uint32_t base, uint16_t dutyCycleCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(dutyCycleCount < 7U); + + // + // Set the chopper duty cycle + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & ~EPWM_PCCTL_CHPDUTY_M) | + (dutyCycleCount << EPWM_PCCTL_CHPDUTY_S)); +} + +//***************************************************************************** +// +//! Set chopper clock frequency scaler. +//! +//! \param base is the base address of the EPWM module. +//! \param freqDiv is the chopping clock frequency divider. +//! +//! This function sets the scaler for the chopping clock frequency. The value +//! of freqDiv should be less than 8. The chopping clock frequency is altered +//! based on the following equation. +//! chopper clock frequency = SYSCLKOUT / ( 1 + freqDiv) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperFreq(uint32_t base, uint16_t freqDiv) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(freqDiv < 8U); + + // + // Set the chopper clock + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & + ~(uint16_t)EPWM_PCCTL_CHPFREQ_M) | + (freqDiv << EPWM_PCCTL_CHPFREQ_S)); +} + +//***************************************************************************** +// +//! Set chopper clock frequency scaler. +//! +//! \param base is the base address of the EPWM module. +//! \param firstPulseWidth is the width of the first pulse. +//! +//! This function sets the first pulse width of chopper output waveform. The +//! value of firstPulseWidth should be less than 0x10. The value of the first +//! pulse width in seconds is given using the following equation: +//! first pulse width = 1 / (((firstPulseWidth + 1) * SYSCLKOUT)/8) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperFirstPulseWidth(uint32_t base, uint16_t firstPulseWidth) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(firstPulseWidth < 16U); + + // + // Set the chopper clock + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & + ~(uint16_t)EPWM_PCCTL_OSHTWTH_M) | + (firstPulseWidth << EPWM_PCCTL_OSHTWTH_S)); +} + +// +// Trip Zone module related APIs +// +//***************************************************************************** +// +//! Enables Trip Zone signal. +//! +//! \param base is the base address of the EPWM module. +//! \param tzSignal is the Trip Zone signal. +//! +//! This function enables the Trip Zone signals specified by tzSignal as a +//! source for the Trip Zone module. +//! Valid values for tzSignal are: +//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1 +//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2 +//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3 +//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4 +//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5 +//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6 +//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1 +//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1 +//! +//! \b note: A logical OR of the valid values can be passed as the tzSignal +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneSignals(uint32_t base, uint16_t tzSignal) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the trip zone bits + // + EALLOW; + HWREGH(base + EPWM_O_TZSEL) |= tzSignal; + EDIS; +} + +//***************************************************************************** +// +//! Disables Trip Zone signal. +//! +//! \param base is the base address of the EPWM module. +//! \param tzSignal is the Trip Zone signal. +//! +//! This function disables the Trip Zone signal specified by tzSignal as a +//! source for the Trip Zone module. +//! Valid values for tzSignal are: +//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1 +//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2 +//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3 +//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4 +//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5 +//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6 +//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1 +//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1 +//! +//! \b note: A logical OR of the valid values can be passed as the tzSignal +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableTripZoneSignals(uint32_t base, uint16_t tzSignal) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear the trip zone bits + // + EALLOW; + HWREGH(base + EPWM_O_TZSEL) &= ~tzSignal; + EDIS; +} + +//***************************************************************************** +// +//! Set Digital compare conditions that cause Trip Zone event. +//! +//! \param base is the base address of the EPWM module. +//! \param dcType is the Digital compare output type. +//! \param dcEvent is the Digital Compare output event. +//! +//! This function sets up the Digital Compare output Trip Zone event sources. +//! The dcType variable specifies the event source to be whether Digital +//! Compare output A or Digital Compare output B. The dcEvent parameter +//! specifies the event that causes Trip Zone. +//! Valid values for the parameters are: +//! - dcType +//! - EPWM_TZ_DC_OUTPUT_A1 - Digital Compare output 1 A +//! - EPWM_TZ_DC_OUTPUT_A2 - Digital Compare output 2 A +//! - EPWM_TZ_DC_OUTPUT_B1 - Digital Compare output 1 B +//! - EPWM_TZ_DC_OUTPUT_B2 - Digital Compare output 2 B +//! - dcEvent +//! - EPWM_TZ_EVENT_DC_DISABLED - Event Trigger is disabled +//! - EPWM_TZ_EVENT_DCXH_LOW - Trigger event when DCxH low +//! - EPWM_TZ_EVENT_DCXH_HIGH - Trigger event when DCxH high +//! - EPWM_TZ_EVENT_DCXL_LOW - Trigger event when DCxL low +//! - EPWM_TZ_EVENT_DCXL_HIGH - Trigger event when DCxL high +//! - EPWM_TZ_EVENT_DCXL_HIGH_DCXH_LOW - Trigger event when DCxL high +//! DCxH low +//! +//! \note x in DCxH/DCxL represents DCAH/DCAL or DCBH/DCBL +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneDigitalCompareEventCondition(uint32_t base, + EPWM_TripZoneDigitalCompareOutput dcType, + EPWM_TripZoneDigitalCompareOutputEvent dcEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set Digital Compare Events conditions that cause a Digital Compare trip + // + EALLOW; + HWREGH(base + EPWM_O_TZDCSEL) = + ((HWREGH(base + EPWM_O_TZDCSEL) & ~(0x7U << (uint16_t)dcType)) | + ((uint16_t)dcEvent << (uint16_t)dcType)); + EDIS; +} + +//***************************************************************************** +// +//! Enable advanced Trip Zone event Action. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the advanced actions of the Trip Zone events. The +//! advanced features combine the trip zone events with the direction of the +//! counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneAdvAction(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable Advanced feature. Set ETZE bit + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Disable advanced Trip Zone event Action. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the advanced actions of the Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableTripZoneAdvAction(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable Advanced feature. clear ETZE bit + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) &= ~EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Trip Zone Action. +//! +//! \param base is the base address of the EPWM module. +//! \param tzEvent is the Trip Zone event type. +//! \param tzAction is the Trip zone Action. +//! +//! This function sets the Trip Zone Action to be taken when a Trip Zone event +//! occurs. +//! Valid values for the parameters are: +//! - tzEvent +//! - EPWM_TZ_ACTION_EVENT_DCBEVT2 - DCBEVT2 (Digital Compare B event 2) +//! - EPWM_TZ_ACTION_EVENT_DCBEVT1 - DCBEVT1 (Digital Compare B event 1) +//! - EPWM_TZ_ACTION_EVENT_DCAEVT2 - DCAEVT2 (Digital Compare A event 2) +//! - EPWM_TZ_ACTION_EVENT_DCAEVT1 - DCAEVT1 (Digital Compare A event 1) +//! - EPWM_TZ_ACTION_EVENT_TZB - TZ1 - TZ6, DCBEVT2, DCBEVT1 +//! - EPWM_TZ_ACTION_EVENT_TZA - TZ1 - TZ6, DCAEVT2, DCAEVT1 +//! - tzAction +//! - EPWM_TZ_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ACTION_HIGH - high output +//! - EPWM_TZ_ACTION_LOW - low low +//! - EPWM_TZ_ACTION_DISABLE - disable action +//! +//! \note Disable the advanced Trip Zone event using +//! EPWM_disableTripZoneAdvAction() before calling this function. +//! \note This function operates on both ePWMA and ePWMB depending on the +//! tzEvent parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAction(uint32_t base, EPWM_TripZoneEvent tzEvent, + EPWM_TripZoneAction tzAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL) = + ((HWREGH(base + EPWM_O_TZCTL) & ~(0x3U << (uint16_t)tzEvent)) | + ((uint16_t)tzAction << (uint16_t)tzEvent)) ; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Trip Zone Action. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvEvent is the Trip Zone event type. +//! \param tzAdvAction is the Trip zone Action. +//! +//! This function sets the Advanced Trip Zone Action to be taken when an +//! advanced Trip Zone event occurs. +//! +//! Valid values for the parameters are: +//! - tzAdvEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_D - TZ1 - TZ6, DCBEVT2, DCBEVT1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_U - TZ1 - TZ6, DCBEVT2, DCBEVT1 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_D - TZ1 - TZ6, DCAEVT2, DCAEVT1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_U - TZ1 - TZ6, DCAEVT2, DCAEVT1 while +//! counting up +//! - tzAdvAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note This function operates on both ePWMA and ePWMB depending on the +//! tzAdvEvent parameter. +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAdvAction(uint32_t base, EPWM_TripZoneAdvancedEvent tzAdvEvent, + EPWM_TripZoneAdvancedAction tzAdvAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) = + ((HWREGH(base + EPWM_O_TZCTL2) & ~(0x7U << (uint16_t)tzAdvEvent)) | + ((uint16_t)tzAdvAction << (uint16_t)tzAdvEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Digital Compare Trip Zone Action on ePWMA. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type. +//! \param tzAdvDCAction is the Digital Compare Trip zone Action. +//! +//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be +//! taken on ePWMA when an advanced Digital Compare Trip Zone A event occurs. +//! Valid values for the parameters are: +//! - tzAdvDCEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event A2 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event A2 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event A1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event A1 while +//! counting up +//! - tzAdvDCAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Digital Compare Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAdvDigitalCompareActionA(uint32_t base, + EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent, + EPWM_TripZoneAdvancedAction tzAdvDCAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTLDCA) = + ((HWREGH(base + EPWM_O_TZCTLDCA) & ~(0x7U << (uint16_t)tzAdvDCEvent)) | + ((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Digital Compare Trip Zone Action on ePWMB. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type. +//! \param tzAdvDCAction is the Digital Compare Trip zone Action. +//! +//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be +//! taken on ePWMB when an advanced Digital Compare Trip Zone B event occurs. +//! Valid values for the parameters are: +//! - tzAdvDCEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event B2 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event B2 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event B1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event B1 while +//! counting up +//! - tzAdvDCAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Digital Compare Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void EPWM_setTripZoneAdvDigitalCompareActionB(uint32_t base, + EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent, + EPWM_TripZoneAdvancedAction tzAdvDCAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTLDCB) = + ((HWREGH(base + EPWM_O_TZCTLDCB) & ~(0x7U << (uint16_t)tzAdvDCEvent)) | + ((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Enable Trip Zone interrupts. +//! +//! \param base is the base address of the EPWM module. +//! \param tzInterrupt is the Trip Zone interrupt. +//! +//! This function enables the Trip Zone interrupts. +//! Valid values for tzInterrupt are: +//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt +//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt +//! +//! \b note: A logical OR of the valid values can be passed as the tzInterrupt +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzInterrupt > 0U) && (tzInterrupt <= 0x80U)); + + // + // Enable Trip zone interrupts + // + EALLOW; + HWREGH(base + EPWM_O_TZEINT) |= tzInterrupt; + EDIS; +} + +//***************************************************************************** +// +//! Disable Trip Zone interrupts. +//! +//! \param base is the base address of the EPWM module. +//! \param tzInterrupt is the Trip Zone interrupt. +//! +//! This function disables the Trip Zone interrupts. +//! Valid values for tzInterrupt are: +//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt +//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt +//! +//! \b note: A logical OR of the valid values can be passed as the tzInterrupt +//! parameter. +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_disableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzInterrupt > 0U) && (tzInterrupt <= 0x80U)); + + // + // Disable Trip zone interrupts + // + EALLOW; + HWREGH(base + EPWM_O_TZEINT) &= ~tzInterrupt; + EDIS; +} + +//***************************************************************************** +// +//! Gets the Trip Zone status flag +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the Trip Zone status flag. +//! +//! \return The function returns the following or the bitwise OR value +//! of the following values. +//! - EPWM_TZ_INTERRUPT - Trip Zone interrupt was generated +//! due to the following TZ events. +//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle event status flag +//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot event status flag +//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 status flag +//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 status flag +//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 status flag +//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 status flag +// +//*************************************************************************** +static inline uint16_t +EPWM_getTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZFLG) & 0x7FU); +} + +//***************************************************************************** +// +//! Gets the Trip Zone Cycle by Cycle flag status +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the specific Cycle by Cycle Trip Zone flag +//! status. +//! +//! \return The function returns the following values. +//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 status flag +//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 status flag +//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 status flag +//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 status flag +//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 status flag +//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 status flag +//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC status flag for Digital compare +//! event A2 +//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC status flag for Digital compare +//! event B2 +// +//*************************************************************************** +static inline uint16_t +EPWM_getCycleByCycleTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Cycle By Cycle Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZCBCFLG) & 0xFFU); +} + +//***************************************************************************** +// +//! Gets the Trip Zone One Shot flag status +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the specific One Shot Trip Zone flag status. +//! +//! \return The function returns the bitwise OR of the following flags. +//! - EPWM_TZ_OST_FLAG_OST1 - OST status flag for OST1 +//! - EPWM_TZ_OST_FLAG_OST2 - OST status flag for OST2 +//! - EPWM_TZ_OST_FLAG_OST3 - OST status flag for OST3 +//! - EPWM_TZ_OST_FLAG_OST4 - OST status flag for OST4 +//! - EPWM_TZ_OST_FLAG_OST5 - OST status flag for OST5 +//! - EPWM_TZ_OST_FLAG_OST6 - OST status flag for OST6 +//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST status flag for Digital +//! compare event A1 +//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST status flag for Digital +//! compare event B1 +// +//*************************************************************************** +static inline uint16_t +EPWM_getOneShotTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the One Shot Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZOSTFLG) & 0xFFU); +} + +//***************************************************************************** +// +//! Set the Trip Zone CBC pulse clear event. +//! +//! \param base is the base address of the EPWM module. +//! \param clearEvent is the CBC trip zone clear event. +//! +//! This function set the event which automatically clears the +//! CBC (Cycle by Cycle) latch. +//! Valid values for clearEvent are: +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO - Clear CBC pulse when counter +//! equals zero +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_PERIOD - Clear CBC pulse when counter +//! equals period +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD - Clear CBC pulse when counter +//! equals zero or period +//! +//! \return None. +// +//************************************************************************** +static inline void +EPWM_selectCycleByCycleTripZoneClearEvent(uint32_t base, + EPWM_CycleByCycleTripZoneClearMode clearEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Cycle by Cycle Trip Latch mode + // + EALLOW; + HWREGH(base + EPWM_O_TZCLR) = + ((HWREGH(base + EPWM_O_TZCLR) & ~EPWM_TZCLR_CBCPULSE_M) | + ((uint16_t)clearEvent << EPWM_TZCLR_CBCPULSE_S)); + EDIS; +} + +//***************************************************************************** +// +//! Clear Trip Zone flag +//! +//! \param base is the base address of the EPWM module. +//! \param tzFlags is the Trip Zone flags. +//! +//! This function clears the Trip Zone flags +//! Valid values for tzFlags are: +//! - EPWM_TZ_INTERRUPT - Global Trip Zone interrupt flag +//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle flag +//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot flag +//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 flag +//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 flag +//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 flag +//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 flag +//! +//! \b note: A bitwise OR of the valid values can be passed as the tzFlags +//! parameter. +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearTripZoneFlag(uint32_t base, uint16_t tzFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzFlags <= 0x80U); + + // + // Clear Trip zone event flag + // + EALLOW; + HWREGH(base + EPWM_O_TZCLR) |= tzFlags; + EDIS; +} + +//***************************************************************************** +// +//! Clear the Trip Zone Cycle by Cycle flag. +//! +//! \param base is the base address of the EPWM module. +//! \param tzCBCFlags is the CBC flag to be cleared. +//! +//! This function clears the specific Cycle by Cycle Trip Zone flag. +//! The following are valid values for tzCBCFlags. +//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 flag +//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 flag +//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 flag +//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 flag +//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 flag +//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 flag +//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC flag Digital compare +//! event A2 +//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC flag Digital compare +//! event B2 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearCycleByCycleTripZoneFlag(uint32_t base, uint16_t tzCBCFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzCBCFlags < 0x800U); + + // + // Clear the Cycle By Cycle Trip zone flag + // + EALLOW; + HWREGH(base + EPWM_O_TZCBCCLR) |= tzCBCFlags; + EDIS; +} + +//***************************************************************************** +// +//! Clear the Trip Zone One Shot flag. +//! +//! \param base is the base address of the EPWM module. +//! \param tzOSTFlags is the OST flags to be cleared. +//! +//! This function clears the specific One Shot (OST) Trip Zone flag. +//! The following are valid values for tzOSTFlags. +//! - EPWM_TZ_OST_FLAG_OST1 - OST flag for OST1 +//! - EPWM_TZ_OST_FLAG_OST2 - OST flag for OST2 +//! - EPWM_TZ_OST_FLAG_OST3 - OST flag for OST3 +//! - EPWM_TZ_OST_FLAG_OST4 - OST flag for OST4 +//! - EPWM_TZ_OST_FLAG_OST5 - OST flag for OST5 +//! - EPWM_TZ_OST_FLAG_OST6 - OST flag for OST6 +//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST flag for Digital compare event A1 +//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST flag for Digital compare event B1 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearOneShotTripZoneFlag(uint32_t base, uint16_t tzOSTFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzOSTFlags < 0x800U); + + // + // Clear the Cycle By Cycle Trip zone flag + // + EALLOW; + HWREGH(base + EPWM_O_TZOSTCLR) |= tzOSTFlags; + EDIS; +} + +//***************************************************************************** +// +//! Force Trip Zone events. +//! +//! \param base is the base address of the EPWM module. +//! \param tzForceEvent is the forced Trip Zone event. +//! +//! This function forces a Trip Zone event. +//! Valid values for tzForceEvent are: +//! - EPWM_TZ_FORCE_EVENT_CBC - Force Trip Zones Cycle By Cycle event +//! - EPWM_TZ_FORCE_EVENT_OST - Force Trip Zones One Shot Event +//! - EPWM_TZ_FORCE_EVENT_DCAEVT1 - Force Digital Compare A Event 1 +//! - EPWM_TZ_FORCE_EVENT_DCAEVT2 - Force Digital Compare A Event 2 +//! - EPWM_TZ_FORCE_EVENT_DCBEVT1 - Force Digital Compare B Event 1 +//! - EPWM_TZ_FORCE_EVENT_DCBEVT2 - Force Digital Compare B Event 2 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_forceTripZoneEvent(uint32_t base, uint16_t tzForceEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzForceEvent & 0xFF81U)== 0U); + + // + // Force a Trip Zone event + // + EALLOW; + HWREGH(base + EPWM_O_TZFRC) |= tzForceEvent; + EDIS; +} + +// +// Event Trigger related APIs +// +//***************************************************************************** +// +//! Enable ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the ePWM interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable ePWM interrupt + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_INTEN; +} + +//***************************************************************************** +// +//! disable ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the ePWM interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable ePWM interrupt + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_INTEN; +} + +//***************************************************************************** +// +//! Sets the ePWM interrupt source. +//! +//! \param base is the base address of the EPWM module. +//! \param interruptSource is the ePWM interrupt source. +//! +//! This function sets the ePWM interrupt source. +//! Valid values for interruptSource are: +//! - EPWM_INT_TBCTR_DISABLED - Time-base counter is disabled +//! - EPWM_INT_TBCTR_ZERO - Time-base counter equal to zero +//! - EPWM_INT_TBCTR_PERIOD - Time-base counter equal to period +//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_INT_TBCTR_U_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD (depending the value of x) +//! when the timer is incrementing +//! - EPWM_INT_TBCTR_D_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD (depending the value of x) +//! when the timer is decrementing +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptSource(uint32_t base, uint16_t interruptSource) +{ + uint16_t intSource; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(((interruptSource > 0U) && (interruptSource < 9U)) || + (interruptSource == 10U) || (interruptSource == 12U) || + (interruptSource == 14U)); + + if((interruptSource == EPWM_INT_TBCTR_U_CMPC) || + (interruptSource == EPWM_INT_TBCTR_U_CMPD) || + (interruptSource == EPWM_INT_TBCTR_D_CMPC) || + (interruptSource == EPWM_INT_TBCTR_D_CMPD)) + { + // + // Shift the interrupt source by 1 + // + intSource = interruptSource >> 1U; + + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_INTSELCMP; + } + else if((interruptSource == EPWM_INT_TBCTR_U_CMPA) || + (interruptSource == EPWM_INT_TBCTR_U_CMPB) || + (interruptSource == EPWM_INT_TBCTR_D_CMPA) || + (interruptSource == EPWM_INT_TBCTR_D_CMPB)) + { + intSource = interruptSource; + + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_INTSELCMP; + } + else + { + intSource = interruptSource; + } + + // + // Set the interrupt source + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_INTSEL_M) | intSource); +} + +//***************************************************************************** +// +//! Sets the ePWM interrupt event counts. +//! +//! \param base is the base address of the EPWM module. +//! \param eventCount is the event count for interrupt scale +//! +//! This function sets the interrupt event count that determines the number of +//! events that have to occur before an interrupt is issued. +//! Maximum value for eventCount is 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptEventCount(uint32_t base, uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Enable advanced feature of interrupt every up to 15 events + // + HWREGH(base + EPWM_O_ETPS) |= EPWM_ETPS_INTPSSEL; + HWREGH(base + EPWM_O_ETINTPS) = + ((HWREGH(base + EPWM_O_ETINTPS) & ~EPWM_ETINTPS_INTPRD2_M) | + eventCount); +} + +//***************************************************************************** +// +//! Return the interrupt status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the ePWM interrupt status. +//! \b Note This function doesn't return the Trip Zone status. +//! +//! \return Returns true if ePWM interrupt was generated. +//! Returns false if no interrupt was generated +// +//***************************************************************************** +static inline bool +EPWM_getEventTriggerInterruptStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return INT bit of ETFLG register + // + return(((HWREGH(base + EPWM_O_ETFLG) & 0x1U) == 0x1U) ? true : false); +} + +//***************************************************************************** +// +//! Clear interrupt flag. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the ePWM interrupt flag. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_clearEventTriggerInterruptFlag(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear INT bit of ETCLR register + // + HWREGH(base + EPWM_O_ETCLR) |= EPWM_ETCLR_INT; +} + +//***************************************************************************** +// +//! Enable Pre-interrupt count load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the ePWM interrupt counter to be pre-interrupt loaded +//! with a count value. +//! +//! \note This is valid only for advanced/expanded interrupt mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable interrupt event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= EPWM_ETCNTINITCTL_INTINITEN; +} + +//***************************************************************************** +// +//! Disable interrupt count load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the ePWM interrupt counter from being loaded with +//! pre-interrupt count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable interrupt event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) &= ~EPWM_ETCNTINITCTL_INTINITEN; +} + +//***************************************************************************** +// +//! Force a software pre interrupt event counter load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces the ePWM interrupt counter to be loaded with the +//! contents set by EPWM_setPreInterruptEventCount(). +//! +//! \note make sure the EPWM_enablePreInterruptEventCountLoad() function is +//! is called before invoking this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Load the Interrupt Event counter value + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= EPWM_ETCNTINITCTL_INTINITFRC; +} + +//***************************************************************************** +// +//! Set interrupt count. +//! +//! \param base is the base address of the EPWM module. +//! \param eventCount is the ePWM interrupt count value. +//! +//! This function sets the ePWM interrupt count. eventCount is the value of the +//! pre-interrupt value that is to be loaded. The maximum value of eventCount +//! is 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptEventCountInitValue(uint32_t base, uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Set the Pre-interrupt event count + // + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_INTINIT_M) | + (uint16_t)(eventCount & 0xFU)); +} + +//***************************************************************************** +// +//! Get the interrupt count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the ePWM interrupt event count. +//! +//! \return The interrupt event counts that have occurred. +// +//***************************************************************************** +static inline uint16_t +EPWM_getInterruptEventCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the interrupt event count + // + return(((HWREGH(base + EPWM_O_ETINTPS) & EPWM_ETINTPS_INTCNT2_M) >> + EPWM_ETINTPS_INTCNT2_S)); +} + +//***************************************************************************** +// +//! Force ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces an ePWM interrupt. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_forceEventTriggerInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set INT bit of ETFRC register + // + HWREGH(base + EPWM_O_ETFRC) |= EPWM_ETFRC_INT; +} + +// +// ADC SOC configuration related APIs +// +//***************************************************************************** +// +//! Enable ADC SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function enables the ePWM module to trigger an ADC SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable an SOC + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCAEN; + } + else + { + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCBEN; + } +} + +//***************************************************************************** +// +//! Disable ADC SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function disables the ePWM module from triggering an ADC SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable an SOC + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCAEN; + } + else + { + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCBEN; + } +} + +//***************************************************************************** +// +//! Sets the ePWM SOC source. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param socSource is the SOC source. +//! +//! This function sets the ePWM ADC SOC source. +//! Valid values for socSource are: +//! - adcSOCType +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! - socSource +//! - EPWM_SOC_DCxEVT1 - Event is based on DCxEVT1 +//! - EPWM_SOC_TBCTR_ZERO - Time-base counter equal to zero +//! - EPWM_SOC_TBCTR_PERIOD - Time-base counter equal to period +//! - EPWM_SOC_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_SOC_TBCTR_U_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD(depending the value of x) +//! when the timer is incrementing +//! - EPWM_SOC_TBCTR_D_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD(depending the value of x) +//! when the timer is decrementing +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerSource(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + EPWM_ADCStartOfConversionSource socSource) +{ + uint16_t source; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + source = (uint16_t)socSource >> 1U; + } + else + { + source = (uint16_t)socSource; + } + + if(adcSOCType == EPWM_SOC_A) + { + // + // Set the SOC source + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_SOCASEL_M) | + (source << EPWM_ETSEL_SOCASEL_S)); + + // + // Enable the comparator selection + // + if((socSource == EPWM_SOC_TBCTR_U_CMPA) || + (socSource == EPWM_SOC_TBCTR_U_CMPB) || + (socSource == EPWM_SOC_TBCTR_D_CMPA) || + (socSource == EPWM_SOC_TBCTR_D_CMPB)) + { + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCASELCMP; + } + else if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCASELCMP; + } + else + { + // + // No action required for the other socSource options + // + } + } + else + { + // + // Enable the comparator selection + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_SOCBSEL_M) | + (source << EPWM_ETSEL_SOCBSEL_S)); + + // + // Enable the comparator selection + // + if((socSource == EPWM_SOC_TBCTR_U_CMPA) || + (socSource == EPWM_SOC_TBCTR_U_CMPB) || + (socSource == EPWM_SOC_TBCTR_D_CMPA) || + (socSource == EPWM_SOC_TBCTR_D_CMPB)) + { + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCBSELCMP; + } + else if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCBSELCMP; + } + else + { + // + // No action required for the other socSource options + // + } + } +} + +//***************************************************************************** +// +//! Sets the ePWM SOC event counts. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param preScaleCount is the event count number. +//! +//! This function sets the SOC event count that determines the number of +//! events that have to occur before an SOC is issued. +//! Valid values for the parameters are: +//! - adcSOCType +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! - preScaleCount +//! - [1 - 15] - Generate SOC pulse every preScaleCount +//! up to 15 events. +//! +//! \note A preScaleCount value of 0 disables the prescale. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerEventPrescale(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + uint16_t preScaleCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(preScaleCount < 16U); + + // + // Enable advanced feature of SOC every up to 15 events + // + HWREGH(base + EPWM_O_ETPS) |= EPWM_ETPS_SOCPSSEL; + if(adcSOCType == EPWM_SOC_A) + { + // + // Set the count for SOC A + // + HWREGH(base + EPWM_O_ETSOCPS) = + ((HWREGH(base + EPWM_O_ETSOCPS) & ~EPWM_ETSOCPS_SOCAPRD2_M) | + preScaleCount); + } + else + { + // + // Set the count for SOC B + // + HWREGH(base + EPWM_O_ETSOCPS) = + ((HWREGH(base + EPWM_O_ETSOCPS) & ~EPWM_ETSOCPS_SOCBPRD2_M) | + (preScaleCount << EPWM_ETSOCPS_SOCBPRD2_S)); + } +} + +//***************************************************************************** +// +//! Return the SOC event status. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function returns the ePWM SOC status. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return Returns true if the selected adcSOCType SOC was generated. +//! Returns false if the selected adcSOCType SOC was not generated. +// +//***************************************************************************** +static inline bool +EPWM_getADCTriggerFlagStatus(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the SOC A/ B status + // + return((((HWREGH(base + EPWM_O_ETFLG) >> + ((uint16_t)adcSOCType + 2U)) & 0x1U) == 0x1U) ? true : false); +} + +//***************************************************************************** +// +//! Clear SOC flag. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function clears the ePWM SOC flag. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_clearADCTriggerFlag(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear SOC A/B bit of ETCLR register + // + HWREGH(base + EPWM_O_ETCLR) |= 1U << ((uint16_t)adcSOCType + 2U); +} + +//***************************************************************************** +// +//! Enable Pre-SOC event count load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function enables the ePWM SOC event counter which is set by the +//! EPWM_setADCTriggerEventCountInitValue() function to be loaded before +//! an SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \note This is valid only for advanced/expanded SOC mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable SOC event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= 1U << ((uint16_t)adcSOCType + 14U); +} + +//***************************************************************************** +// +//! Disable Pre-SOC event count load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function disables the ePWM SOC event counter from being loaded before +//! an SOC event (only an SOC event causes an increment of the counter value). +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \note This is valid only for advanced/expanded SOC mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable SOC event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) &= + ~(1U << ((uint16_t)adcSOCType + 14U)); +} + +//***************************************************************************** +// +//! Force a software pre SOC event counter load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type +//! +//! This function forces the ePWM SOC counter to be loaded with the +//! contents set by EPWM_setPreADCStartOfConversionEventCount(). +//! +//! \note make sure the EPWM_enableADCTriggerEventCountInit() +//! function is called before invoking this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Load the Interrupt Event counter value + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= 1U << ((uint16_t)adcSOCType + 11U); +} + +//***************************************************************************** +// +//! Set ADC Trigger count values. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param eventCount is the ePWM interrupt count value. +//! +//! This function sets the ePWM ADC Trigger count values. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! The eventCount has a maximum value of 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerEventCountInitValue(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Set the ADC Trigger event count + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_SOCAINIT_M) | + (uint16_t)(eventCount << EPWM_ETCNTINIT_SOCAINIT_S)); + } + else + { + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_SOCBINIT_M) | + (eventCount << EPWM_ETCNTINIT_SOCBINIT_S)); + } +} + +//***************************************************************************** +// +//! Get the SOC event count. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function returns the ePWM SOC event count. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return The SOC event counts that have occurred. +// +//***************************************************************************** +static inline uint16_t +EPWM_getADCTriggerEventCount(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + uint16_t eventCount; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the SOC event count + // + if(adcSOCType == EPWM_SOC_A) + { + eventCount = (HWREGH(base + EPWM_O_ETSOCPS) >> + EPWM_ETSOCPS_SOCACNT2_S) & 0xFU; + } + else + { + eventCount = (HWREGH(base + EPWM_O_ETSOCPS) >> + EPWM_ETSOCPS_SOCBCNT2_S) & 0xFU; + } + return(eventCount); +} + +//***************************************************************************** +// +//! Force SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function forces an ePWM SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_forceADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SOC A/B bit of ETFRC register + // + HWREGH(base + EPWM_O_ETFRC) |= 1U << ((uint16_t)adcSOCType + 2U); +} + +// +// Digital Compare module related APIs +// +//***************************************************************************** +// +//! Set the DC trip input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripSource is the tripSource. +//! \param dcType is the Digital Compare type. +//! +//! This function sets the trip input to the Digital Compare (DC). For a given +//! dcType the function sets the tripSource to be the input to the DC. +//! Valid values for the parameter are: +//! - tripSource +//! - EPWM_DC_TRIP_TRIPINx - Trip x,where x ranges from 1 to 15 excluding 13 +//! - EPWM_DC_TRIP_COMBINATION - selects all the Trip signals whose input +//! is enabled by the following function +//! EPWM_enableDigitalCompareTripCombinationInput() +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_selectDigitalCompareTripInput(uint32_t base, + EPWM_DigitalCompareTripInput tripSource, + EPWM_DigitalCompareType dcType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + EPWM_O_DCTRIPSEL) = + ((HWREGH(base + EPWM_O_DCTRIPSEL) & ~(0xFU << ((uint16_t)dcType << 2U))) | + ((uint16_t)tripSource << ((uint16_t)dcType << 2U))); + EDIS; +} + +// +// DCFILT +// +//***************************************************************************** +// +//! Enable DC filter blanking window. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the DC filter blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareBlankingWindow(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC filter blanking window + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_BLANKE; + EDIS; +} + +//***************************************************************************** +// +//! Disable DC filter blanking window. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the DC filter blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareBlankingWindow(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC filter blanking window + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_BLANKE; + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare Window inverse mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the Digital Compare Window inverse mode. This will +//! invert the blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareWindowInverseMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC window inverse mode. + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_BLANKINV; + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare Window inverse mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Digital Compare Window inverse mode. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareWindowInverseMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC window inverse mode. + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_BLANKINV; + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare filter blanking pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param blankingPulse is Pulse that starts blanking window. +//! +//! This function sets the input pulse that starts the Digital Compare blanking +//! window. +//! Valid values for blankingPulse are: +//! - EPWM_DC_WINDOW_START_TBCTR_PERIOD - Time base counter equals period +//! - EPWM_DC_WINDOW_START_TBCTR_ZERO - Time base counter equals zero +//! - EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD - Time base counter equals zero +//! or period. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareBlankingEvent(uint32_t base, + EPWM_DigitalCompareBlankingPulse blankingPulse) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC blanking event + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + ((HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_PULSESEL_M) | + ((uint16_t)((uint32_t)blankingPulse << EPWM_DCFCTL_PULSESEL_S))); + EDIS; +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter input. +//! +//! \param base is the base address of the EPWM module. +//! \param filterInput is Digital Compare signal source. +//! +//! This function sets the signal input source that will be filtered by the +//! Digital Compare module. +//! Valid values for filterInput are: +//! - EPWM_DC_WINDOW_SOURCE_DCAEVT1 - DC filter signal source is DCAEVT1 +//! - EPWM_DC_WINDOW_SOURCE_DCAEVT2 - DC filter signal source is DCAEVT2 +//! - EPWM_DC_WINDOW_SOURCE_DCBEVT1 - DC filter signal source is DCBEVT1 +//! - EPWM_DC_WINDOW_SOURCE_DCBEVT2 - DC filter signal source is DCBEVT2 +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareFilterInput(uint32_t base, + EPWM_DigitalCompareFilterInput filterInput) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the signal source that will be filtered + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + ((HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_SRCSEL_M) | + ((uint16_t)filterInput)); + EDIS; +} + +// +// DC Edge Filter +// +//***************************************************************************** +// +//! Enable Digital Compare Edge Filter. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the Digital Compare Edge filter to generate event +//! after configured number of edges. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareEdgeFilter(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC Edge Filter + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_EDGEFILTSEL; + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare Edge Filter. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Digital Compare Edge filter. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareEdgeFilter(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC Edge Filter + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_EDGEFILTSEL; + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare Edge Filter Mode. +//! +//! \param base is the base address of the EPWM module. +//! \param edgeMode is Digital Compare Edge filter mode. +//! +//! This function sets the Digital Compare Event filter mode. Valid values +//! for edgeMode are: +//! - EPWM_DC_EDGEFILT_MODE_RISING - DC edge filter mode is rising edge +//! - EPWM_DC_EDGEFILT_MODE_FALLING - DC edge filter mode is falling edge +//! - EPWM_DC_EDGEFILT_MODE_BOTH - DC edge filter mode is both edges +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEdgeFilterMode(uint32_t base, + EPWM_DigitalCompareEdgeFilterMode edgeMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC Edge filter mode + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + (HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_EDGEMODE_M) | + ((uint16_t)edgeMode << EPWM_DCFCTL_EDGEMODE_S); + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare Edge Filter Edge Count. +//! +//! \param base is the base address of the EPWM module. +//! \param edgeCount is Digital Compare event filter count +//! +//! This function sets the Digital Compare Event filter Edge Count to generate +//! events. Valid values for edgeCount can be: +//! - EPWM_DC_EDGEFILT_EDGECNT_0 - No edge is required to generate event +//! - EPWM_DC_EDGEFILT_EDGECNT_1 - 1 edge is required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_2 - 2 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_3 - 3 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_4 - 4 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_5 - 5 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_6 - 6 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_7 - 7 edges are required for event generation +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEdgeFilterEdgeCount(uint32_t base, uint16_t edgeCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC Edge filter edge count + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = (HWREGH(base + EPWM_O_DCFCTL) & + ~EPWM_DCFCTL_EDGECOUNT_M) | + (edgeCount << EPWM_DCFCTL_EDGECOUNT_S); + EDIS; +} + +//***************************************************************************** +// +//! Returns the Digital Compare Edge Filter Edge Count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the configured Digital Compare Edge filter edge +//! count required to generate events. It can return values from 0-7. +//! +//! \return Returns the configured DigitalCompare Edge filter edge count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareEdgeFilterEdgeCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return configured DC edge filter edge count + // + return((HWREGH(base + EPWM_O_DCFCTL) & EPWM_DCFCTL_EDGECOUNT_M) >> + EPWM_DCFCTL_EDGECOUNT_S); +} + +//***************************************************************************** +// +//! Returns the Digital Compare Edge filter captured edge count status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the count of edges captured by Digital Compare Edge +//! filter. It can return values from 0-7. +//! +//! \return Returns the count of captured edges +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareEdgeFilterEdgeStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return captured edge count by DC Edge filter + // + return((HWREGH(base + EPWM_O_DCFCTL) & EPWM_DCFCTL_EDGESTATUS_M) >> + EPWM_DCFCTL_EDGESTATUS_S); +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter window offset +//! +//! \param base is the base address of the EPWM module. +//! \param windowOffsetCount is blanking window offset length. +//! +//! This function sets the offset between window start pulse and blanking +//! window in TBCLK count. +//! The function take a 16bit count value for the offset value. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareWindowOffset(uint32_t base, uint16_t windowOffsetCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the blanking window offset in TBCLK counts + // + HWREGH(base + EPWM_O_DCFOFFSET) = windowOffsetCount; +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter window length +//! +//! \param base is the base address of the EPWM module. +//! \param windowLengthCount is blanking window length. +//! +//! This function sets up the Digital Compare filter blanking window length in +//! TBCLK count.The function takes a 16bit count value for the window length. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareWindowLength(uint32_t base, uint16_t windowLengthCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the blanking window length in TBCLK counts + // + HWREGH(base + EPWM_O_DCFWINDOW) = windowLengthCount; +} + +//***************************************************************************** +// +//! Return DC filter blanking window offset count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns DC filter blanking window offset count. +//! +//! \return None +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareBlankingWindowOffsetCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Blanking Window Offset count + // + return(HWREGH(base + EPWM_O_DCFOFFSETCNT)); +} + +//***************************************************************************** +// +//! Return DC filter blanking window length count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns DC filter blanking window length count. +//! +//! \return None +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareBlankingWindowLengthCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Blanking Window Length count + // + return(HWREGH(base + EPWM_O_DCFWINDOWCNT)); +} + +//***************************************************************************** +// +//! Set up the Digital Compare Event source. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! \param dcEvent is the Digital Compare Event number. +//! \param dcEventSource is the - Digital Compare Event source. +//! +//! This function sets up the Digital Compare module Event sources. +//! The following are valid values for the parameters. +//! - dcModule +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! - dcEvent +//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1 +//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2 +//! - dcEventSource +//! - EPWM_DC_EVENT_SOURCE_FILT_SIGNAL - signal source is filtered +//! \note The signal source for this option is DCxEVTy, where the +//! value of x is dependent on dcModule and the value of y is +//! dependent on dcEvent. Possible signal sources are DCAEVT1, +//! DCBEVT1, DCAEVT2 or DCBEVT2 depending on the value of both +//! dcModule and dcEvent. +//! - EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL - signal source is unfiltered +//! The signal source for this option is DCxEVTy. +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEventSource(uint32_t base, + EPWM_DigitalCompareModule dcModule, + EPWM_DigitalCompareEvent dcEvent, + EPWM_DigitalCompareEventSource dcEventSource) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Set the DC event 1 source source + // + EALLOW; + if(dcEvent == EPWM_DC_EVENT_1) + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SRCSEL) | + (uint16_t)dcEventSource); + } + else + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT2SRCSEL) | + ((uint16_t)dcEventSource << 8U)); + } + EDIS; +} + +//***************************************************************************** +// +//! Set up the Digital Compare input sync mode. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! \param dcEvent is the Digital Compare Event number. +//! \param syncMode is the Digital Compare Event sync mode. +//! +//! This function sets up the Digital Compare module Event sources. +//! The following are valid values for the parameters. +//! - dcModule +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! - dcEvent +//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1 +//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2 +//! - syncMode +//! - EPWM_DC_EVENT_INPUT_SYNCED - DC input signal is synced with +//! TBCLK +//! - EPWM_DC_EVENT_INPUT_NOT SYNCED - DC input signal is not synced with +//! TBCLK +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEventSyncMode(uint32_t base, + EPWM_DigitalCompareModule dcModule, + EPWM_DigitalCompareEvent dcEvent, + EPWM_DigitalCompareSyncMode syncMode) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Set the DC event sync mode + // + EALLOW; + if(dcEvent == EPWM_DC_EVENT_1) + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1FRCSYNCSEL) | + ((uint16_t)syncMode << 1U)); + } + else + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT2FRCSYNCSEL) | + ((uint16_t)syncMode << 9U)); + } + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare to generate Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function enables the Digital Compare Event 1 to generate Start of +//! Conversion. +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareADCTrigger(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Enable Digital Compare start of conversion generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | EPWM_DCACTL_EVT1SOCE); + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare from generating Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function disables the Digital Compare Event 1 from generating Start of +//! Conversion. +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareADCTrigger(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Disable Digital Compare start of conversion generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SOCE); + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare to generate sync out pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function enables the Digital Compare Event 1 to generate sync out +//! pulse +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareSyncEvent(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Enable Digital Compare sync out pulse generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | EPWM_DCACTL_EVT1SYNCE); + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare from generating Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function disables the Digital Compare Event 1 from generating synch +//! out pulse. +//! The following are valid values for the \e dcModule parameters. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareSyncEvent(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Disable Digital Compare sync out pulse generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SYNCE); + EDIS; +} + +// +// DC capture mode +// +//***************************************************************************** +// +//! Enables the Time Base Counter Capture controller. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the time Base Counter Capture. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareCounterCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable Time base counter capture + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_CAPE; + EDIS; +} + +//***************************************************************************** +// +//! Disables the Time Base Counter Capture controller. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disable the time Base Counter Capture. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareCounterCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable Time base counter capture + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPE; + EDIS; +} + +//***************************************************************************** +// +//! Set the Time Base Counter Capture mode. +//! +//! \param base is the base address of the EPWM module. +//! \param enableShadowMode is the shadow read mode flag. +//! +//! This function sets the mode the Time Base Counter value is read from. If +//! enableShadowMode is true, CPU reads of the DCCAP register will return the +//! shadow register contents.If enableShadowMode is false, CPU reads of the +//! DCCAP register will return the active register contents. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareCounterShadowMode(uint32_t base, bool enableShadowMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + EALLOW; + if(enableShadowMode) + { + // + // Enable DC counter shadow mode + // + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_SHDWMODE; + } + else + { + // + // Disable DC counter shadow mode + // + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_SHDWMODE; + } + EDIS; +} + +//***************************************************************************** +// +//! Return the DC Capture event status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the DC capture event status. +//! +//! \return Returns true if a DC capture event has occurs. +//! Returns false if no DC Capture event has occurred. +//! +//! \return None. +// +//***************************************************************************** +static inline bool +EPWM_getDigitalCompareCaptureStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the DC compare status + // + return((HWREGH(base + EPWM_O_DCCAPCTL) & EPWM_DCCAPCTL_CAPSTS) == + EPWM_DCCAPCTL_CAPSTS); +} + +//***************************************************************************** +// +//! Clears DC capture latched status flag +//! +//! \param base is the base address of the EPWM module. +//! This function is used to clear the CAPSTS (set) condition. +//! +//! \return None. +//***************************************************************************** +static inline void +EPWM_clearDigitalCompareCaptureStatusFlag(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear digital compare capture status flag + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPCLR; + EDIS; +} + +//***************************************************************************** +// +//! Configures DC capture operating mode +//! +//! \param base is the base address of the EPWM module. +//! \param disableClearMode is the clear mode bit. +//! +//! This function is used to configure the DC capture operating mode. If +//! \e disableClearMode is false, the TBCNT value is captured in active register +//! on occurance of DCEVTFILT event. The trip events are ignored until next +//! PRD or ZRO event re-triggers the capture mechanism. +//! If \e disableClearMode is true, the TBCNT value is captured, CAPSTS flag is +//! set and further trips are ignored until CAPSTS bit is cleared. +//! +//! \return None. +//***************************************************************************** +static inline void +EPWM_configureDigitalCompareCounterCaptureMode(uint32_t base, + bool disableClearMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + EALLOW; + if(disableClearMode) + { + // + // Disable DC counter auto-clear on PULSESEL event + // + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_CAPMODE; + } + else + { + // + // Enable DC counter clear on PULSESEL events + // + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPMODE; + } + EDIS; +} + +//***************************************************************************** +// +//! Return the DC Time Base Counter capture value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the DC Time Base Counter capture value. The value +//! read is determined by the mode as set in the +//! EPWM_setTimeBaseCounterReadMode() function. +//! +//! \return Returns the DC Time Base Counter Capture count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareCaptureCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the DC Time Base Counter Capture count value + // + return(HWREGH(base + EPWM_O_DCCAP)); +} + +//***************************************************************************** +// +//! Enable DC TRIP combinational input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripInput is the Trip number. +//! \param dcType is the Digital Compare module. +//! +//! This function enables the specified Trip input. +//! Valid values for the parameters are: +//! - tripInput +//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15 +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareTripCombinationInput(uint32_t base, + uint16_t tripInput, + EPWM_DigitalCompareType dcType) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register + // offset with respect to DCAHTRIPSEL + // + registerOffset = EPWM_O_DCAHTRIPSEL + (uint32_t)dcType; + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | tripInput); + + // + // Enable the combination input + // + HWREGH(base + EPWM_O_DCTRIPSEL) = + (HWREGH(base + EPWM_O_DCTRIPSEL) | (0xFU << ((uint16_t)dcType << 2U))); + EDIS; +} + +//***************************************************************************** +// +//! Disable DC TRIP combinational input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripInput is the Trip number. +//! \param dcType is the Digital Compare module. +//! +//! This function disables the specified Trip input. +//! Valid values for the parameters are: +//! - tripInput +//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15 +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareTripCombinationInput(uint32_t base, + uint16_t tripInput, + EPWM_DigitalCompareType dcType) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register + // offset with respect to DCAHTRIPSEL + // + registerOffset = EPWM_O_DCAHTRIPSEL + (uint32_t)dcType; + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~tripInput); + EDIS; +} + +// +// Valley switching +// +//***************************************************************************** +// +//! Enable valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Valley Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set VCAPE bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_VCAPE; + EDIS; +} + +//***************************************************************************** +// +//! Disable valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Valley Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear VCAPE bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) &= ~EPWM_VCAPCTL_VCAPE; + EDIS; +} + +//***************************************************************************** +// +//! Start valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function starts Valley Capture sequence. +//! +//! \b Make sure you invoke EPWM_setValleyTriggerSource with the trigger +//! variable set to EPWM_VALLEY_TRIGGER_EVENT_SOFTWARE before calling this +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_startValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set VCAPSTART bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_VCAPSTART; + EDIS; +} + +//***************************************************************************** +// +//! Set valley capture trigger. +//! +//! \param base is the base address of the EPWM module. +//! \param trigger is the Valley counter trigger. +//! +//! This function sets the trigger value that initiates Valley Capture sequence +//! +//! \b Set the number of Trigger source events for starting and stopping the +//! valley capture using EPWM_setValleyTriggerEdgeCounts(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyTriggerSource(uint32_t base, EPWM_ValleyTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TRIGSEL bits + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) = + ((HWREGH(base + EPWM_O_VCAPCTL) & ~EPWM_VCAPCTL_TRIGSEL_M) | + ((uint16_t)trigger << 2U)); + EDIS; +} + +//***************************************************************************** +// +//! Set valley capture trigger source count. +//! +//! \param base is the base address of the EPWM module. +//! \param startCount +//! \param stopCount +//! +//! This function sets the number of trigger events required to start and stop +//! the valley capture count. +//! Maximum values for both startCount and stopCount is 15 corresponding to the +//! 15th edge of the trigger event. +//! +//! \b Note: +//! A startCount value of 0 prevents starting the valley counter. +//! A stopCount value of 0 prevents the valley counter from stopping. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyTriggerEdgeCounts(uint32_t base, uint16_t startCount, + uint16_t stopCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((startCount < 16U) && (stopCount < 16U)); + + // + // Write to STARTEDGE and STOPEDGE bits + // + EALLOW; + HWREGH(base + EPWM_O_VCNTCFG) = + ((HWREGH(base + EPWM_O_VCNTCFG) & + ~(EPWM_VCNTCFG_STARTEDGE_M | EPWM_VCNTCFG_STOPEDGE_M)) | + (startCount | (stopCount << 8U))); + EDIS; +} + +//***************************************************************************** +// +//! Enable valley switching delay. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Valley switching delay. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set EDGEFILTDLYSEL bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_EDGEFILTDLYSEL; + EDIS; +} + +//***************************************************************************** +// +//! Disable valley switching delay. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Valley switching delay. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear EDGEFILTDLYSEL bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) &= ~EPWM_VCAPCTL_EDGEFILTDLYSEL; + EDIS; +} + +//***************************************************************************** +// +//! Set Valley delay values. +//! +//! \param base is the base address of the EPWM module. +//! \param delayOffsetValue is the software defined delay offset value. +//! +//! This function sets the Valley delay value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleySWDelayValue(uint32_t base, uint16_t delayOffsetValue) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to SWVDELVAL bits + // + HWREGH(base + EPWM_O_SWVDELVAL) = delayOffsetValue; +} + +//***************************************************************************** +// +//! Set Valley delay mode. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Valley delay mode. +//! +//! This function sets the Valley delay mode values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyDelayDivider(uint32_t base, EPWM_ValleyDelayMode delayMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to VDELAYDIV bits + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) = + ((HWREGH(base + EPWM_O_VCAPCTL) & ~EPWM_VCAPCTL_VDELAYDIV_M) | + ((uint16_t)delayMode << 7U)); + EDIS; +} + +//***************************************************************************** +// +//! Get the valley edge status bit. +//! +//! \param base is the base address of the EPWM module. +//! \param edge is the start or stop edge. +//! +//! This function returns the status of the start or stop valley status +//! depending on the value of edge. +//! If a start or stop edge has occurred, the function returns true, if not it +//! returns false. +//! +//! \return Returns true if the specified edge has occurred, +//! Returns false if the specified edge has not occurred. +// +//***************************************************************************** +static inline bool +EPWM_getValleyEdgeStatus(uint32_t base, EPWM_ValleyCounterEdge edge) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(edge == EPWM_VALLEY_COUNT_START_EDGE) + { + // + // Returns STARTEDGESTS status + // + return(((HWREGH(base + EPWM_O_VCNTCFG) & EPWM_VCNTCFG_STARTEDGESTS) == + EPWM_VCNTCFG_STARTEDGESTS ) ? true : false); + } + else + { + // + // Returns STOPEDGESTS status + // + return(((HWREGH(base + EPWM_O_VCNTCFG) & EPWM_VCNTCFG_STOPEDGESTS) == + EPWM_VCNTCFG_STOPEDGESTS) ? true : false); + } +} + +//***************************************************************************** +// +//! Get the Valley Counter value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the valley time base count value which is captured +//! upon occurrence of the stop edge condition selected by +//! EPWM_setValleyTriggerSource() and by the stopCount variable of the +//! EPWM_setValleyTriggerEdgeCounts() function. +//! +//! \return Returns the valley base time count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getValleyCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read VCNTVAL register + // + return(HWREGH(base + EPWM_O_VCNTVAL)); +} + +//***************************************************************************** +// +//! Get the Valley delay value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the hardware valley delay count. +//! +//! \return Returns the valley delay count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read HWVDELVAL register + // + return(HWREGH(base + EPWM_O_HWVDELVAL)); +} + +//***************************************************************************** +// +//! Enable Global shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Global shadow to active load mode of registers. +//! The trigger source for loading shadow to active is determined by +//! EPWM_setGlobalLoadTrigger() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Shadow to active load is controlled globally + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) |= EPWM_GLDCTL_GLD; + EDIS; +} + +//***************************************************************************** +// +//! Disable Global shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Global shadow to active load mode of registers. +//! Loading shadow to active is determined individually. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Shadow to active load is controlled individually + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) &= ~EPWM_GLDCTL_GLD; + EDIS; +} + +//***************************************************************************** +// +//! Set the Global shadow load pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param loadTrigger is the pulse that causes global shadow load. +//! +//! This function sets the pulse that causes Global shadow to active load. +//! Valid values for the loadTrigger parameter are: +//! +//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO - load when counter is equal +//! to zero +//! - EPWM_GL_LOAD_PULSE_CNTR_PERIOD - load when counter is equal +//! to period +//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO_PERIOD - load when counter is equal +//! to zero or period +//! - EPWM_GL_LOAD_PULSE_SYNC - load on sync event +//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_ZERO - load on sync event or when +//! counter is equal to zero +//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_PERIOD - load on sync event or when +//! counter is equal to period +//! - EPWM_GL_LOAD_PULSE_SYNC_CNTR_ZERO_PERIOD - load on sync event or when +//! counter is equal to period +//! or zero +//! - EPWM_GL_LOAD_PULSE_GLOBAL_FORCE - load on global force +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadTrigger(uint32_t base, EPWM_GlobalLoadTrigger loadTrigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Global shadow to active load pulse + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) = + ((HWREGH(base + EPWM_O_GLDCTL) & ~EPWM_GLDCTL_GLDMODE_M) | + ((uint16_t)loadTrigger << EPWM_GLDCTL_GLDMODE_S)); + EDIS; +} + +//***************************************************************************** +// +//! Set the number of Global load pulse event counts +//! +//! \param base is the base address of the EPWM module. +//! \param prescalePulseCount is the pulse event counts. +//! +//! This function sets the number of Global Load pulse events that have to +//! occurred before a global load pulse is issued. Valid values for +//! prescaleCount range from 0 to 7. 0 being no event (disables counter), and 7 +//! representing 7 events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadEventPrescale(uint32_t base, uint16_t prescalePulseCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(prescalePulseCount < 8U); + + // + // Set the number of counts that have to occur before + // a load strobe is issued + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) = + ((HWREGH(base + EPWM_O_GLDCTL) & ~EPWM_GLDCTL_GLDPRD_M) | + (prescalePulseCount << EPWM_GLDCTL_GLDPRD_S)); + EDIS; +} + +//***************************************************************************** +// +//! Return the number of Global load pulse event counts +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the number of Global Load pulse events that have +//! occurred. These pulse events are set by the EPWM_setGlobalLoadTrigger() +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline uint16_t +EPWM_getGlobalLoadEventCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the number of events that have occurred + // + return((HWREGH(base + EPWM_O_GLDCTL) >> EPWM_GLDCTL_GLDCNT_S) & 0x7U); +} + +//***************************************************************************** +// +//! Enable continuous global shadow to active load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables global continuous shadow to active load. Register +//! load happens every time the event set by the +//! EPWM_setGlobalLoadTrigger() occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoadOneShotMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable global continuous shadow to active load + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) &= ~EPWM_GLDCTL_OSHTMODE; + EDIS; +} + +//***************************************************************************** +// +//! Enable One shot global shadow to active load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables a one time global shadow to active load. Register +//! load happens every time the event set by the +//! EPWM_setGlobalLoadTrigger() occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoadOneShotMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable global continuous shadow to active load + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) |= EPWM_GLDCTL_OSHTMODE; + EDIS; +} + +//***************************************************************************** +// +//! Set One shot global shadow to active load pulse. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function sets a one time global shadow to active load pulse. The pulse +//! propagates to generate a load signal if any of the events set by +//! EPWM_setGlobalLoadTrigger() occur. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadOneShotLatch(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set a one shot Global shadow load pulse. + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL2) |= EPWM_GLDCTL2_OSHTLD; + EDIS; +} + +//***************************************************************************** +// +//! Force a software One shot global shadow to active load pulse. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces a software a one time global shadow to active load +//! pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceGlobalLoadOneShotEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Force a Software Global shadow load pulse + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL2) |= EPWM_GLDCTL2_GFRCLD; + EDIS; +} + +//***************************************************************************** +// +//! Enable a register to be loaded Globally. +//! +//! \param base is the base address of the EPWM module. +//! \param loadRegister is the register. +//! +//! This function enables the register specified by loadRegister to be globally +//! loaded. +//! Valid values for loadRegister are: +//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR +//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR +//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR +//! - EPWM_GL_REGISTER_CMPC - Register CMPC +//! - EPWM_GL_REGISTER_CMPD - Register CMPD +//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR +//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR +//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL +//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2 +//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2 +//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((loadRegister > 0x0000U) && (loadRegister < 0x0800U)); + + // + // The register specified by loadRegister is loaded globally + // + EALLOW; + HWREGH(base + EPWM_O_GLDCFG) |= loadRegister; + EDIS; +} + +//***************************************************************************** +// +//! Disable a register to be loaded Globally. +//! +//! \param base is the base address of the EPWM module. +//! \param loadRegister is the register. +//! +//! This function disables the register specified by loadRegister from being +//! loaded globally. The shadow to active load happens as specified by the +//! register control +//! Valid values for loadRegister are: +//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR +//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR +//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR +//! - EPWM_GL_REGISTER_CMPC - Register CMPC +//! - EPWM_GL_REGISTER_CMPD - Register CMPD +//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR +//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR +//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL +//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2 +//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2 +//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((loadRegister > 0x0000U) && (loadRegister < 0x0800U)); + + // + // The register specified by loadRegister is loaded by individual + // register configuration setting + // + EALLOW; + HWREGH(base + EPWM_O_GLDCFG) &= ~loadRegister; + EDIS; +} + +//***************************************************************************** +// +//! Set emulation mode +//! +//! \param base is the base address of the EPWM module. +//! \param emulationMode is the emulation mode. +//! +//! This function sets the emulation behaviours of the time base counter. Valid +//! values for emulationMode are: +//! - EPWM_EMULATION_STOP_AFTER_NEXT_TB - Stop after next Time Base counter +//! increment or decrement. +//! - EPWM_EMULATION_STOP_AFTER_FULL_CYCLE - Stop when counter completes whole +//! cycle. +//! - EPWM_EMULATION_FREE_RUN - Free run. +//! +//! \return None. +// +//***************************************************************************** +extern void +EPWM_setEmulationMode(uint32_t base, EPWM_EmulationMode emulationMode); + +//***************************************************************************** +// +//! Configures ePWM signal with desired frequency & duty +//! +//! \param base is the base address of the EPWM module. +//! \param signalParams is the desired signal parameters. +//! +//! This function configures the ePWM module to generate a signal with +//! desired frequency & duty. +//! +//! \return None. +// +//***************************************************************************** +extern void +EPWM_configureSignal(uint32_t base, const EPWM_SignalParams *signalParams); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EPWM_H diff --git a/gpio_bitfield_cpu2/device/driverlib/eqep.c b/gpio_bitfield_cpu2/device/driverlib/eqep.c new file mode 100644 index 0000000..64caf47 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/eqep.c @@ -0,0 +1,149 @@ +//########################################################################### +// +// FILE: eqep.c +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "eqep.h" + +//***************************************************************************** +// +// EQEP_setCompareConfig +// +//***************************************************************************** +void +EQEP_setCompareConfig(uint32_t base, uint16_t config, uint32_t compareValue, + uint16_t cycles) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + ASSERT(cycles <= (EQEP_QPOSCTL_PCSPW_M + 1U)); + + // + // Set the compare match value + // + HWREG(base + EQEP_O_QPOSCMP) = compareValue; + + // + // Set the shadow register settings and pulse width. + // + regValue = (config & (uint16_t)(EQEP_QPOSCTL_PCSHDW | + EQEP_QPOSCTL_PCLOAD)) | (cycles - 1U); + + HWREGH(base + EQEP_O_QPOSCTL) = (HWREGH(base + EQEP_O_QPOSCTL) & + ~(EQEP_QPOSCTL_PCSPW_M | + EQEP_QPOSCTL_PCLOAD | + EQEP_QPOSCTL_PCSHDW)) | regValue; + + // + // Set position compare sync-output mode. + // + regValue = config & (uint16_t)(EQEP_QDECCTL_SOEN | EQEP_QDECCTL_SPSEL); + + HWREGH(base + EQEP_O_QDECCTL) = (HWREGH(base + EQEP_O_QDECCTL) & + ~(EQEP_QDECCTL_SOEN | + EQEP_QDECCTL_SPSEL)) | regValue; +} + +//***************************************************************************** +// +// EQEP_setInputPolarity +// +//***************************************************************************** +void +EQEP_setInputPolarity(uint32_t base, bool invertQEPA, bool invertQEPB, + bool invertIndex, bool invertStrobe) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Configure QEPA signal + // + if(invertQEPA) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QAP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QAP; + } + + // + // Configure QEPB signal + // + if(invertQEPB) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QBP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QBP; + } + + // + // Configure index signal + // + if(invertIndex) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QIP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QIP; + } + + // + // Configure strobe signal + // + if(invertStrobe) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QSP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QSP; + } +} diff --git a/gpio_bitfield_cpu2/device/driverlib/eqep.h b/gpio_bitfield_cpu2/device/driverlib/eqep.h new file mode 100644 index 0000000..4f1eaa2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/eqep.h @@ -0,0 +1,1691 @@ +//########################################################################### +// +// FILE: eqep.h +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef EQEP_H +#define EQEP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup eqep_api eQEP +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_eqep.h" +#include "inc/hw_types.h" +#include "debug.h" + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to EQEP_setDecoderConfig() as the config +// parameter. +// +//***************************************************************************** + +// +// Operation Mode +// +#define EQEP_CONFIG_QUADRATURE 0x0000U //!< Quadrature-clock mode +#define EQEP_CONFIG_CLOCK_DIR 0x4000U //!< Direction-count mode +#define EQEP_CONFIG_UP_COUNT 0x8000U //!< Up-count mode, QDIR = 1 +#define EQEP_CONFIG_DOWN_COUNT 0xC000U //!< Down-count mode, QDIR = 0 + +// +// Resolution +// +#define EQEP_CONFIG_2X_RESOLUTION 0x0000U //!< Count rising and falling edge +#define EQEP_CONFIG_1X_RESOLUTION 0x0800U //!< Count rising edge only + +// +// Swap QEPA and QEPB +// +#define EQEP_CONFIG_NO_SWAP 0x0000U //!< Do not swap QEPA and QEPB +#define EQEP_CONFIG_SWAP 0x0400U //!< Swap QEPA and QEPB + +// +// Index pulse gating option +// +#define EQEP_CONFIG_IGATE_DISABLE 0x0000U //!< Disable gating of Index pulse +#define EQEP_CONFIG_IGATE_ENABLE 0x0200U //!< Gate the index pin with strobe + +//***************************************************************************** + +// +// Values that can be passed to EQEP_setCompareConfig() as the config +// parameter. +// +//***************************************************************************** + +// +// Sync pulse pin +// +#define EQEP_COMPARE_NO_SYNC_OUT 0x0000U //!< Disable sync output +#define EQEP_COMPARE_IDX_SYNC_OUT 0x2000U //!< Sync output on index pin +#define EQEP_COMPARE_STROBE_SYNC_OUT 0x3000U //!< Sync output on strobe pin + +// +// Shadow register use +// +#define EQEP_COMPARE_NO_SHADOW 0x0000U //!< Disable shadow of QPOSCMP +#define EQEP_COMPARE_LOAD_ON_ZERO 0x8000U //!< Load on QPOSCNT = 0 +#define EQEP_COMPARE_LOAD_ON_MATCH 0xC000U //!< Load on QPOSCNT = QPOSCMP + +//***************************************************************************** +// +// Values that can be passed to EQEP_enableInterrupt(), +// EQEP_disableInterrupt(), and EQEP_clearInterruptStatus() as the +// intFlags parameter and returned by EQEP_clearInterruptStatus(). +// +//***************************************************************************** +#define EQEP_INT_GLOBAL 0x0001U //!< Global interrupt flag +#define EQEP_INT_POS_CNT_ERROR 0x0002U //!< Position counter error +#define EQEP_INT_PHASE_ERROR 0x0004U //!< Quadrature phase error +#define EQEP_INT_DIR_CHANGE 0x0008U //!< Quadrature direction change +#define EQEP_INT_WATCHDOG 0x0010U //!< Watchdog time-out +#define EQEP_INT_UNDERFLOW 0x0020U //!< Position counter underflow +#define EQEP_INT_OVERFLOW 0x0040U //!< Position counter overflow +#define EQEP_INT_POS_COMP_READY 0x0080U //!< Position-compare ready +#define EQEP_INT_POS_COMP_MATCH 0x0100U //!< Position-compare match +#define EQEP_INT_STROBE_EVNT_LATCH 0x0200U //!< Strobe event latch +#define EQEP_INT_INDEX_EVNT_LATCH 0x0400U //!< Index event latch +#define EQEP_INT_UNIT_TIME_OUT 0x0800U //!< Unit time-out + +//***************************************************************************** +// +// Values that can be returned by EQEP_getStatus(). +// +//***************************************************************************** +//! Unit position event detected +#define EQEP_STS_UNIT_POS_EVNT 0x0080U +//! Direction was clockwise on first index event +#define EQEP_STS_DIR_ON_1ST_IDX 0x0040U +//! Direction is CW (forward) +#define EQEP_STS_DIR_FLAG 0x0020U +//! Direction was CW on index +#define EQEP_STS_DIR_LATCH 0x0010U +//! Capture timer overflow +#define EQEP_STS_CAP_OVRFLW_ERROR 0x0008U +//! Direction changed between position capture events +#define EQEP_STS_CAP_DIR_ERROR 0x0004U +//! First index pulse occurred +#define EQEP_STS_1ST_IDX_FLAG 0x0002U +//! Position counter error +#define EQEP_STS_POS_CNT_ERROR 0x0001U + +//***************************************************************************** +// +// Values that can be passed to EQEP_setLatchMode() as the latchMode parameter. +// +//***************************************************************************** + +// +// Position counter latch event +// +#define EQEP_LATCH_CNT_READ_BY_CPU 0x0000U //!< On position counter read +#define EQEP_LATCH_UNIT_TIME_OUT 0x0004U //!< On unit time-out event + +// +// Strobe position counter latch event +// +//! On rising edge of strobe +#define EQEP_LATCH_RISING_STROBE 0x0000U +//! On rising edge when clockwise, on falling when counter clockwise +#define EQEP_LATCH_EDGE_DIR_STROBE 0x0040U + +// +// Index position counter latch event +// +#define EQEP_LATCH_RISING_INDEX 0x0010U //!< On rising edge of index +#define EQEP_LATCH_FALLING_INDEX 0x0020U //!< On falling edge of index + +#define EQEP_LATCH_SW_INDEX_MARKER 0x0030U //!< On software index marker + +//***************************************************************************** +// +// Values that can be passed to EQEP_setPositionInitMode() as the initMode +// parameter. +// +//***************************************************************************** +#define EQEP_INIT_DO_NOTHING 0x0000U //!< Action is disabled + +// +// Strobe events +// +//! On rising edge of strobe +#define EQEP_INIT_RISING_STROBE 0x0800U +//! On rising edge when clockwise, on falling when counter clockwise +#define EQEP_INIT_EDGE_DIR_STROBE 0x0C00U + +// +// Index events +// +#define EQEP_INIT_RISING_INDEX 0x0200U //!< On rising edge of index +#define EQEP_INIT_FALLING_INDEX 0x0300U //!< On falling edge of index +#endif + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setPositionCounterConfig() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Reset position on index pulse + EQEP_POSITION_RESET_IDX = 0x0000, + //! Reset position on maximum position + EQEP_POSITION_RESET_MAX_POS = 0x1000, + //! Reset position on the first index pulse + EQEP_POSITION_RESET_1ST_IDX = 0x2000, + //! Reset position on a unit time event + EQEP_POSITION_RESET_UNIT_TIME_OUT = 0x3000 +} EQEP_PositionResetMode; + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setCaptureConfig() as the \e capPrescale +//! parameter. CAPCLK is the capture timer clock frequency. +// +//***************************************************************************** +typedef enum +{ + EQEP_CAPTURE_CLK_DIV_1 = 0x00, //!< CAPCLK = SYSCLKOUT/1 + EQEP_CAPTURE_CLK_DIV_2 = 0x10, //!< CAPCLK = SYSCLKOUT/2 + EQEP_CAPTURE_CLK_DIV_4 = 0x20, //!< CAPCLK = SYSCLKOUT/4 + EQEP_CAPTURE_CLK_DIV_8 = 0x30, //!< CAPCLK = SYSCLKOUT/8 + EQEP_CAPTURE_CLK_DIV_16 = 0x40, //!< CAPCLK = SYSCLKOUT/16 + EQEP_CAPTURE_CLK_DIV_32 = 0x50, //!< CAPCLK = SYSCLKOUT/32 + EQEP_CAPTURE_CLK_DIV_64 = 0x60, //!< CAPCLK = SYSCLKOUT/64 + EQEP_CAPTURE_CLK_DIV_128 = 0x70 //!< CAPCLK = SYSCLKOUT/128 +} EQEP_CAPCLKPrescale; + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setCaptureConfig() as the \e evntPrescale +//! parameter. UPEVNT is the unit position event frequency. +// +//***************************************************************************** +typedef enum +{ + EQEP_UNIT_POS_EVNT_DIV_1, //!< UPEVNT = QCLK/1 + EQEP_UNIT_POS_EVNT_DIV_2, //!< UPEVNT = QCLK/2 + EQEP_UNIT_POS_EVNT_DIV_4, //!< UPEVNT = QCLK/4 + EQEP_UNIT_POS_EVNT_DIV_8, //!< UPEVNT = QCLK/8 + EQEP_UNIT_POS_EVNT_DIV_16, //!< UPEVNT = QCLK/16 + EQEP_UNIT_POS_EVNT_DIV_32, //!< UPEVNT = QCLK/32 + EQEP_UNIT_POS_EVNT_DIV_64, //!< UPEVNT = QCLK/64 + EQEP_UNIT_POS_EVNT_DIV_128, //!< UPEVNT = QCLK/128 + EQEP_UNIT_POS_EVNT_DIV_256, //!< UPEVNT = QCLK/256 + EQEP_UNIT_POS_EVNT_DIV_512, //!< UPEVNT = QCLK/512 + EQEP_UNIT_POS_EVNT_DIV_1024, //!< UPEVNT = QCLK/1024 + EQEP_UNIT_POS_EVNT_DIV_2048 //!< UPEVNT = QCLK/2048 +} EQEP_UPEVNTPrescale; + + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setEmulationMode() as the \e emuMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EQEP_EMULATIONMODE_STOPIMMEDIATELY, //!< Counters stop immediately + EQEP_EMULATIONMODE_STOPATROLLOVER, //!< Counters stop at period rollover + EQEP_EMULATIONMODE_RUNFREE //!< Counter unaffected by suspend +}EQEP_EmulationMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an eQEP base address. +//! +//! \param base specifies the eQEP module base address. +//! +//! This function determines if a eQEP module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +EQEP_isBaseValid(uint32_t base) +{ + return( + (base == EQEP1_BASE) || + (base == EQEP2_BASE) || + (base == EQEP3_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the eQEP module. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the enhanced quadrature encoder pulse +//! (eQEP) module. The module must be configured before it is enabled. +//! +//! \sa EQEP_setConfig() +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable the eQEP module. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_QPEN; +} + +//***************************************************************************** +// +//! Disables the eQEP module. +//! +//! \param base is the base address of the enhanced quadrature encoder pulse +//! (eQEP) module +//! +//! This function disables operation of the eQEP module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable the eQEP module. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_QPEN); +} + +//***************************************************************************** +// +//! Configures eQEP module's quadrature decoder unit. +//! +//! \param base is the base address of the eQEP module. +//! \param config is the configuration for the eQEP module decoder unit. +//! +//! This function configures the operation of the eQEP module's quadrature +//! decoder unit. The \e config parameter provides the configuration +//! of the decoder and is the logical OR of several values: +//! +//! - \b EQEP_CONFIG_2X_RESOLUTION or \b EQEP_CONFIG_1X_RESOLUTION specify +//! if both rising and falling edges should be counted or just rising edges. +//! - \b EQEP_CONFIG_QUADRATURE, \b EQEP_CONFIG_CLOCK_DIR, +//! \b EQEP_CONFIG_UP_COUNT, or \b EQEP_CONFIG_DOWN_COUNT specify if +//! quadrature signals are being provided on QEPA and QEPB, if a direction +//! signal and a clock are being provided, or if the direction should be +//! hard-wired for a single direction with QEPA used for input. +//! - \b EQEP_CONFIG_NO_SWAP or \b EQEP_CONFIG_SWAP to specify if the +//! signals provided on QEPA and QEPB should be swapped before being +//! processed. +//! - \b EQEP_CONFIG_IGATE_DISABLE or \b EQEP_CONFIG_IGATE_ENABLE to specify +//! if the gating of the index pulse should be enabled or disabled +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setDecoderConfig(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the new decoder configuration to the hardware. + // + HWREGH(base + EQEP_O_QDECCTL) = (HWREGH(base + EQEP_O_QDECCTL) & + ~(EQEP_QDECCTL_SWAP | + EQEP_QDECCTL_XCR | + EQEP_QDECCTL_QSRC_M | + EQEP_QDECCTL_IGATE)) | config; +} + +//***************************************************************************** +// +//! Configures eQEP module position counter unit. +//! +//! \param base is the base address of the eQEP module. +//! \param mode is the configuration for the eQEP module position counter. +//! \param maxPosition specifies the maximum position value. +//! +//! This function configures the operation of the eQEP module position +//! counter. The \e mode parameter determines the event on which the position +//! counter gets reset. It should be passed one of the following values: +//! \b EQEP_POSITION_RESET_IDX, \b EQEP_POSITION_RESET_MAX_POS, +//! \b EQEP_POSITION_RESET_1ST_IDX, or \b EQEP_POSITION_RESET_UNIT_TIME_OUT. +//! +//! \e maxPosition is the maximum value of the position counter and is +//! the value used to reset the position capture when moving in the reverse +//! (negative) direction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPositionCounterConfig(uint32_t base, EQEP_PositionResetMode mode, + uint32_t maxPosition) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the position counter reset configuration to the hardware. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~EQEP_QEPCTL_PCRM_M) | (uint16_t)mode; + + // + // Set the maximum position. + // + HWREG(base + EQEP_O_QPOSMAX) = maxPosition; +} + +//***************************************************************************** +// +//! Gets the current encoder position. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the current position of the encoder. Depending upon +//! the configuration of the encoder, and the incident of an index pulse, this +//! value may or may not contain the expected data (that is, if in reset on +//! index mode, if an index pulse has not been encountered, the position +//! counter is not yet aligned with the index pulse). +//! +//! \return The current position of the encoder. +// +//***************************************************************************** +static inline uint32_t +EQEP_getPosition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSCNT)); +} + +//***************************************************************************** +// +//! Sets the current encoder position. +//! +//! \param base is the base address of the eQEP module. +//! \param position is the new position for the encoder. +//! +//! This function sets the current position of the encoder; the encoder +//! position is then measured relative to this value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPosition(uint32_t base, uint32_t position) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the position counter. + // + HWREG(base + EQEP_O_QPOSCNT) = position; +} + +//***************************************************************************** +// +//! Gets the current direction of rotation. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the current direction of rotation. In this case, +//! current means the most recently detected direction of the encoder; it may +//! not be presently moving but this is the direction it last moved before it +//! stopped. +//! +//! \return Returns 1 if moving in the forward direction or -1 if moving in the +//! reverse direction. +// +//***************************************************************************** +static inline int16_t +EQEP_getDirection(uint32_t base) +{ + int16_t direction; + + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the direction of rotation. + // + if((HWREGH(base + EQEP_O_QEPSTS) & EQEP_QEPSTS_QDF) != 0U) + { + direction = 1; + } + else + { + direction = -1; + } + + return(direction); +} + +//***************************************************************************** +// +//! Enables individual eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables eQEP module interrupt sources. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable the specified interrupts. + // + HWREGH(base + EQEP_O_QEINT) |= intFlags; +} + +//***************************************************************************** +// +//! Disables individual eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! +//! This function disables eQEP module interrupt sources. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable the specified interrupts. + // + HWREGH(base + EQEP_O_QEINT) &= ~(intFlags); +} + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the interrupt status for the eQEP module +//! module. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! the following values: +//! - \b EQEP_INT_GLOBAL - Global interrupt flag +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +// +//***************************************************************************** +static inline uint16_t +EQEP_getInterruptStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + return(HWREGH(base + EQEP_O_QFLG)); +} + +//***************************************************************************** +// +//! Clears eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! This function clears eQEP module interrupt flags. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_GLOBAL - Global interrupt flag +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! Note that the \b EQEP_INT_GLOBAL value is the global interrupt flag. In +//! order to get any further eQEP interrupts, this flag must be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_clearInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + HWREGH(base + EQEP_O_QCLR) = intFlags; +} + +//***************************************************************************** +// +//! Forces individual eQEP module interrupts. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be forced. +//! +//! This function forces eQEP module interrupt flags. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR +//! - \b EQEP_INT_PHASE_ERROR +//! - \b EQEP_INT_DIR_CHANGE +//! - \b EQEP_INT_WATCHDOG +//! - \b EQEP_INT_UNDERFLOW +//! - \b EQEP_INT_OVERFLOW +//! - \b EQEP_INT_POS_COMP_READY +//! - \b EQEP_INT_POS_COMP_MATCH +//! - \b EQEP_INT_STROBE_EVNT_LATCH +//! - \b EQEP_INT_INDEX_EVNT_LATCH +//! - \b EQEP_INT_UNIT_TIME_OUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_forceInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Force the specified interrupts. + // + HWREGH(base + EQEP_O_QFRC) |= intFlags; +} + +//***************************************************************************** +// +//! Gets the encoder error indicator. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the error indicator for the eQEP module. It is an +//! error for both of the signals of the quadrature input to change at the same +//! time. +//! +//! \return Returns \b true if an error has occurred and \b false otherwise. +// +//***************************************************************************** +static inline bool +EQEP_getError(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the error indicator. + // + return((HWREGH(base + EQEP_O_QFLG) & EQEP_QFLG_PHE) != 0U); +} + +//***************************************************************************** +// +//! Returns content of the eQEP module status register +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the contents of the status register. The value it +//! returns is an OR of the following values: +//! +//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected +//! - \b EQEP_STS_DIR_ON_1ST_IDX - If set, clockwise rotation (forward +//! movement) occurred on the first index event +//! - \b EQEP_STS_DIR_FLAG - If set, movement is clockwise rotation +//! - \b EQEP_STS_DIR_LATCH - If set, clockwise rotation occurred on last +//! index event marker +//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer +//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position +//! capture events +//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index +//! pulse +//! - \b EQEP_STS_POS_CNT_ERROR - Position counter error occurred +//! +//! \return Returns the value of the QEP status register. +// +//***************************************************************************** +static inline uint16_t +EQEP_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the status register. + // + return(HWREGH(base + EQEP_O_QEPSTS) & 0x00FFU); +} + +//***************************************************************************** +// +//! Clears selected fields of the eQEP module status register +//! +//! \param base is the base address of the eQEP module. +//! \param statusFlags is the bit mask of the status flags to be cleared. +//! +//! This function clears the status register fields indicated by +//! \e statusFlags. The \e statusFlags parameter is the logical OR of any of +//! the following: +//! +//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected +//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer +//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position +//! capture events +//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index +//! pulse +//! +//! \note Only the above status fields can be cleared. All others are +//! read-only, non-sticky fields. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_clearStatus(uint32_t base, uint16_t statusFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + HWREGH(base + EQEP_O_QEPSTS) = statusFlags; +} + +//***************************************************************************** +// +//! Configures eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! \param capPrescale is the prescaler setting of the eQEP capture timer clk. +//! \param evntPrescale is the prescaler setting of the unit position event +//! frequency. +//! +//! This function configures the operation of the eQEP module edge-capture +//! unit. The \e capPrescale parameter provides the configuration of the eQEP +//! capture timer clock rate. It determines by which power of 2 between 1 and +//! 128 inclusive SYSCLKOUT is divided. The macros for this parameter are in +//! the format of EQEP_CAPTURE_CLK_DIV_X, where X is the divide value. For +//! example, \b EQEP_CAPTURE_CLK_DIV_32 will give a capture timer clock +//! frequency that is SYSCLKOUT/32. +//! +//! The \e evntPrescale parameter determines how frequently a unit position +//! event occurs. The macro that can be passed this parameter is in the format +//! EQEP_UNIT_POS_EVNT_DIV_X, where X is the number of quadrature clock +//! periods between unit position events. For example, +//! \b EQEP_UNIT_POS_EVNT_DIV_16 will result in a unit position event +//! frequency of QCLK/16. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setCaptureConfig(uint32_t base, EQEP_CAPCLKPrescale capPrescale, + EQEP_UPEVNTPrescale evntPrescale) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write new prescaler configurations to the appropriate registers. + // + HWREGH(base + EQEP_O_QCAPCTL) = + (HWREGH(base + EQEP_O_QCAPCTL) & + ~(EQEP_QCAPCTL_UPPS_M | EQEP_QCAPCTL_CCPS_M)) | + ((uint16_t)evntPrescale | (uint16_t)capPrescale); +} + +//***************************************************************************** +// +//! Enables the eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the eQEP module's edge-capture unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableCapture(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable edge capture. + // + HWREGH(base + EQEP_O_QCAPCTL) |= EQEP_QCAPCTL_CEN; +} + +//***************************************************************************** +// +//! Disables the eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's edge-capture unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableCapture(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable edge capture. + // + HWREGH(base + EQEP_O_QCAPCTL) &= ~(EQEP_QCAPCTL_CEN); +} + +//***************************************************************************** +// +//! Gets the encoder capture period. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the period count value between the last successive +//! eQEP position events. +//! +//! \return The period count value between the last successive position events. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCapturePeriod(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the capture period. + // + return(HWREGH(base + EQEP_O_QCPRD)); +} + +//***************************************************************************** +// +//! Gets the encoder capture timer value. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the time base for the edge capture unit. +//! +//! \return The capture timer value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCaptureTimer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the capture timer value. + // + return(HWREGH(base + EQEP_O_QCTMR)); +} + +//***************************************************************************** +// +//! Enables the eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the eQEP module's position-compare unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableCompare(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable position compare. + // + HWREGH(base + EQEP_O_QPOSCTL) |= EQEP_QPOSCTL_PCE; +} + +//***************************************************************************** +// +//! Disables the eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's position-compare +//! unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableCompare(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable position compare. + // + HWREGH(base + EQEP_O_QPOSCTL) &= ~(EQEP_QPOSCTL_PCE); +} + +//***************************************************************************** +// +//! Configures the position-compare unit's sync output pulse width. +//! +//! \param base is the base address of the eQEP module. +//! \param cycles is the width of the pulse that can be generated on a +//! position-compare event. It is in units of 4 SYSCLKOUT cycles. +//! +//! This function configures the width of the sync output pulse. The width of +//! the pulse will be \e cycles * 4 * the width of a SYSCLKOUT cycle. The +//! maximum width is 4096 * 4 * SYSCLKOUT cycles. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setComparePulseWidth(uint32_t base, uint16_t cycles) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + ASSERT(cycles <= (EQEP_QPOSCTL_PCSPW_M + 1U)); + + // + // Set the pulse width. + // + HWREGH(base + EQEP_O_QPOSCTL) = (HWREGH(base + EQEP_O_QPOSCTL) & + ~(uint16_t)EQEP_QPOSCTL_PCSPW_M) | + (cycles - 1U); +} + +//***************************************************************************** +// +//! Loads the eQEP module unit timer period as number of SYSCLK cycles. +//! +//! \param base is the base address of the eQEP module. +//! \param period is period value at which a unit time-out interrupt is set. +//! +//! This function sets the unit time-out interrupt when it matches the value +//! specified by \e period +//! The unit timer is clocked by SYSCLKOUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_loadUnitTimer(uint32_t base, uint32_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the period of the unit timer. + // + HWREG(base + EQEP_O_QUPRD) = period; +} + +//***************************************************************************** +// +//! Enables the eQEP module unit timer. +//! +//! \param base is the base address of the eQEP module. +//! \param period is period value at which a unit time-out interrupt is set. +//! +//! This function enables operation of the eQEP module's peripheral unit timer. +//! The unit timer is clocked by SYSCLKOUT and will set the unit time-out +//! interrupt when it matches the value specified by \e period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableUnitTimer(uint32_t base, uint32_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the period of the unit timer. + // + HWREG(base + EQEP_O_QUPRD) = period; + + // + // Enable peripheral unit timer. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_UTE; +} + +//***************************************************************************** +// +//! Disables the eQEP module unit timer. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's peripheral +//! unit timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableUnitTimer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable peripheral unit timer. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_UTE); +} + +//***************************************************************************** +// +//! Enables the eQEP module watchdog timer. +//! +//! \param base is the base address of the eQEP module. +//! \param period is watchdog period value at which a time-out will occur if +//! no quadrature-clock event is detected. +//! +//! This function enables operation of the eQEP module's peripheral watchdog +//! timer. +//! +//! \note When selecting \e period, note that the watchdog timer is clocked +//! from SYSCLKOUT/64. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableWatchdog(uint32_t base, uint16_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the timeout count for the eQEP peripheral watchdog timer. + // + HWREGH(base + EQEP_O_QWDPRD) = period; + + // + // Enable peripheral watchdog. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_WDE; +} + +//***************************************************************************** +// +//! Disables the eQEP module watchdog timer. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's peripheral watchdog +//! timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableWatchdog(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable peripheral watchdog. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_WDE); +} + +//***************************************************************************** +// +//! Sets the eQEP module watchdog timer value. +//! +//! \param base is the base address of the eQEP module. +//! \param value is the value to be written to the watchdog timer. +//! +//! This function sets the eQEP module's watchdog timer value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setWatchdogTimerValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the value to the watchdog timer register. + // + HWREGH(base + EQEP_O_QWDTMR) = value; +} + +//***************************************************************************** +// +//! Gets the eQEP module watchdog timer value. +//! +//! \param base is the base address of the eQEP module. +//! +//! \return Returns the current watchdog timer value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getWatchdogTimerValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Read the value from the watchdog timer register. + // + return(HWREGH(base + EQEP_O_QWDTMR)); +} + +//***************************************************************************** +// +//! Configures the mode in which the position counter is initialized. +//! +//! \param base is the base address of the eQEP module. +//! \param initMode is the configuration for initializing the position count. +//! See below for a description of this parameter. +//! +//! This function configures the events on which the position count can be +//! initialized. The \e initMode parameter provides the mode as either +//! \b EQEP_INIT_DO_NOTHING (no action configured) or one of the following +//! strobe events, index events, or a logical OR of both a strobe event and an +//! index event. +//! +//! - \b EQEP_INIT_RISING_STROBE or \b EQEP_INIT_EDGE_DIR_STROBE specify +//! which strobe event will initialize the position counter. +//! - \b EQEP_INIT_RISING_INDEX or \b EQEP_INIT_FALLING_INDEX specify +//! which index event will initialize the position counter. +//! +//! Use EQEP_setSWPositionInit() to cause a software initialization and +//! EQEP_setInitialPosition() to set the value that gets loaded into the +//! position counter upon initialization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPositionInitMode(uint32_t base, uint16_t initMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the init mode in the QEP Control register. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~(EQEP_QEPCTL_IEI_M | EQEP_QEPCTL_SEI_M)) | + initMode; +} + +//***************************************************************************** +// +//! Sets the software initialization of the encoder position counter. +//! +//! \param base is the base address of the eQEP module. +//! \param initialize is a flag to specify if software initialization of the +//! position counter is enabled. +//! +//! This function does a software initialization of the position counter when +//! the \e initialize parameter is \b true. When \b false, the QEPCTL[SWI] bit +//! is cleared and no action is taken. +//! +//! The init value to be loaded into the position counter can be set with +//! EQEP_setInitialPosition(). Additional initialization causes can be +//! configured with EQEP_setPositionInitMode(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setSWPositionInit(uint32_t base, bool initialize) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set or clear the software initialization bit. + // + if(initialize) + { + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_SWI; + } + else + { + HWREGH(base + EQEP_O_QEPCTL) &= ~EQEP_QEPCTL_SWI; + } +} + +//***************************************************************************** +// +//! Sets the init value for the encoder position counter. +//! +//! \param base is the base address of the eQEP module. +//! \param position is the value to be written to the position counter upon. +//! initialization. +//! +//! This function sets the init value for position of the encoder. See +//! EQEP_setPositionInitMode() to set the initialization cause or +//! EQEP_setSWPositionInit() to cause a software initialization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setInitialPosition(uint32_t base, uint32_t position) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write position to position counter init register + // + HWREG(base + EQEP_O_QPOSINIT) = position; +} + +//***************************************************************************** +// +//! Configures the quadrature modes in which the position count can be latched. +//! +//! \param base is the base address of the eQEP module. +//! \param latchMode is the configuration for latching of the position count +//! and several other registers. See below for a description of this +//! parameter. +//! +//! This function configures the events on which the position count and several +//! other registers can be latched. The \e latchMode parameter provides the +//! mode as the logical OR of several values. +//! +//! - \b EQEP_LATCH_CNT_READ_BY_CPU or \b EQEP_LATCH_UNIT_TIME_OUT specify +//! the event that latches the position counter. This latch register can be +//! read using EQEP_getPositionLatch(). The capture timer and capture +//! period are also latched based on this setting, and can be read using +//! EQEP_getCaptureTimerLatch() and EQEP_getCapturePeriodLatch(). +//! - \b EQEP_LATCH_RISING_STROBE or \b EQEP_LATCH_EDGE_DIR_STROBE +//! specify which strobe event will latch the position counter into the +//! strobe position latch register. This register can be read with +//! EQEP_getStrobePositionLatch(). +//! - \b EQEP_LATCH_RISING_INDEX, \b EQEP_LATCH_FALLING_INDEX, or +//! \b EQEP_LATCH_SW_INDEX_MARKER specify which index event will latch the +//! position counter into the index position latch register. This register +//! can be read with EQEP_getIndexPositionLatch(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setLatchMode(uint32_t base, uint32_t latchMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the latch mode in the QEP Control register. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~(EQEP_QEPCTL_QCLM | EQEP_QEPCTL_IEL_M | + EQEP_QEPCTL_SEL)) | latchMode; +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on an index event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the index position latch register. The +//! position counter is latched into this register on either a rising index +//! edge, a falling index edge, or a software index marker. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The position count latched on an index event. +// +//***************************************************************************** +static inline uint32_t +EQEP_getIndexPositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSILAT)); +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on a strobe event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the strobe position latch register. The +//! position counter can be configured to be latched into this register on +//! rising strobe edges only or on rising strobe edges while moving clockwise +//! and falling strobe edges while moving counter-clockwise. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The position count latched on a strobe event. +// +//***************************************************************************** +static inline uint32_t +EQEP_getStrobePositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSSLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on a unit time-out event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the position latch register. The +//! position counter is latched into this register either on a unit time-out +//! event. +//! +//! \return The position count latch register value. +// +//***************************************************************************** +static inline uint32_t +EQEP_getPositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder capture timer latch. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the capture timer latch register. The +//! capture timer value is latched into this register either on a unit time-out +//! event or upon the CPU reading the eQEP position counter. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The edge-capture timer latch value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCaptureTimerLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREGH(base + EQEP_O_QCTMRLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder capture period latch. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the capture period latch register. The +//! capture period value is latched into this register either on a unit +//! time-out event or upon the CPU reading the eQEP position counter. This is +//! configured using EQEP_setLatchMode(). +//! +//! \return The edge-capture period latch value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCapturePeriodLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREGH(base + EQEP_O_QCPRDLAT)); +} + +//***************************************************************************** +// +//! Set the emulation mode of the eQEP module. +//! +//! \param base is the base address of the eQEP module. +//! \param emuMode is the mode operation upon an emulation suspend. +//! +//! This function sets the eQEP module's emulation mode. This mode determines +//! how the timers are affected by an emulation suspend. Valid values for the +//! \e emuMode parameter are the following: +//! +//! - \b EQEP_EMULATIONMODE_STOPIMMEDIATELY - The position counter, watchdog +//! counter, unit timer, and capture timer all stop immediately. +//! - \b EQEP_EMULATIONMODE_STOPATROLLOVER - The position counter, watchdog +//! counter, unit timer all count until period rollover. The capture timer +//! counts until the next unit period event. +//! - \b EQEP_EMULATIONMODE_RUNFREE - The position counter, watchdog counter, +//! unit timer, and capture timer are all unaffected by an emulation suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setEmulationMode(uint32_t base, EQEP_EmulationMode emuMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the emulation mode to the FREE_SOFT bits. + // + HWREGH(base + EQEP_O_QEPCTL) = + (HWREGH(base + EQEP_O_QEPCTL) & ~EQEP_QEPCTL_FREE_SOFT_M) | + ((uint16_t)emuMode << EQEP_QEPCTL_FREE_SOFT_S); +} + +//***************************************************************************** +// +//! Configures eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! \param config is the configuration for the eQEP module +//! position-compare unit. See below for a description of this parameter. +//! \param compareValue is the value to which the position count value is +//! compared for a position-compare event. +//! \param cycles is the width of the pulse that can be generated on a +//! position-compare event. It is in units of 4 SYSCLKOUT cycles. +//! +//! This function configures the operation of the eQEP module position-compare +//! unit. The \e config parameter provides the configuration of the +//! position-compare unit and is the logical OR of several values: +//! +//! - \b EQEP_COMPARE_NO_SYNC_OUT, \b EQEP_COMPARE_IDX_SYNC_OUT, or +//! \b EQEP_COMPARE_STROBE_SYNC_OUT specify if there is a sync output pulse +//! and which pin should be used. +//! - \b EQEP_COMPARE_NO_SHADOW, \b EQEP_COMPARE_LOAD_ON_ZERO, or +//! \b EQEP_COMPARE_LOAD_ON_MATCH specify if a shadow is enabled and when +//! should the load should occur--QPOSCNT = 0 or QPOSCNT = QPOSCOMP. +//! +//! The \e cycles is used to select the width of the sync output pulse. The +//! width of the resulting pulse will be \e cycles * 4 * the width of a +//! SYSCLKOUT cycle. The maximum width is 4096 * 4 * SYSCLKOUT cycles. +//! +//! \note You can set the sync pulse width independently using the +//! EQEP_setComparePulseWidth() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +EQEP_setCompareConfig(uint32_t base, uint16_t config, uint32_t compareValue, + uint16_t cycles); + +//***************************************************************************** +// +//! Sets the polarity of the eQEP module's input signals. +//! +//! \param base is the base address of the eQEP module. +//! \param invertQEPA is the flag to negate the QEPA input. +//! \param invertQEPB is the flag to negate the QEPA input. +//! \param invertIndex is the flag to negate the index input. +//! \param invertStrobe is the flag to negate the strobe input. +//! +//! This function configures the polarity of the inputs to the eQEP module. To +//! negate the polarity of any of the input signals, pass \b true into its +//! corresponding parameter in this function. Pass \b false to leave it as-is. +//! +//! \return None. +// +//***************************************************************************** +extern void +EQEP_setInputPolarity(uint32_t base, bool invertQEPA, bool invertQEPB, + bool invertIndex, bool invertStrobe); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EQEP_H diff --git a/gpio_bitfield_cpu2/device/driverlib/flash.c b/gpio_bitfield_cpu2/device/driverlib/flash.c new file mode 100644 index 0000000..372b77b --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/flash.c @@ -0,0 +1,175 @@ +//########################################################################### +// +// FILE: flash.c +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "flash.h" + +#ifndef __cplusplus +#pragma CODE_SECTION(Flash_initModule, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_powerDown, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_wakeFromLPM, ".TI.ramfunc"); +#endif + +//***************************************************************************** +// +// Flash_initModule +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT(waitstates <= 0xFU); + + // + // Set the bank power up delay so that the bank will power up properly. + // + Flash_setBankPowerUpDelay(ctrlBase, 0x14); + + // + // Set the bank fallback power mode to active. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_ACTIVE); + + // + // Power up flash bank and pump and this also sets the fall back mode of + // flash and pump as active + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_ACTIVE); + + // + // Disable cache and prefetch mechanism before changing wait states + // + Flash_disableCache(ctrlBase); + Flash_disablePrefetch(ctrlBase); + + // + // Set waitstates according to frequency. + // + Flash_setWaitstates(ctrlBase, waitstates); + + + // + // Enable cache and prefetch mechanism to improve performance of code + // executed from flash. + // + Flash_enableCache(ctrlBase); + Flash_enablePrefetch(ctrlBase); + + // + // At reset, ECC is enabled. If it is disabled by application software and + // if application again wants to enable ECC. + // + Flash_enableECC(eccBase); + + // + // Force a pipeline flush to ensure that the write to the last register + // configured occurs before returning. + // + + FLASH_DELAY_CONFIG; +} + +//***************************************************************************** +// +// Flash_powerDown +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_powerDown(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // Set the bank power up delay so that it will power up properly. + // + Flash_setBankPowerUpDelay(ctrlBase, 0x14); + + // + // Power down the flash bank. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_SLEEP); + + // + // Power down the flash pump. + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_SLEEP); +} + +//***************************************************************************** +// +// Flash_wakeFromLPM +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_wakeFromLPM(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // Set the bank fallback power modes to active. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_ACTIVE); + + // + // Set the flash pump power mode to active. + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_ACTIVE); +} diff --git a/gpio_bitfield_cpu2/device/driverlib/flash.h b/gpio_bitfield_cpu2/device/driverlib/flash.h new file mode 100644 index 0000000..a60a2f2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/flash.h @@ -0,0 +1,1671 @@ +//########################################################################### +// +// FILE: flash.h +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef FLASH_H +#define FLASH_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif +#ifndef __TMS320C28XX_CLA__ + +//***************************************************************************** +// +//! \addtogroup flash_api Flash +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +#ifndef __cplusplus +#pragma CODE_SECTION(Flash_setBankPowerMode, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_setPumpPowerMode, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_disableCache, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_disablePrefetch, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_setWaitstates, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enableCache, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enablePrefetch, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enableECC, ".TI.ramfunc"); +#endif + + +//***************************************************************************** +// +//! Values that can be passed to Flash_setBankPowerMode() as the bank parameter +// +//***************************************************************************** +typedef enum +{ + FLASH_BANK = 0x0 //!< Bank +} Flash_BankNumber; + +//***************************************************************************** +// +//! Values that can be passed to Flash_claimPumpSemaphore() in order to claim +//! the pump semaphore. +// +//***************************************************************************** +typedef enum +{ + FLASH_CPU1_WRAPPER = 0x2, //!< CPU1 Wrapper + FLASH_CPU2_WRAPPER = 0x1 //!< CPU2 Wrapper +}Flash_PumpOwnership; + +//***************************************************************************** +// +//! Values that can be passed to Flash_setBankPowerMode() as the powerMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + FLASH_BANK_PWR_SLEEP = 0x0, //!< Sleep fallback mode + FLASH_BANK_PWR_STANDBY = 0x1, //!< Standby fallback mode + FLASH_BANK_PWR_ACTIVE = 0x3 //!< Active fallback mode +} Flash_BankPowerMode; + +//***************************************************************************** +// +//! Values that can be passed to Flash_setPumpPowerMode() as the powerMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + FLASH_PUMP_PWR_SLEEP = 0x0, //!< Sleep fallback mode + FLASH_PUMP_PWR_ACTIVE = 0x1 //!< Active fallback mode +} Flash_PumpPowerMode; + +//***************************************************************************** +// +//! Type that correspond to values returned from Flash_getLowErrorStatus() and +//! Flash_getHighErrorStatus() determining the error status code. +// +//***************************************************************************** +typedef enum +{ + FLASH_NO_ERR = 0x0, //!< No error + FLASH_FAIL_0 = 0x1, //!< Fail on 0 + FLASH_FAIL_1 = 0x2, //!< Fail on 1 + FLASH_UNC_ERR = 0x4 //!< Uncorrectable error +} Flash_ErrorStatus; + +//***************************************************************************** +// +//! Values that can be returned from Flash_getLowErrorType() and +//! Flash_getHighErrorType() determining the error type. +// +//***************************************************************************** +typedef enum +{ + FLASH_DATA_ERR = 0x0, //!< Data error + FLASH_ECC_ERR = 0x1 //!< ECC error +} Flash_ErrorType; + +//***************************************************************************** +// +//! Values that can be returned from Flash_getECCTestSingleBitErrorType(). +// +//***************************************************************************** +typedef enum +{ + FLASH_DATA_BITS = 0x0, //!< Data bits + FLASH_CHECK_BITS = 0x1 //!< ECC bits +} Flash_SingleBitErrorIndicator; + +//***************************************************************************** +// +// Values that can be passed to Flash_clearLowErrorStatus and +// Flash_clearHighErrorStatus. +// +//***************************************************************************** +#define FLASH_FAIL_0_CLR 0x1 //!< Fail-0 clear +#define FLASH_FAIL_1_CLR 0x2 //!< Fail-1 clear +#define FLASH_UNC_ERR_CLR 0x4 //!< Uncorrectable error Clear + +//***************************************************************************** +// +// Values that can be returned from Flash_getInterruptFlag and +// Flash_getECCTestStatus. +// +//***************************************************************************** +#define FLASH_NO_ERROR 0x0 //!< No error +#define FLASH_SINGLE_ERROR 0x1 //!< Single bit error +#define FLASH_UNC_ERROR 0x2 //!< Uncorrectable error + +//***************************************************************************** +// +// Delay instruction that allows for register configuration to complete. +// +//***************************************************************************** +#define FLASH_DELAY_CONFIG __asm(" RPT #7 || NOP") + +//***************************************************************************** +// +// Key value for claiming the pump semaphore. +// +//***************************************************************************** +#define FLASH_PUMP_KEY 0x5A5A0000UL //!< Pump semaphore key + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a flash wrapper base address for the control registers. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function determines if a flash wrapper control base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isCtrlBaseValid(uint32_t ctrlBase) +{ + return((ctrlBase == FLASH0CTRL_BASE)); +} +#endif + +//***************************************************************************** +// +//! \internal +//! Checks a flash wrapper base address for the ECC registers. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function determines if a flash wrapper ECC base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isECCBaseValid(uint32_t eccBase) +{ + return((eccBase == FLASH0ECC_BASE)); +} +#endif + +//***************************************************************************** +// +//! \internal +//! Checks a flash pump semaphore base address. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! +//! This function determines if a flash pump semaphore base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isPumpSemBaseValid(uint32_t pumpSemBase) +{ + return((pumpSemBase == FLASHPUMPSEMAPHORE_BASE)); +} +#endif + +//***************************************************************************** +// +//! Sets the random read wait state amount. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param waitstates is the wait-state value. +//! +//! This function sets the number of wait states for a flash read access. The +//! \e waitstates parameter is a number between 0 and 15. It is \b important +//! to look at your device's datasheet for information about what the required +//! minimum flash wait-state is for your selected SYSCLK frequency. +//! +//! By default the wait state amount is configured to the maximum 15. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setWaitstates(uint32_t ctrlBase, uint16_t waitstates) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // waitstates is 4 bits wide. + // + ASSERT(waitstates <= 0xFU); + + EALLOW; + // + // Write flash read wait-state amount to appropriate register. + // + HWREG(ctrlBase + FLASH_O_FRDCNTL) = + (HWREG(ctrlBase + FLASH_O_FRDCNTL) & + ~(uint32_t)FLASH_FRDCNTL_RWAIT_M) | + ((uint32_t)waitstates << FLASH_FRDCNTL_RWAIT_S); + EDIS; +} + +//***************************************************************************** +// +//! Sets the fallback power mode of a flash bank. +//! +//! \param ctrlBase is the base address of the flash wrapper registers. +//! \param bank is the flash bank that is being configured. +//! \param powerMode is the power mode to be entered. +//! +//! This function sets the fallback power mode of the flash bank specified by +//! them \e bank parameter. The power mode is specified by the \e powerMode +//! parameter with one of the following values: +//! +//! - \b FLASH_BANK_PWR_SLEEP - Sense amplifiers and sense reference disabled. +//! - \b FLASH_BANK_PWR_STANDBY - Sense amplifiers disabled but sense reference +//! enabled. +//! - \b FLASH_BANK_PWR_ACTIVE - Sense amplifiers and sense reference enabled. +//! +//! +//! Note: There is only one Flash_BankNumber value on this device (FLASH_BANK). +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setBankPowerMode(uint32_t ctrlBase, Flash_BankNumber bank, + Flash_BankPowerMode powerMode) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Write the power mode to the appropriate register. + // + HWREG(ctrlBase + FLASH_O_FBFALLBACK) = + (HWREG(ctrlBase + FLASH_O_FBFALLBACK) & + ~((FLASH_FBFALLBACK_BNKPWR0_M) << ((uint32_t)bank * 2U))) | + ((uint32_t)powerMode << ((uint32_t)bank * 2U)); + EDIS; +} + +//***************************************************************************** +// +//! Sets the fallback power mode of the charge pump. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param powerMode is the power mode to be entered. +//! +//! This function sets the fallback power mode flash charge pump. +//! +//! - \b FLASH_PUMP_PWR_SLEEP - All circuits disabled. +//! - \b FLASH_PUMP_PWR_ACTIVE - All pump circuits active. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setPumpPowerMode(uint32_t ctrlBase, Flash_PumpPowerMode powerMode) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Write the power mode to the appropriate register. + // + HWREG(ctrlBase + FLASH_O_FPAC1) = + (HWREG(ctrlBase + FLASH_O_FPAC1) & + ~(uint32_t)FLASH_FPAC1_PMPPWR) | (uint32_t)powerMode; + EDIS; +} + +//***************************************************************************** +// +//! Enables prefetch mechanism. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enablePrefetch(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Set the prefetch enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) |= + FLASH_FRD_INTF_CTRL_PREFETCH_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables prefetch mechanism. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_disablePrefetch(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Clear the prefetch enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) &= + ~(uint32_t)FLASH_FRD_INTF_CTRL_PREFETCH_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enables data cache. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enableCache(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Set the data cache enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) |= + FLASH_FRD_INTF_CTRL_DATA_CACHE_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables data cache. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_disableCache(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Clear the data cache enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) &= + ~(uint32_t)FLASH_FRD_INTF_CTRL_DATA_CACHE_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enables flash error correction code (ECC) protection. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enableECC(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + + // + // Write the key value 0xA to ECC_ENABLE register. + // + HWREG(eccBase + FLASH_O_ECC_ENABLE) = + (HWREG(eccBase + FLASH_O_ECC_ENABLE) & + ~(uint32_t)FLASH_ECC_ENABLE_ENABLE_M) | 0xAU; + EDIS; +} + +//***************************************************************************** +// +//! Disables flash error correction code (ECC) protection. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_disableECC(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + + // + // Clear ECC enable field with the one's complement of the key. + // + HWREG(eccBase + FLASH_O_ECC_ENABLE) = + (HWREG(eccBase + FLASH_O_ECC_ENABLE) & + ~(uint32_t)FLASH_ECC_ENABLE_ENABLE_M) | 0x5U; + EDIS; +} + + +//***************************************************************************** +// +//! Sets the bank power up delay. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param delay is the number of HCLK cycles. +//! +//! This function sets the VREADST delay to ensure that the requisite delay is +//! introduced for the flash pump/bank to come out of low-power mode, so that +//! the flash/OTP is ready for CPU access. +//! +//! Note: Refer to TRM before configuring VREADST. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setBankPowerUpDelay(uint32_t ctrlBase, uint16_t delay) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + ASSERT(delay <= 0xFF); + + EALLOW; + + // + // Write period to the BAGP of the FBAC register. + // + HWREG(ctrlBase + FLASH_O_FBAC) = (HWREG(ctrlBase + FLASH_O_FBAC) & + ~(uint32_t)FLASH_FBAC_VREADST_M) | delay; + EDIS; +} + +//***************************************************************************** +// +//! Sets the pump wake up time. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param sysclkCycles is the number of SYSCLK cycles it takes for the pump +//! to wakeup. +//! +//! This function sets the wakeup time with \e sysclkCycles parameter. +//! The \e sysclkCycles is a value between 0 and 8190. When the charge pump +//! exits sleep power mode, it will take sysclkCycles to wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setPumpWakeupTime(uint32_t ctrlBase, uint16_t sysclkCycles) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // PSLEEP = sysclkCycles/2. PSLEEP maximum value is 4095(12 bits wide) + // + ASSERT( sysclkCycles <= 8190U ); + + EALLOW; + + // + // Write sysclkCycles/2 to PSLEEP of the FPAC1 register. + // + HWREG(ctrlBase + FLASH_O_FPAC1) = + (HWREG(ctrlBase + FLASH_O_FPAC1) & + ~(uint32_t)FLASH_FPAC1_PSLEEP_M) | + (((uint32_t)sysclkCycles / (uint32_t)2) << + (uint32_t)FLASH_FPAC1_PSLEEP_S); + EDIS; +} + +//***************************************************************************** +// +//! Reads the bank active power state. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param bank is the flash bank that is being used. +//! +//! \return Returns \b true if the Bank is in Active power state and \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +Flash_isBankReady(uint32_t ctrlBase, Flash_BankNumber bank) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + bool ready; + uint32_t bitMask = (uint32_t)FLASH_FBPRDY_BANKRDY << (uint32_t)bank; + // + // Return the BANKXRDY bit in FBPRDY. + // + if((HWREG(ctrlBase + FLASH_O_FBPRDY) & bitMask) == bitMask) + { + ready = true; + } + else + { + ready = false; + } + return(ready); +} + +//***************************************************************************** +// +//! Reads the pump active power state. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return Returns \b true if the Pump is in Active power state and \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +Flash_isPumpReady(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + bool ready; + + // + // Return the PUMPRDY bit in FBPRDY. + // + if((HWREG(ctrlBase + FLASH_O_FBPRDY) & + (uint32_t)FLASH_FBPRDY_PUMPRDY) == FLASH_FBPRDY_PUMPRDY) + { + ready = true; + } + else + { + ready = false; + } + return(ready); +} + + +//***************************************************************************** +// +//! Gets the single error address low. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the single bit error that +//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where a single bit +//! error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getSingleBitErrorAddressLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_SINGLE_ERR_ADDR_LOW)); +} + +//***************************************************************************** +// +//! Gets the single error address high. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the single bit error that +//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where a single bit +//! error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getSingleBitErrorAddressHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_SINGLE_ERR_ADDR_HIGH)); +} + +//***************************************************************************** +// +//! Gets the uncorrectable error address low. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the uncorrectable error that +//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where an +//! uncorrectable error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getUncorrectableErrorAddressLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_UNC_ERR_ADDR_LOW)); +} + +//***************************************************************************** +// +//! Gets the uncorrectable error address high. +//! +//! \param eccBase is the base address of the flash wrapper ECC base. +//! +//! This function returns the 32-bit address of the uncorrectable error that +//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where an +//! uncorrectable error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getUncorrectableErrorAddressHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_UNC_ERR_ADDR_HIGH)); +} + +//***************************************************************************** +// +//! Gets the error status of the Lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error status of the lower 64-bits of a 128-bit +//! aligned address. +//! +//! \return Returns value of the low error status bits which can be used with +//! Flash_ErrorStatus type. +// +//***************************************************************************** +static inline Flash_ErrorStatus +Flash_getLowErrorStatus(uint32_t eccBase) +{ + uint32_t errorStatus; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Get the Low Error Status bits + // + errorStatus = (HWREG(eccBase + FLASH_O_ERR_STATUS) & 0x7UL); + return((Flash_ErrorStatus)errorStatus); +} + +//***************************************************************************** +// +//! Gets the error status of the Upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error status of the upper 64-bits of a 128-bit +//! aligned address. +//! +//! \return Returns value of the high error status bits which can be used with +//! Flash_ErrorStatus type. +// +//***************************************************************************** +static inline Flash_ErrorStatus +Flash_getHighErrorStatus(uint32_t eccBase) +{ + uint32_t errorStatus; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Get the High Error Status bits + // + errorStatus = ((HWREG(eccBase + FLASH_O_ERR_STATUS) >> 16U) & 0x7UL); + return((Flash_ErrorStatus)errorStatus); +} + +//***************************************************************************** +// +//! Gets the error position of the lower 64-bits for a single bit error. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error position of the lower 64-bits. If the +//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges +//! from 0-63 for FLASH_DATA_ERR. +//! +//! \return Returns the position of the lower error bit. +// +//***************************************************************************** +static inline uint32_t +Flash_getLowErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return((HWREG(eccBase + FLASH_O_ERR_POS) & + (uint32_t)FLASH_ERR_POS_ERR_POS_L_M) >> + FLASH_ERR_POS_ERR_POS_L_S); +} + +//***************************************************************************** +// +//! Gets the error position of the upper 64-bits for a single bit error. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error position of the upper 64-bits. If the +//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges +//! from 0-63 for FLASH_DATA_ERR. +//! +//! \return Returns the position of the upper error bit. +// +//***************************************************************************** +static inline uint32_t +Flash_getHighErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return((HWREG(eccBase + FLASH_O_ERR_POS) & + (uint32_t)FLASH_ERR_POS_ERR_POS_H_M) >> + FLASH_ERR_POS_ERR_POS_H_S); +} + +//***************************************************************************** +// +//! Gets the error type of the lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error type of the lower 64-bits. The error type +//! can be FLASH_ECC_ERR or FLASH_DATA_ERR. +//! +//! \return Returns the type of the lower 64-bit error. +// +//***************************************************************************** +static inline Flash_ErrorType +Flash_getLowErrorType(uint32_t eccBase) +{ + Flash_ErrorType errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Check which error type. + // If bit is 1 then ECC error, else it is a Data error. + // + if((HWREG(eccBase + FLASH_O_ERR_POS) & FLASH_ERR_POS_ERR_TYPE_L) + == FLASH_ERR_POS_ERR_TYPE_L) + { + errorType = FLASH_ECC_ERR; + } + else + { + errorType = FLASH_DATA_ERR; + } + + return(errorType); +} + +//***************************************************************************** +// +//! Gets the error type of the upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error type of the upper 64-bits. The error type +//! can be FLASH_ECC_ERR or FLASH_DATA_ERR. +//! +//! \return Returns the type of the upper 64-bit error. +// +//***************************************************************************** +static inline Flash_ErrorType +Flash_getHighErrorType(uint32_t eccBase) +{ + Flash_ErrorType errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Check which error type. + // If bit is 1 then ECC error, else it is a Data error. + // + if((HWREG(eccBase + FLASH_O_ERR_POS) & FLASH_ERR_POS_ERR_TYPE_H) + == FLASH_ERR_POS_ERR_TYPE_H) + { + errorType = FLASH_ECC_ERR; + } + else + { + errorType = FLASH_DATA_ERR; + } + + return(errorType); +} +//***************************************************************************** +// +//! Clears the errors status of the lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param errorStatus is the error status to clear. errorStatus is a uint16_t. +//! errorStatus is a bitwise OR of the following value: +//! +//! - \b FLASH_FAIL_0_CLR +//! - \b FLASH_FAIL_1_CLR +//! - \b FLASH_UNC_ERR_CLR +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearLowErrorStatus(uint32_t eccBase, uint16_t errorStatus) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT( errorStatus <= 7U ); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_STATUS_CLR) |= ((uint32_t)errorStatus); + EDIS; +} + +//***************************************************************************** +// +//! Clears the errors status of the upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param errorStatus is the error status to clear. errorStatus is a uint16_t. +//! errorStatus is a bitwise OR of the following value: +//! +//! - \b FLASH_FAIL_0_CLR +//! - \b FLASH_FAIL_1_CLR +//! - \b FLASH_UNC_ERR_CLR +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearHighErrorStatus(uint32_t eccBase, uint16_t errorStatus) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT( errorStatus <= 7U ); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_STATUS_CLR) |= ((uint32_t)errorStatus << 16U); + EDIS; +} + +//***************************************************************************** +// +//! Gets the single bit error count. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the single bit error count. +// +//***************************************************************************** +static inline uint32_t +Flash_getErrorCount(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_ERR_CNT) & + (uint32_t)FLASH_ERR_CNT_ERR_CNT_M); +} + +//***************************************************************************** +// +//! Sets the single bit error threshold. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param threshold is the single bit error threshold. Valid ranges are from +//! 0-65535. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setErrorThreshold(uint32_t eccBase, uint16_t threshold) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_THRESHOLD) = ((uint32_t)threshold & + (uint32_t)FLASH_ERR_THRESHOLD_ERR_THRESHOLD_M); + EDIS; +} + +//***************************************************************************** +// +//! Gets the error interrupt. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the type of error interrupt that occurred. The +//! values can be used with +//! - \b FLASH_NO_ERROR +//! - \b FLASH_SINGLE_ERROR +//! - \b FLASH_UNC_ERROR +//! +//! \return Returns the interrupt flag. +// +//***************************************************************************** +static inline uint32_t +Flash_getInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read which type of error occurred. + // + return((HWREG(eccBase + FLASH_O_ERR_INTFLG) & (uint32_t)0x3U)); +} + +//***************************************************************************** +// +//! Clears the single error interrupt flag. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearSingleErrorInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_INTCLR) |= + FLASH_ERR_INTCLR_SINGLE_ERR_INTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Clears the uncorrectable error interrupt flag. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearUncorrectableInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_INTCLR) |= + FLASH_ERR_INTCLR_UNC_ERR_INTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Sets the Data Low Test register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param data is a 32-bit value that is the low double word of selected +//! 64-bit data +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setDataLowECCTest(uint32_t eccBase, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FDATAL_TEST) = data; + EDIS; +} + +//***************************************************************************** +// +//! Sets the Data High Test register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param data is a 32-bit value that is the high double word of selected +//! 64-bit data +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setDataHighECCTest(uint32_t eccBase, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FDATAH_TEST) = data; + EDIS; +} + +//***************************************************************************** +// +//! Sets the test address register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param address is a 32-bit value containing an address. Bits 21-3 will be +//! used as the flash word (128-bit) address. +//! +//! This function left shifts the address 1 bit to convert it to a byte address +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setECCTestAddress(uint32_t eccBase, uint32_t address) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Left shift the address 1 bit to make it byte-addressable + // + uint32_t byteAddress = address << 1; + + EALLOW; + + // + // Write bits 21-3 to the register. + // + HWREG(eccBase + FLASH_O_FADDR_TEST) = byteAddress; + + EDIS; + +} + +//***************************************************************************** +// +//! Sets the ECC test bits for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param ecc is a 32-bit value. The least significant 8 bits are used as +//! the ECC Control Bits in the ECC Test. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setECCTestECCBits(uint32_t eccBase, uint16_t ecc) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + ASSERT( ecc <= 255U ); + EALLOW; + + // + // Write the 8 ECC Control Bits. + // + HWREG(eccBase + FLASH_O_FECC_TEST) = + ((uint32_t)ecc & (uint32_t)FLASH_FECC_TEST_ECC_M); + EDIS; +} + +//***************************************************************************** +// +//! Enables ECC Test mode. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_enableECCTestMode(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_ECC_TEST_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables ECC Test mode. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_disableECCTestMode(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) &= + ~(uint32_t)FLASH_FECC_CTRL_ECC_TEST_EN; + EDIS; +} + +//***************************************************************************** +// +//! Selects the ECC block on bits [63:0] of bank data. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_selectLowECCBlock(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) &= + ~(uint32_t)FLASH_FECC_CTRL_ECC_SELECT; + EDIS; +} + +//***************************************************************************** +// +//! Selects the ECC block on bits [127:64] of bank data. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_selectHighECCBlock(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_ECC_SELECT; + EDIS; +} + +//***************************************************************************** +// +//! Performs the ECC calculation on the test block. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_performECCCalculation(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_DO_ECC_CALC; + EDIS; +} + +//***************************************************************************** +// +//! Gets the ECC Test data out high 63:32 bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC TEst data out High. +// +//***************************************************************************** +static inline uint32_t +Flash_getTestDataOutHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_FOUTH_TEST)); +} + +//***************************************************************************** +// +//! Gets the ECC Test data out low 31:0 bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC Test data out Low. +// +//***************************************************************************** +static inline uint32_t +Flash_getTestDataOutLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_FOUTL_TEST)); +} + +//***************************************************************************** +// +//! Gets the ECC Test status. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the ECC test status. The values can be used with +//! - \b FLASH_NO_ERROR +//! - \b FLASH_SINGLE_ERROR +//! - \b FLASH_UNC_ERROR +//! +//! \return Returns the ECC test status. +// +//***************************************************************************** +static inline uint32_t +Flash_getECCTestStatus(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read which type of error occurred. + // + return((HWREG(eccBase + FLASH_O_FECC_STATUS)) & (uint32_t)0x3U); +} + +//***************************************************************************** +// +//! Gets the ECC Test single bit error position. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC Test single bit error position. If the error type +//! is check bits than the position can range from 0 to 7. If the error type +//! is data bits than the position can range from 0 to 63. +// +//***************************************************************************** +static inline uint32_t +Flash_getECCTestErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read the position bits and shift it to the right. + // + return((HWREG(eccBase + FLASH_O_FECC_STATUS) & + (uint32_t)FLASH_FECC_STATUS_DATA_ERR_POS_M) >> + FLASH_FECC_STATUS_DATA_ERR_POS_S); +} + +//***************************************************************************** +// +//! Gets the single bit error type. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the single bit error type as a +//! Flash_SingleBitErrorIndicator. FLASH_DATA_BITS and FLASH_CHECK_BITS +//! indicate where the single bit error occurred. +// +//***************************************************************************** +static inline Flash_SingleBitErrorIndicator +Flash_getECCTestSingleBitErrorType(uint32_t eccBase) +{ + uint32_t errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read the ERR_TYPE bit to see where the single bit error was. + // + errorType = ((HWREG(eccBase + FLASH_O_FECC_STATUS) & + (uint32_t)FLASH_FECC_STATUS_ERR_TYPE) >> 8U); + return((Flash_SingleBitErrorIndicator)errorType); +} + +//***************************************************************************** +// +//! Claim the flash pump semaphore. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! \param wrapper is the Flash_PumpOwnership wrapper claiming the pump +//! semaphore. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_claimPumpSemaphore(uint32_t pumpSemBase, Flash_PumpOwnership wrapper) +{ + // + // Check the arguments. + // + ASSERT(Flash_isPumpSemBaseValid(pumpSemBase)); + + // + // Block until the pump semaphore is claimed. + // + EALLOW; + while((HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) + & FLASH_PUMPREQUEST_PUMP_OWNERSHIP_M) != wrapper) + { + HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) = + FLASH_PUMP_KEY | (uint32_t)wrapper; + } + EDIS; +} + +//***************************************************************************** +// +//! Release the flash pump semaphore. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_releasePumpSemaphore(uint32_t pumpSemBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isPumpSemBaseValid(pumpSemBase)); + + // + // Relinquish the pump semaphore. + // + EALLOW; + HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) = FLASH_PUMP_KEY; + EDIS; +} + +//***************************************************************************** +// +//! Initializes the flash control registers. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param waitstates is the wait-state value. +//! +//! This function initializes the flash control registers. At reset bank and +//! pump are in sleep. A flash access will power up the bank and pump +//! automatically. This function will power up Flash bank and pump and set the +//! fallback mode of flash and pump as active. +//! +//! This function also sets the number of wait-states for a flash access +//! (see Flash_setWaitstates() for more details), and enables cache, the +//! prefetch mechanism, and ECC. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates); + + +//***************************************************************************** +// +//! Powers down the flash. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function powers down the flash bank(s) and the flash pump. +//! +//! Note: For this device, you must claim the flash pump semaphore before +//! calling this function and powering down the pump. Afterwards, you may want +//! to relinquish the flash pump. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_powerDown(uint32_t ctrlBase); + +//***************************************************************************** +// +//! Wakes the flash from low power mode. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function will power up Flash bank and pump and set the +//! fallback mode of flash and pump as active. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_wakeFromLPM(uint32_t ctrlBase); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** +#endif // #ifdef __TMS320C28XX_CLA__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // FLASH_H diff --git a/gpio_bitfield_cpu2/device/driverlib/gpio.c b/gpio_bitfield_cpu2/device/driverlib/gpio.c new file mode 100644 index 0000000..be20285 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/gpio.c @@ -0,0 +1,489 @@ +//########################################################################### +// +// FILE: gpio.c +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "gpio.h" + +//***************************************************************************** +// +// GPIO_setDirectionMode +// +//***************************************************************************** +void +GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + EALLOW; + + // + // Set the data direction + // + if(pinIO == GPIO_DIR_MODE_OUT) + { + // + // Output + // + gpioBaseAddr[GPIO_GPxDIR_INDEX] |= pinMask; + } + else + { + // + // Input + // + gpioBaseAddr[GPIO_GPxDIR_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getDirectionMode +// +//***************************************************************************** +GPIO_Direction +GPIO_getDirectionMode(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + return((GPIO_Direction)((uint32_t)((gpioBaseAddr[GPIO_GPxDIR_INDEX] >> + (pin % 32U)) & 1U))); + +} + +//***************************************************************************** +// +// GPIO_setInterruptPin +// +//***************************************************************************** +void +GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum) +{ + XBAR_InputNum input; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + // + // Pick the X-BAR input that corresponds to the requested XINT. + // + switch(extIntNum) + { + case GPIO_INT_XINT1: + input = XBAR_INPUT4; + break; + + case GPIO_INT_XINT2: + input = XBAR_INPUT5; + break; + + case GPIO_INT_XINT3: + input = XBAR_INPUT6; + break; + + case GPIO_INT_XINT4: + input = XBAR_INPUT13; + break; + + case GPIO_INT_XINT5: + input = XBAR_INPUT14; + break; + + default: + // + // Invalid interrupt. Shouldn't happen if enum value is used. + // XBAR_INPUT1 isn't tied to an XINT, so we'll use it to check for + // a bad value. + // + input = XBAR_INPUT1; + break; + } + + if(input != XBAR_INPUT1) + { + XBAR_setInputPin(input, (uint16_t)pin); + } +} + +//***************************************************************************** +// +// GPIO_setPadConfig +// +//***************************************************************************** +void +GPIO_setPadConfig(uint32_t pin, uint32_t pinType) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + EALLOW; + + // + // Enable open drain if necessary + // + if((pinType & GPIO_PIN_TYPE_OD) != 0U) + { + gpioBaseAddr[GPIO_GPxODR_INDEX] |= pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxODR_INDEX] &= ~pinMask; + } + + // + // Enable pull-up if necessary + // + if((pinType & GPIO_PIN_TYPE_PULLUP) != 0U) + { + gpioBaseAddr[GPIO_GPxPUD_INDEX] &= ~pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxPUD_INDEX] |= pinMask; + } + + // + // Invert polarity if necessary + // + if((pinType & GPIO_PIN_TYPE_INVERT) != 0U) + { + gpioBaseAddr[GPIO_GPxINV_INDEX] |= pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxINV_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getPadConfig +// +//***************************************************************************** +uint32_t +GPIO_getPadConfig(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + uint32_t pinTypeRes; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + pinTypeRes = GPIO_PIN_TYPE_STD; + + // + // Get open drain value + // + if((gpioBaseAddr[GPIO_GPxODR_INDEX] & pinMask) != 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_OD; + } + + // + // Get pull-up value + // + if((gpioBaseAddr[GPIO_GPxPUD_INDEX] & pinMask) == 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_PULLUP; + } + + // + // Get polarity value + // + if((gpioBaseAddr[GPIO_GPxINV_INDEX] & pinMask) != 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_INVERT; + } + + return(pinTypeRes); +} + +//***************************************************************************** +// +// GPIO_setQualificationMode +// +//***************************************************************************** +void +GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t qSelIndex; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPAQSEL1_GPIO1_S * (pin % 16U); + qSelIndex = GPIO_GPxQSEL_INDEX + ((pin % 32U) / 16U); + + // + // Write the input qualification mode to the register. + // + EALLOW; + + gpioBaseAddr[qSelIndex] &= ~((uint32_t)GPIO_GPAQSEL1_GPIO0_M << shiftAmt); + gpioBaseAddr[qSelIndex] |= (uint32_t)qualification << shiftAmt; + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getQualificationMode +// +//***************************************************************************** +GPIO_QualificationMode +GPIO_getQualificationMode(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t qSelIndex; + uint32_t qualRes; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPAQSEL1_GPIO1_S * (pin % 16U); + qSelIndex = GPIO_GPxQSEL_INDEX + ((pin % 32U) / 16U); + + // + // Read the qualification mode register and shift and mask to get the + // value for the specified pin. + // + qualRes = (gpioBaseAddr[qSelIndex] >> shiftAmt) & + (uint32_t)GPIO_GPAQSEL1_GPIO0_M; + return((GPIO_QualificationMode)qualRes); +} + +//***************************************************************************** +// +// GPIO_setQualificationPeriod +// +//***************************************************************************** +void +GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask, regVal, shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + ASSERT((divider >= 1U) && (divider <= 510U)); + + shiftAmt = (pin % 32U) & ~((uint32_t)0x7U); + pinMask = (uint32_t)0xFFU << shiftAmt; + + // + // Divide divider by two to get the value that needs to go into the field. + // Then shift it into the right place. + // + regVal = (divider / 2U) << shiftAmt; + + // + // Write the divider parameter into the register. + // + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioBaseAddr[GPIO_GPxCTRL_INDEX] &= ~pinMask; + gpioBaseAddr[GPIO_GPxCTRL_INDEX] |= regVal; + EDIS; +} + +//***************************************************************************** +// +// GPIO_setControllerCore +// +//***************************************************************************** +void +GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t cSelIndex; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPACSEL1_GPIO1_S * (pin % 8U); + cSelIndex = GPIO_GPxCSEL_INDEX + ((pin % 32U) / 8U); + + // + // Write the core parameter into the register. + // + EALLOW; + gpioBaseAddr[cSelIndex] &= ~((uint32_t)GPIO_GPACSEL1_GPIO0_M << shiftAmt); + gpioBaseAddr[cSelIndex] |= (uint32_t)core << shiftAmt; + EDIS; +} + +//***************************************************************************** +// +// GPIO_setAnalogMode +// +//***************************************************************************** +void +GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT((pin == 42U) || (pin == 43U)); + + pinMask = (uint32_t)1U << (pin % 32U); + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + EALLOW; + + // + // Set the analog mode selection. + // + if(mode == GPIO_ANALOG_ENABLED) + { + // + // Enable analog mode + // + gpioBaseAddr[GPIO_GPxAMSEL_INDEX] |= pinMask; + } + else + { + // + // Disable analog mode + // + gpioBaseAddr[GPIO_GPxAMSEL_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_setPinConfig +// +//***************************************************************************** +void +GPIO_setPinConfig(uint32_t pinConfig) +{ + uint32_t muxRegAddr; + uint32_t pinMask, shiftAmt; + + muxRegAddr = (uint32_t)GPIOCTRL_BASE + (pinConfig >> 16); + shiftAmt = ((pinConfig >> 8) & (uint32_t)0xFFU); + pinMask = (uint32_t)0x3U << shiftAmt; + + EALLOW; + + // + // Clear fields in MUX register first to avoid glitches + // + HWREG(muxRegAddr) &= ~pinMask; + + // + // Write value into GMUX register + // + HWREG(muxRegAddr + GPIO_MUX_TO_GMUX) = + (HWREG(muxRegAddr + GPIO_MUX_TO_GMUX) & ~pinMask) | + (((pinConfig >> 2) & (uint32_t)0x3U) << shiftAmt); + + // + // Write value into MUX register + // + HWREG(muxRegAddr) |= ((pinConfig & (uint32_t)0x3U) << shiftAmt); + EDIS; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/gpio.h b/gpio_bitfield_cpu2/device/driverlib/gpio.h new file mode 100644 index 0000000..05ae80a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/gpio.h @@ -0,0 +1,1047 @@ +//########################################################################### +// +// FILE: gpio.h +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef GPIO_H +#define GPIO_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup gpio_api GPIO +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_xint.h" +#include "cpu.h" +#include "xbar.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions to access gpio registers. +// Not intended for use by application code. +// +// Divide by 2 is for C28x which has word access +// +//***************************************************************************** +#define GPIO_CTRL_REGS_STEP ((GPIO_O_GPBCTRL - GPIO_O_GPACTRL) / 2U) +#define GPIO_DATA_REGS_STEP ((GPIO_O_GPBDAT - GPIO_O_GPADAT) / 2U) + +#define GPIO_GPxCTRL_INDEX (GPIO_O_GPACTRL / 2U) +#define GPIO_GPxQSEL_INDEX (GPIO_O_GPAQSEL1 / 2U) +#define GPIO_GPxMUX_INDEX (GPIO_O_GPAMUX1 / 2U) +#define GPIO_GPxDIR_INDEX (GPIO_O_GPADIR / 2U) +#define GPIO_GPxAMSEL_INDEX (0x00000014U / 2U) // Address rsvd for GPAAMSEL +#define GPIO_GPxPUD_INDEX (GPIO_O_GPAPUD / 2U) +#define GPIO_GPxINV_INDEX (GPIO_O_GPAINV / 2U) +#define GPIO_GPxODR_INDEX (GPIO_O_GPAODR / 2U) +#define GPIO_GPxGMUX_INDEX (GPIO_O_GPAGMUX1 / 2U) +#define GPIO_GPxCSEL_INDEX (GPIO_O_GPACSEL1 / 2U) +#define GPIO_GPxLOCK_INDEX (GPIO_O_GPALOCK / 2U) +#define GPIO_GPxCR_INDEX (GPIO_O_GPACR / 2U) + +#define GPIO_GPxDAT_INDEX (GPIO_O_GPADAT / 2U) +#define GPIO_GPxSET_INDEX (GPIO_O_GPASET / 2U) +#define GPIO_GPxCLEAR_INDEX (GPIO_O_GPACLEAR / 2U) +#define GPIO_GPxTOGGLE_INDEX (GPIO_O_GPATOGGLE / 2U) + +#define GPIO_MUX_TO_GMUX (GPIO_O_GPAGMUX1 - GPIO_O_GPAMUX1) + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to GPIO_setPadConfig() as the pinType parameter +// and returned by GPIO_getPadConfig(). +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x0000U //!< Push-pull output or floating input +#define GPIO_PIN_TYPE_PULLUP 0x0001U //!< Pull-up enable for input +#define GPIO_PIN_TYPE_INVERT 0x0002U //!< Invert polarity on input +#define GPIO_PIN_TYPE_OD 0x0004U //!< Open-drain on output +#endif + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setDirectionMode() as the \e pinIO +//! parameter and returned from GPIO_getDirectionMode(). +// +//***************************************************************************** +typedef enum +{ + GPIO_DIR_MODE_IN, //!< Pin is a GPIO input + GPIO_DIR_MODE_OUT //!< Pin is a GPIO output +} GPIO_Direction; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setInterruptType() as the \e intType +//! parameter and returned from GPIO_getInterruptType(). +// +//***************************************************************************** +typedef enum +{ + GPIO_INT_TYPE_FALLING_EDGE = 0x00, //!< Interrupt on falling edge + GPIO_INT_TYPE_RISING_EDGE = 0x04, //!< Interrupt on rising edge + GPIO_INT_TYPE_BOTH_EDGES = 0x0C //!< Interrupt on both edges +} GPIO_IntType; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setQualificationMode() as the +//! \e qualification parameter and returned by GPIO_getQualificationMode(). +// +//***************************************************************************** +typedef enum +{ + GPIO_QUAL_SYNC, //!< Synchronization to SYSCLK + GPIO_QUAL_3SAMPLE, //!< Qualified with 3 samples + GPIO_QUAL_6SAMPLE, //!< Qualified with 6 samples + GPIO_QUAL_ASYNC //!< No synchronization +} GPIO_QualificationMode; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setAnalogMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_ANALOG_DISABLED, //!< Pin is in digital mode + GPIO_ANALOG_ENABLED //!< Pin is in analog mode +} GPIO_AnalogMode; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setControllerCore() as the \e core +//! parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_CORE_CPU1, //!< CPU1 selected as controller core + GPIO_CORE_CPU1_CLA1, //!< CPU1's CLA1 selected as controller core + GPIO_CORE_CPU2, //!< CPU2 selected as controller core + GPIO_CORE_CPU2_CLA1 //!< CPU2's CLA1 selected as controller core +} GPIO_CoreSelect; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_readPortData(), GPIO_setPortPins(), +//! GPIO_clearPortPins(), and GPIO_togglePortPins() as the \e port parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_PORT_A = 0, //!< GPIO port A + GPIO_PORT_B = 1, //!< GPIO port B + GPIO_PORT_C = 2, //!< GPIO port C + GPIO_PORT_D = 3, //!< GPIO port D + GPIO_PORT_E = 4, //!< GPIO port E + GPIO_PORT_F = 5 //!< GPIO port F +} GPIO_Port; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setInterruptPin(), +//! GPIO_setInterruptType(), GPIO_getInterruptType(), GPIO_enableInterrupt(), +//! GPIO_disableInterrupt(), as the \e extIntNum parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_INT_XINT1, //!< External Interrupt 1 + GPIO_INT_XINT2, //!< External Interrupt 2 + GPIO_INT_XINT3, //!< External Interrupt 3 + GPIO_INT_XINT4, //!< External Interrupt 4 + GPIO_INT_XINT5 //!< External Interrupt 5 +} GPIO_ExternalIntNum; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks that a pin number is valid for a device. +//! +//! Note that this function reflects the highest possible GPIO number of a +//! device on its biggest package. Check the datasheet to see what the actual +//! range of valid pin numbers is for a specific package. +//! +//! \return None. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +GPIO_isPinValid(uint32_t pin) +{ + return(pin <= 168U); +} +#endif + +//***************************************************************************** +// +//! Sets the interrupt type for the specified pin. +//! +//! \param extIntNum specifies the external interrupt. +//! \param intType specifies the type of interrupt trigger mechanism. +//! +//! This function sets up the various interrupt trigger mechanisms for the +//! specified pin on the selected GPIO port. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! One of the following flags can be used to define the \e intType +//! parameter: +//! +//! - \b GPIO_INT_TYPE_FALLING_EDGE sets detection to edge and trigger to +//! falling +//! - \b GPIO_INT_TYPE_RISING_EDGE sets detection to edge and trigger to rising +//! - \b GPIO_INT_TYPE_BOTH_EDGES sets detection to both edges +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_setInterruptType(GPIO_ExternalIntNum extIntNum, GPIO_IntType intType) +{ + // + // Write the selected polarity to the appropriate register. + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) = + (HWREGH(XINT_BASE + (uint16_t)extIntNum) & ~XINT_1CR_POLARITY_M) | + (uint16_t)intType; +} + +//***************************************************************************** +// +//! Gets the interrupt type for a pin. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function gets the interrupt type for a interrupt. The interrupt can be +//! configured as a falling-edge, rising-edge, or both-edges detected +//! interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return Returns one of the flags described for GPIO_setInterruptType(). +// +//***************************************************************************** +static inline GPIO_IntType +GPIO_getInterruptType(GPIO_ExternalIntNum extIntNum) +{ + // + // Read the selected polarity from the appropriate register. + // + return((GPIO_IntType)((uint16_t)(HWREGH(XINT_BASE + (uint16_t)extIntNum) & + XINT_1CR_POLARITY_M))); +} + +//***************************************************************************** +// +//! Enables the specified external interrupt. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function enables the indicated external interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_enableInterrupt(GPIO_ExternalIntNum extIntNum) +{ + // + // Set the enable bit for the specified interrupt. + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) |= XINT_1CR_ENABLE; +} + +//***************************************************************************** +// +//! Disables the specified external interrupt. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function disables the indicated external interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_disableInterrupt(GPIO_ExternalIntNum extIntNum) +{ + // + // Clear the enable bit for the specified interrupt + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) &= ~XINT_1CR_ENABLE; +} + +//***************************************************************************** +// +//! Gets the value of the external interrupt counter. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! +//! \b Note: The counter is clocked at the SYSCLKOUT rate. +//! +//! \return Returns external interrupt counter value. +// +//***************************************************************************** +static inline uint16_t +GPIO_getInterruptCounter(GPIO_ExternalIntNum extIntNum) +{ + ASSERT(extIntNum <= GPIO_INT_XINT3); + + // + // Read the counter value from the appropriate register. + // + return((HWREGH(XINT_BASE + XINT_O_1CTR + (uint16_t)extIntNum))); +} + +//***************************************************************************** +// +//! Reads the value present on the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! The value at the specified pin are read, as specified by \e pin. The value +//! is returned for both input and output pins. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return Returns the value in the data register for the specified pin. +// +//***************************************************************************** +static inline uint32_t +GPIO_readPin(uint32_t pin) +{ + volatile uint32_t *gpioDataReg; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + return((gpioDataReg[GPIO_GPxDAT_INDEX] >> (pin % 32U)) & (uint32_t)0x1U); +} + + +//***************************************************************************** +// +//! Writes a value to the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param outVal is the value to write to the pin. +//! +//! Writes the corresponding bit values to the output pin specified by +//! \e pin. Writing to a pin configured as an input pin has no effect. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_writePin(uint32_t pin, uint32_t outVal) +{ + volatile uint32_t *gpioDataReg; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + pinMask = (uint32_t)1U << (pin % 32U); + + if(outVal == 0U) + { + gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask; + } + else + { + gpioDataReg[GPIO_GPxSET_INDEX] = pinMask; + } +} + +//***************************************************************************** +// +//! Toggles the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! Writes the corresponding bit values to the output pin specified by +//! \e pin. Writing to a pin configured as an input pin has no effect. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_togglePin(uint32_t pin) +{ + volatile uint32_t *gpioDataReg; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U); +} + +//***************************************************************************** +// +//! Reads the data on the specified port. +//! +//! \param port is the GPIO port being accessed in the form of \b GPIO_PORT_X +//! where X is the port letter. +//! +//! \return Returns the value available on pin for the specified port. Each +//! bit of the the return value represents a pin on the port, where bit 0 +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, and so on. +// +//***************************************************************************** +static inline uint32_t +GPIO_readPortData(GPIO_Port port) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and return DATA. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + return(gpioDataReg[GPIO_GPxDAT_INDEX]); +} + + +//***************************************************************************** +// +//! Writes a value to the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param outVal is the value to write to the port. +//! +//! This function writes the value \e outVal to the port specified by the +//! \e port parameter which takes a value in the form of \b GPIO_PORT_X where X +//! is the port letter. For example, use \b GPIO_PORT_A to affect port A +//! (GPIOs 0-31). +//! +//! The \e outVal is a bit-packed value, where each bit represents a bit on a +//! GPIO port. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO port +//! pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_writePortData(GPIO_Port port, uint32_t outVal) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to DATA. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxDAT_INDEX] = outVal; +} + +//***************************************************************************** +// +//! Sets all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function sets all of the pins specified by the \e pinMask parameter on +//! the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be set. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO +//! port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_setPortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to SET. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxSET_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Clears all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function clears all of the pins specified by the \e pinMask parameter +//! on the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is \b set +//! identifies the pin to be cleared. Bit 0 represents GPIO port pin 0, bit 1 +//! represents GPIO port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_clearPortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to CLEAR. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Toggles all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function toggles all of the pins specified by the \e pinMask parameter +//! on the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be toggled. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_togglePortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to TOGGLE. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxTOGGLE_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Locks the configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function locks the configuration registers of the pins specified by +//! the \e pinMask parameter on the port specified by the \e port parameter +//! which takes a value in the form of \b GPIO_PORT_X where X is the port +//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! Note that this function is for locking the configuration of a pin such as +//! the pin muxing, direction, open drain mode, and other settings. It does not +//! affect the ability to change the value of the pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_lockPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxLOCK_INDEX] |= pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Unlocks the configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function unlocks the configuration registers of the pins specified by +//! the \e pinMask parameter on the port specified by the \e port parameter +//! which takes a value in the form of \b GPIO_PORT_X where X is the port +//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be unlocked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_unlockPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxLOCK_INDEX] &= ~pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Commits the lock configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function commits the lock configuration registers of the pins +//! specified by the \e pinMask parameter on the port specified by the \e port +//! parameter which takes a value in the form of \b GPIO_PORT_X where X is the +//! port letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! Note that once this function is called, GPIO_lockPortConfig() and +//! GPIO_unlockPortConfig() will no longer have any effect on the specified +//! pins. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_commitPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxCR_INDEX] |= pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Sets the direction and mode of the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param pinIO is the pin direction mode. +//! +//! This function configures the specified pin on the selected GPIO port as +//! either input or output. +//! +//! The parameter \e pinIO is an enumerated data type that can be one of the +//! following values: +//! +//! - \b GPIO_DIR_MODE_IN +//! - \b GPIO_DIR_MODE_OUT +//! +//! where \b GPIO_DIR_MODE_IN specifies that the pin is programmed as an input +//! and \b GPIO_DIR_MODE_OUT specifies that the pin is programmed as an output. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO); + +//***************************************************************************** +// +//! Gets the direction mode of a pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! This function gets the direction mode for a specified pin. The pin can be +//! configured as either an input or output The type of direction is returned +//! as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIO_setDirectionMode(). +// +//***************************************************************************** +extern GPIO_Direction +GPIO_getDirectionMode(uint32_t pin); + +//***************************************************************************** +// +//! Sets the pin for the specified external interrupt. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param extIntNum specifies the external interrupt. +//! +//! This function sets which pin triggers the selected external interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \sa XBAR_setInputPin() +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum); + +//***************************************************************************** +// +//! Sets the pad configuration for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param pinType specifies the pin type. +//! +//! This function sets the pin type for the specified pin. The parameter +//! \e pinType can be the following values: +//! +//! - \b GPIO_PIN_TYPE_STD specifies a push-pull output or a floating input +//! - \b GPIO_PIN_TYPE_PULLUP specifies the pull-up is enabled for an input +//! - \b GPIO_PIN_TYPE_OD specifies an open-drain output pin +//! - \b GPIO_PIN_TYPE_INVERT specifies inverted polarity on an input +//! +//! \b GPIO_PIN_TYPE_INVERT may be OR-ed with \b GPIO_PIN_TYPE_STD or +//! \b GPIO_PIN_TYPE_PULLUP. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setPadConfig(uint32_t pin, uint32_t pinType); + +//***************************************************************************** +// +//! Gets the pad configuration for a pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! This function returns the pin type for the specified pin. The value +//! returned corresponds to the values used in GPIO_setPadConfig(). +//! +//! \return Returns a bit field of the values \b GPIO_PIN_TYPE_STD, +//! \b GPIO_PIN_TYPE_PULLUP, \b GPIO_PIN_TYPE_OD, and \b GPIO_PIN_TYPE_INVERT. +// +//***************************************************************************** +extern uint32_t +GPIO_getPadConfig(uint32_t pin); + +//***************************************************************************** +// +//! Sets the qualification mode for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param qualification specifies the qualification mode of the pin. +//! +//! This function sets the qualification mode for the specified pin. The +//! parameter \e qualification can be one of the following values: +//! - \b GPIO_QUAL_SYNC +//! - \b GPIO_QUAL_3SAMPLE +//! - \b GPIO_QUAL_6SAMPLE +//! - \b GPIO_QUAL_ASYNC +//! +//! To set the qualification sampling period, use +//! GPIO_setQualificationPeriod(). +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification); + +//***************************************************************************** +// +//! Gets the qualification type for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! \return Returns the qualification mode in the form of one of the values +//! \b GPIO_QUAL_SYNC, \b GPIO_QUAL_3SAMPLE, \b GPIO_QUAL_6SAMPLE, or +//! \b GPIO_QUAL_ASYNC. +// +//***************************************************************************** +extern GPIO_QualificationMode +GPIO_getQualificationMode(uint32_t pin); + +//***************************************************************************** +// +//! Sets the qualification period for a set of pins +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param divider specifies the output drive strength. +//! +//! This function sets the qualification period for a set of \b 8 \b pins, +//! specified by the \e pin parameter. For instance, passing in 3 as the value +//! of \e pin will set the qualification period for GPIO0 through GPIO7, and a +//! value of 98 will set the qualification period for GPIO96 through GPIO103. +//! This is because the register field that configures the divider is shared. +//! +//! To think of this in terms of an equation, configuring \e pin as \b n will +//! configure GPIO (n & ~(7)) through GPIO ((n & ~(7)) + 7). +//! +//! \e divider is the value by which the frequency of SYSCLKOUT is divided. It +//! can be 1 or an even value between 2 and 510 inclusive. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider); + +//***************************************************************************** +// +//! Selects the controller core of a specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param core is the core that is controller of the specified pin. +//! +//! This function configures which core owns the specified pin's data registers +//! (DATA, SET, CLEAR, and TOGGLE). The \e core parameter is an enumerated data +//! type that specifies the core, such as \b GPIO_CORE_CPU1_CLA1 to make CPU1's +//! CLA1 controller of the pin. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core); + +//***************************************************************************** +// +//! Sets the analog mode of the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param mode is the selected analog mode. +//! +//! This function configures the specified pin for either analog or digital +//! mode. Not all GPIO pins have the ability to be switched to analog mode, +//! so refer to the technical reference manual for details. This setting should +//! be thought of as another level of muxing. +//! +//! The parameter \e mode is an enumerated data type that can be one of the +//! following values: +//! +//! - \b GPIO_ANALOG_DISABLED - Pin is in digital mode +//! - \b GPIO_ANALOG_ENABLED - Pin is in analog mode +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \b Note: The pin parameter is applicable for both AIO and GPIO because +//! the GPAxMSEL.GPIOy register configures for both +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode); + +//***************************************************************************** +// +//! Configures the alternate function of a GPIO pin. +//! +//! \param pinConfig is the pin configuration value, specified as only one +//! of the \b GPIO_#_???? values. +//! +//! This function configures the pin mux that selects the peripheral function +//! associated with a particular GPIO pin. Only one peripheral function at a +//! time can be associated with a GPIO pin, and each peripheral function should +//! only be associated with a single GPIO pin at a time (despite the fact that +//! many of them can be associated with more than one GPIO pin). +//! +//! The available mappings are supplied in pin_map.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setPinConfig(uint32_t pinConfig); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // GPIO_H diff --git a/gpio_bitfield_cpu2/device/driverlib/hrpwm.c b/gpio_bitfield_cpu2/device/driverlib/hrpwm.c new file mode 100644 index 0000000..04aa22c --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/hrpwm.c @@ -0,0 +1,47 @@ +//########################################################################### +// +// FILE: hrpwm.c +// +// TITLE: C28x HRPWM driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "hrpwm.h" + +// +// All the API functions are in-lined in hrpwm.h +// diff --git a/gpio_bitfield_cpu2/device/driverlib/hrpwm.h b/gpio_bitfield_cpu2/device/driverlib/hrpwm.h new file mode 100644 index 0000000..2561d67 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/hrpwm.h @@ -0,0 +1,1657 @@ +//############################################################################# +// +// FILE: hrpwm.h +// +// TITLE: C28x HRPWM Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef HRPWM_H +#define HRPWM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup hrpwm_api HRPWM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_hrpwm.h" +#include "cpu.h" +#include "debug.h" +#include "epwm.h" +#include "hrpwm.h" + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setMEPEdgeSelect(), +//! HRPWM_setMEPControlMode(), HRPWM_setCounterCompareShadowLoadEvent() +//! as the \e channel parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_CHANNEL_A = 0, //!< HRPWM A + HRPWM_CHANNEL_B = 8 //!< HRPWM B +} HRPWM_Channel; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setMEPEdgeSelect() as the \e mepEdgeMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! HRPWM is disabled + HRPWM_MEP_CTRL_DISABLE = 0, + //! MEP controls rising edge + HRPWM_MEP_CTRL_RISING_EDGE = 1, + //! MEP controls falling edge + HRPWM_MEP_CTRL_FALLING_EDGE = 2, + //! MEP controls both rising and falling edge + HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE = 3 +} HRPWM_MEPEdgeMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setHRMEPCtrlMode() as the \e +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! CMPAHR/CMPBHR or TBPRDHR controls MEP edge + HRPWM_MEP_DUTY_PERIOD_CTRL = 0, + //! TBPHSHR controls MEP edge + HRPWM_MEP_PHASE_CTRL = 1 +} HRPWM_MEPCtrlMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setCounterCompareShadowLoadEvent(), +//! HRPWM_setRisingEdgeDelayLoadMode() and HRPWM_setFallingEdgeDelayLoadMode +//! as the \e loadEvent parameter. +// +//***************************************************************************** +typedef enum +{ + //! load when counter equals zero + HRPWM_LOAD_ON_CNTR_ZERO = 0, + //! load when counter equals period + HRPWM_LOAD_ON_CNTR_PERIOD = 1, + //! load when counter equals zero or period + HRPWM_LOAD_ON_CNTR_ZERO_PERIOD = 2, +} HRPWM_LoadMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setChannelBOutputPath() as the \e +//! outputOnB parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_OUTPUT_ON_B_NORMAL = 0, //!< ePWMxB output is normal. + HRPWM_OUTPUT_ON_B_INV_A = 1 //!< ePWMxB output is inverted + //!< version of ePWMxA signal +} HRPWM_ChannelBOutput; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setSyncPulseSource() as the \e +//! syncPulseSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Counter equals Period + HRPWM_PWMSYNC_SOURCE_PERIOD = 0, + //! Counter equals zero + HRPWM_PWMSYNC_SOURCE_ZERO = 1, + //! Counter equals COMPC when counting up + HRPWM_PWMSYNC_SOURCE_COMPC_UP = 4, + //! Counter equals COMPC when counting down + HRPWM_PWMSYNC_SOURCE_COMPC_DOWN = 5, + //! Counter equals COMPD when counting up + HRPWM_PWMSYNC_SOURCE_COMPD_UP = 6, + //! Counter equals COMPD when counting down + HRPWM_PWMSYNC_SOURCE_COMPD_DOWN = 7 +} HRPWM_SyncPulseSource; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setCounterCompareValue() as the \e +//! compModule parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_COUNTER_COMPARE_A = 0, //!< counter compare A + HRPWM_COUNTER_COMPARE_B = 4 //!< counter compare B +} HRPWM_CounterCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setDeadbandMEPEdgeSelect() as the \e +//! mepDBEdge. +// +//***************************************************************************** +typedef enum +{ + //! HRPWM is disabled + HRPWM_DB_MEP_CTRL_DISABLE = 0, + //! MEP controls Rising Edge Delay + HRPWM_DB_MEP_CTRL_RED = 1, + //! MEP controls Falling Edge Delay + HRPWM_DB_MEP_CTRL_FED = 2, + //! MEP controls both Falling and Rising edge delay + HRPWM_DB_MEP_CTRL_RED_FED = 3 +} HRPWM_MEPDeadBandEdgeMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_lockRegisters() as the \e registerGroup +//! parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_REGISTER_GROUP_HRPWM = 0x1, //!< HRPWM register group + HRPWM_REGISTER_GROUP_GLOBAL_LOAD = 0x2, //!< Global load register group + HRPWM_REGISTER_GROUP_TRIP_ZONE = 0x4, //!< Trip zone register group + HRPWM_REGISTER_GROUP_TRIP_ZONE_CLEAR = 0x8, //!< Trip zone clear group + HRPWM_REGISTER_GROUP_DIGITAL_COMPARE = 0x10 //!< Digital compare group +} HRPWM_LockRegisterGroup; + +//***************************************************************************** +// +// Functions APIs shared with ePWM module +// +//***************************************************************************** + +// +// Time Base Sub Module related APIs +// +#define HRPWM_setTimeBaseCounter EPWM_setTimeBaseCounter +#define HRPWM_setCountModeAfterSync EPWM_setCountModeAfterSync +#define HRPWM_setClockPrescaler EPWM_setClockPrescaler +#define HRPWM_swForceSyncPulse EPWM_forceSyncPulse +#define HRPWM_setSyncOutPulseMode EPWM_setSyncOutPulseMode +#define HRPWM_setPeriodLoadMode EPWM_setPeriodLoadMode +#define HRPWM_setTimeBaseCounterMode EPWM_setTimeBaseCounterMode +#define HRPWM_selectPeriodLoadEvent EPWM_selectPeriodLoadEvent +#define HRPWM_enableOneShotSync EPWM_enableOneShotSync +#define HRPWM_disableOneShotSync EPWM_disableOneShotSync +#define HRPWM_startOneShotSync EPWM_startOneShotSync +#define HRPWM_getTimeBaseCounterOverflowStatus \ + EPWM_getTimeBaseCounterOverflowStatus +#define HRPWM_clearTimeBaseCounterOverflowEvent \ + EPWM_clearTimeBaseCounterOverflowEvent +#define HRPWM_getSyncStatus EPWM_getSyncStatus +#define HRPWM_clearSyncEvent EPWM_clearSyncEvent +#define HRPWM_getTimeBaseCounterDirection EPWM_getTimeBaseCounterDirection +#define HRPWM_setupEPWMLinks EPWM_setupEPWMLinks +#define HRPWM_setCounterCompareShadowLoadMode \ + EPWM_setCounterCompareShadowLoadMode +#define HRPWM_disableCounterCompareShadowLoadMode \ + EPWM_disableCounterCompareShadowLoadMode +#define HRPWM_getCounterCompareShadowStatus \ + EPWM_getCounterCompareShadowStatus + +// +// Action Qualifier module related APIs +// +#define HRPWM_setActionQualifierShadowLoadMode \ + EPWM_setActionQualifierShadowLoadMode +#define HRPWM_disableActionQualifierShadowLoadMode \ + EPWM_disableActionQualifierShadowLoadMode +#define HRPWM_setActionQualifierT1TriggerSource \ + EPWM_setActionQualifierT1TriggerSource +#define HRPWM_setActionQualifierT2TriggerSource \ + EPWM_setActionQualifierT2TriggerSource +#define HRPWM_setActionQualifierAction EPWM_setActionQualifierAction +#define HRPWM_setActionQualifierContSWForceShadowMode \ + EPWM_setActionQualifierContSWForceShadowMode +#define HRPWM_setActionQualifierContSWForceAction \ + EPWM_setActionQualifierContSWForceAction +/* HRPWM_setActionQualifierSwAction is kept for compatibility, +use HRPWM_setActionQualifierSWAction*/ +#define HRPWM_setActionQualifierSwAction EPWM_setActionQualifierSwAction +#define HRPWM_setActionQualifierSWAction EPWM_setActionQualifierSWAction +/* HRPWM_forceActionQualifierSwAction is kept for compatibility, +use HRPWM_forceActionQualifierSWAction*/ +#define HRPWM_forceActionQualifierSwAction EPWM_forceActionQualifierSwAction +#define HRPWM_forceActionQualifierSWAction EPWM_forceActionQualifierSWAction +// +// Dead Band Module related APIs +// +#define HRPWM_setDeadBandOutputSwapMode EPWM_setDeadBandOutputSwapMode +#define HRPWM_setDeadBandDelayMode EPWM_setDeadBandDelayMode +#define HRPWM_setDeadBandDelayPolarity EPWM_setDeadBandDelayPolarity +#define HRPWM_setRisingEdgeDeadBandDelayInput \ + EPWM_setRisingEdgeDeadBandDelayInput +#define HRPWM_setFallingEdgeDeadBandDelayInput \ + EPWM_setFallingEdgeDeadBandDelayInput +#define HRPWM_setDeadBandControlShadowLoadMode \ + EPWM_setDeadBandControlShadowLoadMode +#define HRPWM_disableDeadBandControlShadowLoadMode \ + EPWM_disableDeadBandControlShadowLoadMode +#define HRPWM_setRisingEdgeDelayCountShadowLoadMode \ + EPWM_setRisingEdgeDelayCountShadowLoadMode +#define HRPWM_disableRisingEdgeDelayCountShadowLoadMode \ + EPWM_disableRisingEdgeDelayCountShadowLoadMode +#define HRPWM_setFallingEdgeDelayCountShadowLoadMode \ + EPWM_setFallingEdgeDelayCountShadowLoadMode +#define HRPWM_disableFallingEdgeDelayCountShadowLoadMode \ + EPWM_disableFallingEdgeDelayCountShadowLoadMode +#define HRPWM_setDeadBandCounterClock EPWM_setDeadBandCounterClock +#define HRPWM_setRisingEdgeDelayCount EPWM_setRisingEdgeDelayCount +#define HRPWM_setFallingEdgeDelayCount EPWM_setFallingEdgeDelayCount + +// +// Chopper module related APIs +// +#define HRPWM_enableChopper EPWM_enableChopper +#define HRPWM_disableChopper EPWM_disableChopper +#define HRPWM_setChopperDutyCycle EPWM_setChopperDutyCycle +#define HRPWM_setChopperFreq EPWM_setChopperFreq +#define HRPWM_setChopperFirstPulseWidt EPWM_setChopperFirstPulseWidth + +// +// Trip Zone module related APIs +// +#define HRPWM_enableTripZoneSignals EPWM_enableTripZoneSignals +#define HRPWM_disableTripZoneSignals EPWM_disableTripZoneSignals +#define HRPWM_setTripZoneDigitalCompareEventCondition \ + EPWM_setTripZoneDigitalCompareEventCondition +#define HRPWM_enableTripZoneAdvAction EPWM_enableTripZoneAdvAction +#define HRPWM_disableTripZoneAdvAction EPWM_disableTripZoneAdvAction +#define HRPWM_setTripZoneAction EPWM_setTripZoneAction +#define HRPWM_setTripZoneAdvAction EPWM_setTripZoneAdvAction +#define HRPWM_setTripZoneAdvDigitalCompareActionA \ + EPWM_setTripZoneAdvDigitalCompareActionA +#define HRPWM_setTripZoneAdvDigitalCompareActionB \ + EPWM_setTripZoneAdvDigitalCompareActionB +#define HRPWM_enableTripZoneInterrupt EPWM_enableTripZoneInterrupt +#define HRPWM_disableTripZoneInterrupt EPWM_disableTripZoneInterrupt + +// +// HRPWM_getTripZoneInterruptStatus API define is obsolete please use +// HRPWM_getTripZoneFlagStatus going forward. +// +#define HRPWM_getTripZoneInterruptStatus EPWM_getTripZoneFlagStatus +#define HRPWM_getTripZoneFlagStatus EPWM_getTripZoneFlagStatus + +// +// HRPWM_getCycleByCycleTripZoneInterruptStatus API define is obsolete +// please use HRPWM_getCycleByCycleTripZoneFlagStatus going forward. +// +#define HRPWM_getCycleByCycleTripZoneInterruptStatus \ + HRPWM_getCycleByCycleTripZoneFlagStatus +#define HRPWM_getCycleByCycleTripZoneFlagStatus \ + EPWM_getCycleByCycleTripZoneFlagStatus + +// +// HRPWM_getOneShotTripZoneInterruptStatus is obsolete please use +// HRPWM_getOneShotTripZoneFlagStatus going forward. +// +#define HRPWM_getOneShotTripZoneInterruptStatus \ + HRPWM_getOneShotTripZoneFlagStatus +#define HRPWM_getOneShotTripZoneFlagStatus \ + EPWM_getOneShotTripZoneFlagStatus +#define HRPWM_selectCycleByCycleTripZoneClearEvent \ + EPWM_selectCycleByCycleTripZoneClearEvent + +// +// HRPWM_clearTripZoneInterruptFlag is obsolete please use +// HRPWM_clearTripZoneFlag going forward. +// +#define HRPWM_clearTripZoneInterruptFlag HRPWM_clearTripZoneFlag +#define HRPWM_clearTripZoneFlag EPWM_clearTripZoneFlag + +// +// HRPWM_clearCycleByCycleTripZoneInterruptFlag is obsolete please use +// HRPWM_clearCycleByCycleTripZoneFlag going forward. +// +#define HRPWM_clearCycleByCycleTripZoneInterruptFlag \ + HRPWM_clearCycleByCycleTripZoneFlag +#define HRPWM_clearCycleByCycleTripZoneFlag \ + EPWM_clearCycleByCycleTripZoneFlag + +// +// HRPWM_clearOneShotTripZoneInterruptFlag is obsolete please use +// HRPWM_clearOneShotTripZoneFlag going forward. +// +#define HRPWM_clearOneShotTripZoneInterruptFlag \ + HRPWM_clearOneShotTripZoneFlag +#define HRPWM_clearOneShotTripZoneFlag \ + EPWM_clearOneShotTripZoneFlag +#define HRPWM_forceTripZoneEvent EPWM_forceTripZoneEvent + +// +// Event Trigger related APIs +// +#define HRPWM_enableInterrupt EPWM_enableInterrupt +#define HRPWM_disableInterrupt EPWM_disableInterrupt +#define HRPWM_setInterruptSource EPWM_setInterruptSource +#define HRPWM_setInterruptEventCount EPWM_setInterruptEventCount +#define HRPWM_getEventTriggerInterruptStatus \ + EPWM_getEventTriggerInterruptStatus +#define HRPWM_clearEventTriggerInterruptFlag \ + EPWM_clearEventTriggerInterruptFlag +#define HRPWM_enableInterruptEventCountInit \ + EPWM_enableInterruptEventCountInit +#define HRPWM_disableInterruptEventCountInit \ + EPWM_disableInterruptEventCountInit +#define HRPWM_forceInterruptEventCountInit \ + EPWM_forceInterruptEventCountInit +#define HRPWM_setInterruptEventCountInitValue \ + EPWM_setInterruptEventCountInitValue +#define HRPWM_getInterruptEventCount EPWM_getInterruptEventCount +#define HRPWM_forceEventTriggerInterrupt EPWM_forceEventTriggerInterrupt + +// +// ADC SOC configuration related APIs +// +#define HRPWM_enableADCTrigger EPWM_enableADCTrigger +#define HRPWM_disableADCTrigger EPWM_disableADCTrigger +#define HRPWM_setADCTriggerSource EPWM_setADCTriggerSource +#define HRPWM_setADCTriggerEventPrescale EPWM_setADCTriggerEventPrescale +#define HRPWM_getADCTriggerFlagStatus EPWM_getADCTriggerFlagStatus +#define HRPWM_clearADCTriggerFlag EPWM_clearADCTriggerFlag +#define HRPWM_enableADCTriggerEventCountInit \ + EPWM_enableADCTriggerEventCountInit +#define HRPWM_disableADCTriggerEventCountInit \ + EPWM_disableADCTriggerEventCountInit +#define HRPWM_forceADCTriggerEventCountInit \ + EPWM_forceADCTriggerEventCountInit +#define HRPWM_setADCTriggerEventCountInitValue \ + EPWM_setADCTriggerEventCountInitValue +#define HRPWM_getADCTriggerEventCount EPWM_getADCTriggerEventCount +#define HRPWM_forceADCTrigger EPWM_forceADCTrigger + +// +// Digital Compare Module related APIs +// +#define HRPWM_selectDigitalCompareTripInput \ + EPWM_selectDigitalCompareTripInput +#define HRPWM_enableDigitalCompareBlankingWindow \ + EPWM_enableDigitalCompareBlankingWindow +#define HRPWM_disableDigitalCompareBlankingWindow \ + EPWM_disableDigitalCompareBlankingWindow +#define HRPWM_enableDigitalCompareWindowInverseMode \ + EPWM_enableDigitalCompareWindowInverseMode +#define HRPWM_disableDigitalCompareWindowInverseMode \ + EPWM_disableDigitalCompareWindowInverseMode +#define HRPWM_setDigitalCompareBlankingEvent \ + EPWM_setDigitalCompareBlankingEvent +#define HRPWM_setDigitalCompareFilterInput \ + EPWM_setDigitalCompareFilterInput +#define HRPWM_setDigitalCompareWindowOffset \ + EPWM_setDigitalCompareWindowOffset +#define HRPWM_setDigitalCompareWindowLength \ + EPWM_setDigitalCompareWindowLength +#define HRPWM_getDigitalCompareBlankingWindowOffsetCount \ + EPWM_getDigitalCompareBlankingWindowOffsetCount +#define HRPWM_getDigitalCompareBlankingWindowLengthCount \ + EPWM_getDigitalCompareBlankingWindowLengthCount +#define HRPWM_setDigitalCompareEventSource \ + EPWM_setDigitalCompareEventSource +#define HRPWM_setDigitalCompareEventSyncMode \ + EPWM_setDigitalCompareEventSyncMode +#define HRPWM_enableDigitalCompareADCTrigger \ + EPWM_enableDigitalCompareADCTrigger +#define HRPWM_disableDigitalCompareADCTrigger \ + EPWM_disableDigitalCompareADCTrigger +#define HRPWM_enableDigitalCompareSyncEvent \ + EPWM_enableDigitalCompareSyncEvent +#define HRPWM_disableDigitalCompareSyncEvent \ + EPWM_disableDigitalCompareSyncEvent +#define HRPWM_enableDigitalCompareCounterCapture \ + EPWM_enableDigitalCompareCounterCapture +#define HRPWM_disableDigitalCompareCounterCapture \ + EPWM_disableDigitalCompareCounterCapture +#define HRPWM_setDigitalCompareCounterShadowMode \ + EPWM_setDigitalCompareCounterShadowMode +#define HRPWM_getDigitalCompareCaptureStatus \ + EPWM_getDigitalCompareCaptureStatus +#define HRPWM_getDigitalCompareCaptureCount \ + EPWM_getDigitalCompareCaptureCount +#define HRPWM_enableDigitalCompareTripCombinationInput \ + EPWM_enableDigitalCompareTripCombinationInput +#define HRPWM_disableDigitalCompareTripCombinationInput \ + EPWM_disableDigitalCompareTripCombinationInput + +// +// Valley switching related APIs +// +#define HRPWM_enableValleyCapture EPWM_enableValleyCapture +#define HRPWM_disableValleyCapture EPWM_disableValleyCapture +#define HRPWM_startValleyCapture EPWM_startValleyCapture +#define HRPWM_setValleyTriggerSource EPWM_setValleyTriggerSource +#define HRPWM_setValleyTriggerEdgeCounts EPWM_setValleyTriggerEdgeCounts +#define HRPWM_enableValleyHWDelay EPWM_enableValleyHWDelay +#define HRPWM_disableValleyHWDelay EPWM_disableValleyHWDelay +#define HRPWM_setValleySWDelayValue EPWM_setValleySWDelayValue +#define HRPWM_setValleyDelayDivider EPWM_setValleyDelayDivider +#define HRPWM_getValleyEdgeStatus EPWM_getValleyEdgeStatus +#define HRPWM_getValleyCount EPWM_getValleyCount +#define HRPWM_getValleyHWDelay EPWM_getValleyHWDelay + +// +// Global Load feature related APIs +// +#define HRPWM_enableGlobalLoad EPWM_enableGlobalLoad +#define HRPWM_disableGlobalLoad EPWM_disableGlobalLoad +#define HRPWM_setGlobalLoadTrigger EPWM_setGlobalLoadTrigger +#define HRPWM_setGlobalLoadEventPrescale EPWM_setGlobalLoadEventPrescale +#define HRPWM_getGlobalLoadEventCount EPWM_getGlobalLoadEventCount +#define HRPWM_disableGlobalLoadOneShotMode EPWM_disableGlobalLoadOneShotMode +#define HRPWM_enableGlobalLoadOneShotMode EPWM_enableGlobalLoadOneShotMode +#define HRPWM_setGlobalLoadOneShotLatch EPWM_setGlobalLoadOneShotLatch +#define HRPWM_forceGlobalLoadOneShotEvent EPWM_forceGlobalLoadOneShotEvent +#define HRPWM_enableGlobalLoadRegisters EPWM_enableGlobalLoadRegisters +#define HRPWM_disableGlobalLoadRegisters EPWM_disableGlobalLoadRegisters +#define HRPWM_setEmulationMode EPWM_setEmulationMode + +//***************************************************************************** +// +// Prototypes for the API. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \internal +//! Checks HRPWM base address. +//! +//! \param base specifies the HRPWM module base address. +//! +//! This function determines if an HRPWM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool HRPWM_isBaseValid(uint32_t base) +{ + return((base == EPWM1_BASE) || (base == EPWM2_BASE) || + (base == EPWM3_BASE) || (base == EPWM4_BASE) || + (base == EPWM5_BASE) || (base == EPWM6_BASE) || + (base == EPWM7_BASE) || (base == EPWM8_BASE)); +} +#endif +//***************************************************************************** +// +//! Sets the consolidated phase shift value in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param phaseCount is the consolidated phase shift count value. +//! +//! This function sets the consolidated phase shift value, that is, both TBPHS +//! and TBPHSHR values are configured together. +//! +//! Call EPWM_enablePhaseShiftLoad & HRPWM_enableHRPhaseShiftLoad() functions +//! to enable loading of the phaseCount in high resolution mode. +//! +//! \b Note: phaseCount is a 24-bit value. +//! \b Note: For configuring TBPHS = 0x3C, TBPHSHR = 0x2; +//! phaseCount = 0x3C02 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setPhaseShift(uint32_t base, uint32_t phaseCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(phaseCount < 0x1000000U); + + // + // Write to TBPHS:TBPHSHR bits + // + HWREG(base + HRPWM_O_TBPHS) = phaseCount << 8U; +} + +//***************************************************************************** +// +//! Sets only the high resolution phase shift value. +//! +//! \param base is the base address of the EPWM module. +//! \param hrPhaseCount is the high resolution phase shift count value. +//! +//! This function sets only the high resolution phase shift(TBPHSHR) value. +//! Call the HRPWM_enableHRPhaseShiftLoad() function to enable loading of +//! the hrPhaseCount. +//! +//! \b Note: hrPhaseCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResPhaseShiftOnly(uint32_t base, uint16_t hrPhaseCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrPhaseCount < 256U); + + // + // Write to TBPHSHR bits + // + HWREGH(base + HRPWM_O_TBPHS) = hrPhaseCount << 8U; +} + +//***************************************************************************** +// +//! Sets the consolidated period of time base counter used in HR mode. +//! +//! \param base is the base address of the EPWM module. +//! \param periodCount is the consolidated period count value. +//! +//! This function sets the consolidated period of time base counter value +//! (TBPRD:TBPRDHR) required in high resolution mode. +//! +//! User should map the desired period or frequency of the waveform into +//! the correct periodCount. +//! +//! \b Note: periodCount is a 24 bit value. +//! \b Note: For configuring TBPRD = 0x3C, TBPRDHR = 0xA; +//! periodCount = 0x3C0A +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setTimeBasePeriod(uint32_t base, uint32_t periodCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(periodCount < 0x1000000U); + + // + // Write to TBPRD:TBPRDHR bits + // + HWREG(base + HRPWM_O_TBPRDHR) = periodCount << 8U; +} + +//***************************************************************************** +// +//! Sets only the high resolution time base counter. +//! +//! \param base is the base address of the EPWM module. +//! \param hrPeriodCount is the high resolution period count value. +//! +//! This function sets only the high resolution time base counter(TBPRDHR) +//! value. +//! +//! User should map the desired period or frequency of the waveform into +//! the correct hrPeriodCount. +//! +//! \b Note: hrPeriodCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResTimeBasePeriodOnly(uint32_t base, uint16_t hrPeriodCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrPeriodCount < 256U); + + // + // Write to TBPRDHR bits + // + HWREGH(base + HRPWM_O_TBPRDHR) = hrPeriodCount << 8U; +} + +//***************************************************************************** +// +//! Gets the consolidated time base period count used in HR mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets the consolidated time base period(TBPRD:TBPRDHR) value +//! used in high resolution mode. +//! +//! \return The consolidated time base period count value. +// +//***************************************************************************** +static inline uint32_t +HRPWM_getTimeBasePeriod(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Read from TBPRD:TBPRDHR bit + // + return(HWREG(base + HRPWM_O_TBPRDHR) >> 8U); +} + +//***************************************************************************** +// +//! Gets the only the high resolution time base period count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets only the high resolution time base period(TBPRDHR) value. +//! +//! \return The high resolution time base period count value. +// +//***************************************************************************** +static inline uint16_t +HRPWM_getHiResTimeBasePeriodOnly(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Read from TBPRDHR bit + // + return(HWREGH(base + HRPWM_O_TBPRDHR) >> 8U); +} + +//***************************************************************************** +// +//! Sets the high resolution edge controlled by MEP (Micro Edge Positioner). +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param mepEdgeMode edge of the PWM that is controlled by MEP (Micro Edge +//! Positioner). +//! +//! This function sets the edge of the PWM that is controlled by MEP (Micro +//! Edge Positioner). Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - mepEdgeMode +//! - HRPWM_MEP_CTRL_DISABLE - HRPWM is disabled +//! - HRPWM_MEP_CTRL_RISING_EDGE - MEP (Micro Edge Positioner) +//! controls rising edge. +//! - HRPWM_MEP_CTRL_FALLING_EDGE - MEP (Micro Edge Positioner) +//! controls falling edge. +//! - HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE - MEP (Micro Edge Positioner) +//! controls both edges. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPEdgeSelect(uint32_t base, HRPWM_Channel channel, + HRPWM_MEPEdgeMode mepEdgeMode) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the edge mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x3U << (uint16_t)channel )) | + ((uint16_t)mepEdgeMode << (uint16_t)channel)); + EDIS; +} + +//***************************************************************************** +// +//! Sets the MEP (Micro Edge Positioner) control mode. +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param mepCtrlMode is the MEP (Micro Edge Positioner) control mode. +//! +//! This function sets the mode (register type) the MEP (Micro Edge Positioner) +//! will control. Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - mepCtrlMode +//! - HRPWM_MEP_DUTY_PERIOD_CTRL - MEP (Micro Edge Positioner) is +//! controlled by value of CMPAHR/ +//! CMPBHR(depending on the value of +//! channel) or TBPRDHR. +//! - HRPWM_MEP_PHASE_CTRL - MEP (Micro Edge Positioner) is +//! controlled by TBPHSHR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPControlMode(uint32_t base, HRPWM_Channel channel, + HRPWM_MEPCtrlMode mepCtrlMode) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the MEP control + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x1U << ((uint16_t)channel + 2U))) | + ((uint16_t)mepCtrlMode << ((uint16_t)channel + 2U))); + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution comparator load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param loadEvent is the MEP (Micro Edge Positioner) control mode. +//! +//! This function sets the shadow load mode of the high resolution comparator. +//! The function sets the COMPA or COMPB register depending on the channel +//! variable. +//! Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - loadEvent +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setCounterCompareShadowLoadEvent(uint32_t base, HRPWM_Channel channel, + HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the CMPAHR or CMPBHR load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x3U << ((uint16_t)channel + 3U))) | + ((uint16_t)loadEvent << ((uint16_t)channel + 3U))); + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution output swap mode. +//! +//! \param base is the base address of the EPWM module. +//! \param enableOutputSwap is the output swap flag. +//! +//! This function sets the HRPWM output swap mode. If enableOutputSwap is true, +//! ePWMxA signal appears on ePWMxB output and ePWMxB signal appears on ePWMxA +//! output. If it is false ePWMxA and ePWMxB outputs are unchanged. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setOutputSwapMode(uint32_t base, bool enableOutputSwap) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set output swap mode + // + EALLOW; + if(enableOutputSwap) + { + HWREGH(base + HRPWM_O_HRCNFG) |= HRPWM_HRCNFG_SWAPAB; + } + else + { + HWREGH(base + HRPWM_O_HRCNFG) &= ~HRPWM_HRCNFG_SWAPAB; + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution output on ePWMxB +//! +//! \param base is the base address of the EPWM module. +//! \param outputOnB is the output signal on ePWMxB. +//! +//! This function sets the HRPWM output signal on ePWMxB. If outputOnB is +//! HRPWM_OUTPUT_ON_B_INV_A, ePWMxB output is an inverted version of +//! ePWMxA. If outputOnB is HRPWM_OUTPUT_ON_B_NORMAL, ePWMxB output is +//! ePWMxB. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setChannelBOutputPath(uint32_t base, HRPWM_ChannelBOutput outputOnB) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the output on ePWM B + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(HRPWM_HRCNFG_SELOUTB)) | + ((uint16_t)outputOnB << 5U)); + EDIS; +} + +//***************************************************************************** +// +//! Enables MEP (Micro Edge Positioner) automatic scale mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the MEP (Micro Edge Positioner) to automatically +//! scale HRMSTEP. +//! +//! The SFO library will calculate required MEP steps per coarse steps and +//! feed it to HRMSTEP register. The MEP calibration module will use the value +//! in HRMSTEP to determine appropriate number of MEP steps represented by +//! fractional duty cycle. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enableAutoConversion(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Enable MEP automatic scale + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) |= HRPWM_HRCNFG_AUTOCONV; + EDIS; +} + +//***************************************************************************** +// +//! Disables MEP automatic scale mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the MEP (Micro Edge Positioner) from automatically +//! scaling HRMSTEP. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_disableAutoConversion(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Disable MEP automatic scale + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) &= ~HRPWM_HRCNFG_AUTOCONV; + EDIS; +} + +//***************************************************************************** +// +//! Enable high resolution period feature. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the high resolution period feature. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enablePeriodControl(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set HRPE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) |= HRPWM_HRPCTL_HRPE; + EDIS; +} + +//***************************************************************************** +// +//! Disable high resolution period feature. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the high resolution period feature. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_disablePeriodControl(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Clear HRPE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) &= ~HRPWM_HRPCTL_HRPE; + EDIS; +} + +//***************************************************************************** +// +//! Enable high resolution phase load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables loading of high resolution phase shift value which is +//! set by the function HRPWM_setPhaseShift(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set TBPHSHRLOADE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) |= HRPWM_HRPCTL_TBPHSHRLOADE; + EDIS; +} + +//***************************************************************************** +// +//! Disable high resolution phase load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables loading of high resolution phase shift value. +//! +//! \return +// +//***************************************************************************** +static inline void +HRPWM_disablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Clear TBPHSHRLOADE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) &= ~HRPWM_HRPCTL_TBPHSHRLOADE; + EDIS; +} + +//***************************************************************************** +// +//! Set high resolution PWMSYNC source. +//! +//! \param base is the base address of the EPWM module. +//! \param syncPulseSource is the PWMSYNC source. +//! +//! This function sets the high resolution PWMSYNC pulse source. +//! Valid values for syncPulseSource are: +//! - HRPWM_PWMSYNC_SOURCE_PERIOD - Counter equals Period. +//! - HRPWM_PWMSYNC_SOURCE_ZERO - Counter equals zero. +//! - HRPWM_PWMSYNC_SOURCE_COMPC_UP - Counter equals COMPC when +//! counting up. +//! - HRPWM_PWMSYNC_SOURCE_COMPC_DOWN - Counter equals COMPC when +//! counting down. +//! - HRPWM_PWMSYNC_SOURCE_COMPD_UP - Counter equals COMPD when +//! counting up. +//! - HRPWM_PWMSYNC_SOURCE_COMPD_DOWN - Counter equals COMPD when +//! counting down. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setSyncPulseSource(uint32_t base, HRPWM_SyncPulseSource syncPulseSource) +{ + // + // Set the PWMSYNC source + // + EALLOW; + + // + // Configuration for sync pulse source equal to HRPWM_PWMSYNC_SOURCE_PERIOD + // or HRPWM_PWMSYNC_SOURCE_ZERO + // + if(syncPulseSource < HRPWM_PWMSYNC_SOURCE_COMPC_UP) + { + HWREGH(base + HRPWM_O_HRPCTL) = + ((HWREGH(base + HRPWM_O_HRPCTL) & + ~(HRPWM_HRPCTL_PWMSYNCSELX_M | HRPWM_HRPCTL_PWMSYNCSEL)) | + ((uint16_t)syncPulseSource << 1U)); + } + else + { + HWREGH(base + HRPWM_O_HRPCTL) = + ((HWREGH(base + HRPWM_O_HRPCTL) & ~HRPWM_HRPCTL_PWMSYNCSELX_M) | + ((uint16_t)syncPulseSource << HRPWM_HRPCTL_PWMSYNCSELX_S)); + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the Translator Remainder value. +//! +//! \param base is the base address of the EPWM module. +//! \param trremVal is the translator remainder value. +//! +//! This function sets the Translator Remainder value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setTranslatorRemainder(uint32_t base, uint16_t trremVal) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(trremVal < 2048U); + + // + // Set Translator Remainder value + // + EALLOW; + HWREGH(base + HRPWM_O_TRREM) = (trremVal & HRPWM_TRREM_TRREM_M); + EDIS; +} + +//***************************************************************************** +// +//! Sets the consolidated counter compare values in HR mode. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module. +//! \param compCount is the consolidated counter compare count value. +//! +//! This function sets the consolidated counter compare(CMPx:CMPxHR) value +//! required in high resolution mode for counter compare registers. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \b Note: compCount is a 24 bit value. +//! \b Note: For configuring CMPA = 0xB4, CMPAHR = 0x64; value of +//! compCount = 0xB464 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setCounterCompareValue(uint32_t base, + HRPWM_CounterCompareModule compModule, + uint32_t compCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(compCount < 0x1000000U); + + // + // Write to counter compare registers + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Write to CMPA:CMPAHR + // + HWREG(base + HRPWM_O_CMPA) = compCount << 8U; + } + else + { + // + // Write to CMPB:CMPBHR + // + HWREG(base + HRPWM_O_CMPB) = compCount << 8U; + } +} + +//***************************************************************************** +// +//! Sets only the high resolution counter compare value. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module. +//! \param hrCompCount is the high resolution counter compare count value. +//! +//! This function sets the high resolution counter compare value(CMPxHR) for +//! counter compare registers. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \b Note: hrCompCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResCounterCompareValueOnly(uint32_t base, + HRPWM_CounterCompareModule compModule, + uint16_t hrCompCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrCompCount < 256U); + + // + // Write to the high resolution counter compare registers + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Write to CMPAHR + // + HWREGH(base + HRPWM_O_CMPA) = hrCompCount << 8U; + } + else + { + // + // Write to CMPBHR + // + HWREGH(base + HRPWM_O_CMPB) = hrCompCount << 8U; + } +} + +//***************************************************************************** +// +//! Gets the consolidated counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module value. +//! +//! This function gets the consolidated counter compare(CMPx:CMPxHR) value +//! used in high resolution for the counter compare module specified. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! +//! \return None. +// +//***************************************************************************** +static inline uint32_t +HRPWM_getCounterCompareValue(uint32_t base, + HRPWM_CounterCompareModule compModule) +{ + uint32_t compCount; + + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Get counter compare value for selected module + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Read from CMPAHR + // + compCount = HWREG(base + HRPWM_O_CMPA) >> 8U; + } + else + { + // + // Read from CMPBHR + // + compCount = HWREG(base + HRPWM_O_CMPB) >> 8U; + } + return(compCount); +} + +//***************************************************************************** +// +//! Gets only the high resolution counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module value. +//! +//! This function gets only the high resolution counter compare(CMPxHR) value +//! for the counter compare module specified. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \return None. +// +//***************************************************************************** +static inline uint16_t +HRPWM_getHiResCounterCompareValueOnly(uint32_t base, + HRPWM_CounterCompareModule compModule) +{ + uint16_t hrCompCount; + + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Get counter compare value for selected module + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Read from CMPAHR + // + hrCompCount = HWREGH(base + HRPWM_O_CMPA) >> 8U; + } + else + { + // + // Read from CMPBHR + // + hrCompCount = HWREGH(base + HRPWM_O_CMPB) >> 8U; + } + return(hrCompCount); +} + +//***************************************************************************** +// +//! Sets the consolidated RED count in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param redCount is the high resolution RED count. +//! +//! This function sets the consolidated RED (Rising Edge Delay) count +//! (DBRED:DBREDHR) value used in high resolution mode. The value of +//! redCount should be less than 0x200000. +//! +//! \b Note: redCount is a 21 bit value. +//! \b Note: For configuring DBRED = 0x4, DBREDHR = 0x1; value of +//! redCount = ((0x4 << 7) | 0x1) = 0x201 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setRisingEdgeDelay(uint32_t base, uint32_t redCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(redCount < 0x200000U); + + // + // Set the consolidated RED (Rising Edge Delay) count + // + HWREG(base + HRPWM_O_DBREDHR) = redCount << 9U; +} + +//***************************************************************************** +// +//! Sets the high resolution RED count only. +//! +//! \param base is the base address of the EPWM module. +//! \param hrRedCount is the high resolution RED count. +//! +//! This function sets only the high resolution RED (Rising Edge Delay) +//! count(DBREDHR) value. +//! The value of hrRedCount should be less than 128. +//! +//! \b Note: hrRedCount is a 7-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResRisingEdgeDelayOnly(uint32_t base, uint16_t hrRedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrRedCount < 128U); + + // + // Set the High Resolution RED (Rising Edge Delay) count only + // + HWREGH(base + HRPWM_O_DBREDHR) = hrRedCount << 9U; +} + +//***************************************************************************** +// +//! Sets the consolidated FED value in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param fedCount is the high resolution FED count. +//! +//! This function sets the consolidated FED (Falling Edge Delay) count +//! (DBFED: DBFEDHR) value used in high resolution mode. The value of fedCount +//! should be less than 0x200000. +//! +//! \b Note: fedCount is a 21 bit value. +//! \b Note: For configuring DBFED = 0x4, DBFEDHR = 0x1; value of +//! fedCount = ((0x4 << 7) | 0x1) = 0x201 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setFallingEdgeDelay(uint32_t base, uint32_t fedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(fedCount < 0x200000U); + + // + // Set the High Resolution FED (Falling Edge Delay) count + // + HWREG(base + HRPWM_O_DBFEDHR) = fedCount << 9U; +} + +//***************************************************************************** +// +//! Sets high resolution FED count only. +//! +//! \param base is the base address of the EPWM module. +//! \param hrFedCount is the high resolution FED count. +//! +//! This function sets only the high resolution FED (Falling Edge Delay) count +//! (DBFEDHR)value. The value of hrFedCount should be less than 128. +//! +//! \b Note: hrFedCount is a 7-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResFallingEdgeDelayOnly(uint32_t base, uint16_t hrFedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrFedCount < 128U); + + // + // Set the high resolution FED (Falling Edge Delay) count + // + HWREGH(base + HRPWM_O_DBFEDHR) = hrFedCount << 9U; +} + +//***************************************************************************** +// +//! Set high resolution MEP (Micro Edge Positioner) step. +//! +//! \param base is the base address of the EPWM module. +//! \param mepCount is the high resolution MEP (Micro Edge Positioner) step +//! count. +//! +//! This function sets the high resolution MEP (Micro Edge Positioner) step +//! count. The maximum value for the MEP count step is 255. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPStep(uint32_t base, uint16_t mepCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(mepCount < 256U); + + // + // Set HRPWM MEP count + // + EALLOW; + HWREGH(base + HRPWM_O_HRMSTEP) = + ((HWREGH(base + HRPWM_O_HRMSTEP) & ~HRPWM_HRMSTEP_HRMSTEP_M) | + mepCount); + EDIS; +} + +//***************************************************************************** +// +//! Set high resolution Dead Band MEP (Micro Edge Positioner) control. +//! +//! \param base is the base address of the EPWM module. +//! \param mepDBEdge is the high resolution MEP (Micro Edge Positioner) control +//! edge. +//! +//! This function sets the high resolution Dead Band edge that the MEP (Micro +//! Edge Positioner) controls Valid values for mepDBEdge are: +//! - HRPWM_DB_MEP_CTRL_DISABLE - HRPWM is disabled +//! - HRPWM_DB_MEP_CTRL_RED - MEP (Micro Edge Positioner) controls +//! Rising Edge Delay +//! - HRPWM_DB_MEP_CTRL_FED - MEP (Micro Edge Positioner) controls +//! Falling Edge Delay +//! - HRPWM_DB_MEP_CTRL_RED_FED - MEP (Micro Edge Positioner) controls both +//! Falling and Rising edge delays +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setDeadbandMEPEdgeSelect(uint32_t base, + HRPWM_MEPDeadBandEdgeMode mepDBEdge) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM DB edge mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_EDGMODEDB_M) | + ((uint16_t)mepDBEdge)); + EDIS; +} + +//***************************************************************************** +// +//! Set the high resolution Dead Band RED load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadEvent is the shadow to active load event. +//! +//! This function sets the high resolution Rising Edge Delay(RED)Dead Band +//! count load mode. +//! Valid values for loadEvent are: +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero +//! or period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setRisingEdgeDelayLoadMode(uint32_t base, + HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM RED load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_CTLMODEDBRED_M) | + ((uint16_t)loadEvent << HRPWM_HRCNFG2_CTLMODEDBRED_S)); + EDIS; +} + +//***************************************************************************** +// +//! Set the high resolution Dead Band FED load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadEvent is the shadow to active load event. +//! +//! This function sets the high resolution Falling Edge Delay(FED) Dead Band +//! count load mode. +//! Valid values for loadEvent are: +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero +//! or period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setFallingEdgeDelayLoadMode(uint32_t base, HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM FED load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_CTLMODEDBFED_M) | + ((uint16_t)loadEvent << HRPWM_HRCNFG2_CTLMODEDBFED_S)); + EDIS; +} + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // HRPWM_H + diff --git a/gpio_bitfield_cpu2/device/driverlib/hw_reg_inclusive_terminology.h b/gpio_bitfield_cpu2/device/driverlib/hw_reg_inclusive_terminology.h new file mode 100644 index 0000000..d3dc018 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/hw_reg_inclusive_terminology.h @@ -0,0 +1,29 @@ +#ifndef HW_REG_INCLUSIVE_TERMINOLOGY_H +#define HW_REG_INCLUSIVE_TERMINOLOGY_H + + + +//***************************************************************************** +// SPI +//***************************************************************************** +#define SPI_CTL_CONTROLLER_PERIPHERAL SPI_CTL_MASTER_SLAVE +#define SPI_PRI_PTEINV SPI_PRI_STEINV + +//***************************************************************************** +// I2C +//***************************************************************************** +#define I2C_O_TAR I2C_O_SAR + +#define I2C_TAR_TAR_S I2C_SAR_SAR_S +#define I2C_TAR_TAR_M I2C_SAR_SAR_M + +#define I2C_IER_AAT I2C_IER_AAS + +#define I2C_STR_AAT I2C_STR_AAS +#define I2C_STR_TDIR I2C_STR_SDIR + +#define I2C_MDR_CNT I2C_MDR_MST + + + +#endif // HW_REG_INCLUSIVE_TERMINOLOGY_H diff --git a/gpio_bitfield_cpu2/device/driverlib/i2c.c b/gpio_bitfield_cpu2/device/driverlib/i2c.c new file mode 100644 index 0000000..692f7a2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/i2c.c @@ -0,0 +1,351 @@ +//########################################################################### +// +// FILE: i2c.c +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "i2c.h" + +//***************************************************************************** +// +// I2C_initController +// +//***************************************************************************** +void +I2C_initController(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle) +{ + uint32_t modPrescale; + uint32_t divider; + uint32_t dValue; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT((10000000U / bitRate) > 10U); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / 10000000U) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; + + switch(modPrescale) + { + case 0U: + dValue = 7U; + break; + + case 1U: + dValue = 6U; + break; + + default: + dValue = 5U; + break; + } + + // + // Set the divider for the time low + // + divider = (10000000U / bitRate) - (2U * dValue); + + if(dutyCycle == I2C_DUTYCYCLE_50) + { + HWREGH(base + I2C_O_CLKH) = divider / 2U; + } + else + { + HWREGH(base + I2C_O_CLKH) = divider / 3U; + } + + HWREGH(base + I2C_O_CLKL) = divider - HWREGH(base + I2C_O_CLKH); +} + +//***************************************************************************** +// +// I2C_initControllerModuleFrequency +// +//***************************************************************************** +void +I2C_initControllerModuleFrequency(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle, uint32_t moduleFrequency) +{ + uint32_t modPrescale; + uint32_t divider; + uint32_t dValue; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT((moduleFrequency / bitRate) > 10U); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / moduleFrequency) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; + + switch(modPrescale) + { + case 0U: + dValue = 7U; + break; + + case 1U: + dValue = 6U; + break; + + default: + dValue = 5U; + break; + } + + // + // Set the divider for the time low + // + divider = (moduleFrequency / bitRate) - (2U * dValue); + + if(dutyCycle == I2C_DUTYCYCLE_50) + { + HWREGH(base + I2C_O_CLKH) = divider / 2U; + } + else + { + HWREGH(base + I2C_O_CLKH) = divider / 3U; + } + + HWREGH(base + I2C_O_CLKL) = divider - HWREGH(base + I2C_O_CLKH); +} + +//***************************************************************************** +// +// I2C_enableInterrupt +// +//***************************************************************************** +void +I2C_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Enable the desired basic interrupts + // + HWREGH(base + I2C_O_IER) |= (intFlags & 0xFFFFU); + + // + // Enabling addressed-as-target interrupt separately because its bit is + // different between the IER and STR registers. + // + if((intFlags & I2C_INT_ADDR_TARGET) != 0U) + { + HWREGH(base + I2C_O_IER) |= I2C_IER_AAT; + } + + // + // Enable desired FIFO interrupts. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_TXFFIENA; + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// I2C_disableInterrupt +// +//***************************************************************************** +void +I2C_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Disable the desired basic interrupts. + // + HWREGH(base + I2C_O_IER) &= ~(intFlags & 0xFFFFU); + + // + // Disabling addressed-as-target interrupt separately because its bit is + // different between the IER and STR registers. + // + if((intFlags & I2C_INT_ADDR_TARGET) != 0U) + { + HWREGH(base + I2C_O_IER) &= ~I2C_IER_AAT; + } + + // + // Disable the desired FIFO interrupts. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) &= ~(I2C_FFTX_TXFFIENA); + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) &= ~(I2C_FFRX_RXFFIENA); + } +} + +//***************************************************************************** +// +// I2C_getInterruptStatus +// +//***************************************************************************** +uint32_t +I2C_getInterruptStatus(uint32_t base) +{ + uint32_t temp; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return only the status bits associated with interrupts. + // + temp = (uint32_t)HWREGH(base + I2C_O_STR) & (uint32_t)I2C_STR_INTMASK; + + // + // Read FIFO interrupt flags. + // + if((HWREGH(base + I2C_O_FFTX) & I2C_FFTX_TXFFINT) != 0U) + { + temp |= I2C_INT_TXFF; + } + + if((HWREGH(base + I2C_O_FFRX) & I2C_FFRX_RXFFINT) != 0U) + { + temp |= I2C_INT_RXFF; + } + + return(temp); +} + +//***************************************************************************** +// +// I2C_clearInterruptStatus +// +//***************************************************************************** +void +I2C_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Clear the interrupt flags that are located in STR. + // + HWREGH(base + I2C_O_STR) = ((uint16_t)intFlags & I2C_STR_INTMASK); + + // + // Clear the FIFO interrupt flags if needed. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_TXFFINTCLR; + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFINTCLR; + } +} +//***************************************************************************** +// +// I2C_configureModuleFrequency +// +//***************************************************************************** +void +I2C_configureModuleFrequency(uint32_t base, uint32_t sysclkHz) +{ + uint32_t modPrescale; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / 10000000U) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; +} +//***************************************************************************** +// +// I2C_configureModuleClockFrequency +// +//***************************************************************************** +void +I2C_configureModuleClockFrequency(uint32_t base, uint32_t sysclkHz, uint32_t moduleFrequency) +{ + uint32_t modPrescale; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / moduleFrequency) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/i2c.h b/gpio_bitfield_cpu2/device/driverlib/i2c.h new file mode 100644 index 0000000..634c4c8 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/i2c.h @@ -0,0 +1,1386 @@ +//########################################################################### +// +// FILE: i2c.h +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef I2C_H +#define I2C_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup i2c_api I2C +//! @{ +// +//***************************************************************************** + +#include "inc/hw_i2c.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "hw_reg_inclusive_terminology.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// I2C Controller commands. +// +//***************************************************************************** +#define I2C_CONTROLLER_SEND_MODE 0x0600U //!< Controller-transmitter mode +#define I2C_CONTROLLER_RECEIVE_MODE 0x0400U //!< Controller-receiver mode +#define I2C_TARGET_SEND_MODE 0x0200U //!< Target-transmitter mode +#define I2C_TARGET_RECEIVE_MODE 0x0000U //!< Target-receiver mode + +#define I2C_REPEAT_MODE 0x0080U //!< Only applies to Controller mode +#define I2C_START_BYTE_MODE 0x0010U //!< Enable start byte mode +#define I2C_FREE_DATA_FORMAT 0x0008U //!< Enable free data (no addr) format + +//***************************************************************************** +// +// I2C interrupts for use with the intFlags parameter of I2C_enableInterrupt(), +// I2C_disableInterrupt(), and I2C_clearInterruptStatus() and to be returned by +// I2C_getInterruptStatus(). +// +//***************************************************************************** +#define I2C_INT_ARB_LOST 0x00001U //!< Arbitration-lost interrupt +#define I2C_INT_NO_ACK 0x00002U //!< NACK interrupt +#define I2C_INT_REG_ACCESS_RDY 0x00004U //!< Register-access-ready interrupt +#define I2C_INT_RX_DATA_RDY 0x00008U //!< Receive-data-ready interrupt +#define I2C_INT_TX_DATA_RDY 0x00010U //!< Transmit-data-ready interrupt +#define I2C_INT_STOP_CONDITION 0x00020U //!< Stop condition detected +#define I2C_INT_ADDR_TARGET 0x00200U //!< Addressed as target interrupt +#define I2C_INT_RXFF 0x10000U //!< RX FIFO level interrupt +#define I2C_INT_TXFF 0x20000U //!< TX FIFO level interrupt + + +// +// Helpful define to mask out the bits in the I2CSTR register that aren't +// associated with interrupts. +// +#define I2C_STR_INTMASK ((uint16_t)I2C_INT_ARB_LOST | \ + (uint16_t)I2C_INT_NO_ACK | \ + (uint16_t)I2C_INT_REG_ACCESS_RDY | \ + (uint16_t)I2C_INT_RX_DATA_RDY | \ + (uint16_t)I2C_INT_TX_DATA_RDY | \ + (uint16_t)I2C_INT_STOP_CONDITION | \ + (uint16_t)I2C_INT_ADDR_TARGET) + + + + +//***************************************************************************** +// +// Flags for use as the stsFlags parameter of I2C_clearStatus() and to be +// returned by I2C_getStatus(). +// +//***************************************************************************** +#define I2C_STS_ARB_LOST 0x0001U //!< Arbitration-lost +#define I2C_STS_NO_ACK 0x0002U //!< No-acknowledgment (NACK) +#define I2C_STS_REG_ACCESS_RDY 0x0004U //!< Register-access-ready (ARDY) +#define I2C_STS_RX_DATA_RDY 0x0008U //!< Receive-data-ready +#define I2C_STS_TX_DATA_RDY 0x0010U //!< Transmit-data-ready +#define I2C_STS_STOP_CONDITION 0x0020U //!< Stop condition detected +#define I2C_STS_ADDR_ZERO 0x0100U //!< Address of all zeros detected +#define I2C_STS_ADDR_TARGET 0x0200U //!< Addressed as target +#define I2C_STS_TX_EMPTY 0x0400U //!< Transmit shift register empty +#define I2C_STS_RX_FULL 0x0800U //!< Receive shift register full +#define I2C_STS_BUS_BUSY 0x1000U //!< Bus busy, wait for STOP or reset +#define I2C_STS_NACK_SENT 0x2000U //!< NACK was sent +#define I2C_STS_TARGET_DIR 0x4000U //!< Addressed as target transmitter + +#endif + + +//***************************************************************************** +// +//! I2C interrupts to be returned by I2C_getInterruptSource(). +// +//***************************************************************************** +typedef enum +{ + I2C_INTSRC_NONE, //!< No interrupt pending + I2C_INTSRC_ARB_LOST, //!< Arbitration-lost interrupt + I2C_INTSRC_NO_ACK, //!< NACK interrupt + I2C_INTSRC_REG_ACCESS_RDY, //!< Register-access-ready interrupt + I2C_INTSRC_RX_DATA_RDY, //!< Receive-data-ready interrupt + I2C_INTSRC_TX_DATA_RDY, //!< Transmit-data-ready interrupt + I2C_INTSRC_STOP_CONDITION, //!< Stop condition detected + I2C_INTSRC_ADDR_TARGET, //!< Addressed as target interrupt +} I2C_InterruptSource; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e txLevel +//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e txLevel +//! parameter, and returned by I2C_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + I2C_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty + I2C_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty + I2C_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full + I2C_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full + I2C_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full + I2C_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full + I2C_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full + I2C_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full + I2C_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full + I2C_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full + I2C_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full + I2C_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full + I2C_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full + I2C_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full + I2C_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full + I2C_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full + I2C_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full + I2C_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full + I2C_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full +} I2C_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e rxLevel +//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e rxLevel +//! parameter, and returned by I2C_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + I2C_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty + I2C_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty + I2C_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full + I2C_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full + I2C_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full + I2C_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full + I2C_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full + I2C_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full + I2C_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full + I2C_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full + I2C_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full + I2C_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full + I2C_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full + I2C_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full + I2C_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full + I2C_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full + I2C_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full + I2C_FIFO_RX16 = 0x0010U, //!< Receive FIFO full + I2C_FIFO_RXFULL = 0x0010U //!< Receive FIFO full +} I2C_RxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setBitCount() as the \e size parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_BITCOUNT_1 = 1U, //!< 1 bit per data byte + I2C_BITCOUNT_2 = 2U, //!< 2 bits per data byte + I2C_BITCOUNT_3 = 3U, //!< 3 bits per data byte + I2C_BITCOUNT_4 = 4U, //!< 4 bits per data byte + I2C_BITCOUNT_5 = 5U, //!< 5 bits per data byte + I2C_BITCOUNT_6 = 6U, //!< 6 bits per data byte + I2C_BITCOUNT_7 = 7U, //!< 7 bits per data byte + I2C_BITCOUNT_8 = 0U //!< 8 bits per data byte +} I2C_BitCount; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setAddressMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_ADDR_MODE_7BITS = 0x0000U, //!< 7-bit address + I2C_ADDR_MODE_10BITS = 0x0100U //!< 10-bit address +} I2C_AddressMode; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! If SCL is low, keep it low. If high, stop when it goes low again. + I2C_EMULATION_STOP_SCL_LOW = 0x0000U, + //! Continue I2C operation regardless + I2C_EMULATION_FREE_RUN = 0x4000U +} I2C_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to I2C_initController() as the \e dutyCycle +//! parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_DUTYCYCLE_33, //!< Clock duty cycle is 33% + I2C_DUTYCYCLE_50 //!< Clock duty cycle is 55% +} I2C_DutyCycle; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an I2C base address. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function determines if a I2C module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +I2C_isBaseValid(uint32_t base) +{ + return( + (base == I2CA_BASE) || + (base == I2CB_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function enables operation of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + HWREGH(base + I2C_O_MDR) |= I2C_MDR_IRS; +} + +//***************************************************************************** +// +//! Disables the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function disables operation of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + HWREGH(base + I2C_O_MDR) &= ~(I2C_MDR_IRS); +} + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This functions enables the transmit and receive FIFOs in the I2C. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_I2CFFEN | I2C_FFTX_TXFFRST; + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFRST; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This functions disables the transmit and receive FIFOs in the I2C. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + I2C_O_FFTX) &= ~(I2C_FFTX_I2CFFEN | I2C_FFTX_TXFFRST); + HWREGH(base + I2C_O_FFRX) &= ~I2C_FFRX_RXFFRST; +} + +//***************************************************************************** +// +//! Sets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the I2C instance used. +//! \param txLevel is the transmit FIFO interrupt level, specified as +//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, . . . or +//! \b I2C_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as +//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, . . . or +//! \b I2C_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. The transmit FIFO interrupt flag will be set when the FIFO +//! reaches a value less than or equal to \e txLevel. The receive FIFO +//! flag will be set when the FIFO reaches a value greater than or equal to +//! \e rxLevel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel txLevel, + I2C_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + I2C_O_FFTX) = (HWREGH(base + I2C_O_FFTX) & + (~I2C_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + I2C_O_FFRX) = (HWREGH(base + I2C_O_FFRX) & + (~I2C_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the I2C instance used. +//! \param txLevel is a pointer to storage for the transmit FIFO level, +//! returned as one of \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, +//! \b I2C_FIFO_TX2, . . . or \b I2C_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO level, +//! returned as one of \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, +//! \b I2C_FIFO_RX2, . . . or \b I2C_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. The transmit FIFO interrupt flag will be set when the FIFO +//! reaches a value less than or equal to \e txLevel. The receive FIFO +//! flag will be set when the FIFO reaches a value greater than or equal to +//! \e rxLevel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_getFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel *txLevel, + I2C_RxFIFOLevel *rxLevel) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (I2C_TxFIFOLevel)(HWREGH(base + I2C_O_FFTX) & + I2C_FFTX_TXFFIL_M); + *rxLevel = (I2C_RxFIFOLevel)(HWREGH(base + I2C_O_FFRX) & + I2C_FFRX_RXFFIL_M); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, \b I2C_FIFO_TX3, +//! ..., or \b I2C_FIFO_TX16 +// +//***************************************************************************** +static inline I2C_TxFIFOLevel +I2C_getTxFIFOStatus(uint32_t base) +{ + uint16_t level; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Get the current FIFO status + // + level = ((HWREGH(base + I2C_O_FFTX) & I2C_FFTX_TXFFST_M) >> + I2C_FFTX_TXFFST_S); + + return((I2C_TxFIFOLevel)level); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, \b I2C_FIFO_RX3, +//! ..., or \b I2C_FIFO_RX16 +// +//***************************************************************************** +static inline I2C_RxFIFOLevel +I2C_getRxFIFOStatus(uint32_t base) +{ + uint16_t level; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Get the current FIFO status + // + level = ((HWREGH(base + I2C_O_FFRX) & I2C_FFRX_RXFFST_M) >> + I2C_FFRX_RXFFST_S); + + return((I2C_RxFIFOLevel)level); +} + +//***************************************************************************** +// +//! Reads I2C Module clock prescaler value. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads the I2C prescaler value which configures the I2C module +//! clock by dividing down the SYSCLK. I2C_MODULE_CLK = SYSCLK / (I2CPSC + ) +//! +//! \return Returns the I2C prescaler(I2CPSC) cast as an uint16_t. +// +//***************************************************************************** +static inline uint16_t +I2C_getPreScaler(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the contents of the Prescaler register. + // + return(HWREGH(base + I2C_O_PSC)); +} + +//***************************************************************************** +// +//! Sets the address that the I2C Controller places on the bus. +//! +//! \param base is the base address of the I2C instance used. +//! \param targetAddr 7-bit or 10-bit target address +//! +//! This function configures the address that the I2C Controller places on the bus +//! when initiating a transaction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setTargetAddress(uint32_t base, uint16_t targetAddr) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT(targetAddr <= I2C_TAR_TAR_M); + + HWREGH(base + I2C_O_TAR) = targetAddr; +} + +//***************************************************************************** +// +//! Sets the own address for this I2C module. +//! +//! \param base is the base address of the I2C Target module. +//! \param Addr is the 7-bit or 10-bit address +//! +//! This function writes the specified address. +//! +//! The parameter \e Addr is the value that is compared against the +//! target address sent by an I2C controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setOwnAddress(uint32_t base, uint16_t Addr) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT(Addr <= I2C_OAR_OAR_M); + + HWREGH(base + I2C_O_OAR) = Addr; +} + +//***************************************************************************** +// +//! Indicates whether or not the I2C bus is busy. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns an indication of whether or not the I2C bus is busy. +//! This function can be used in a multi-controller environment to determine if the +//! bus is free for another data transfer. +//! +//! \return Returns \b true if the I2C bus is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +static inline bool +I2C_isBusBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + return((HWREGH(base + I2C_O_STR) & I2C_STR_BB) == I2C_STR_BB); +} + +//***************************************************************************** +// +//! Gets the current I2C module status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the status for the I2C module. +//! +//! \return The current module status, enumerated as a bit field of +//! - \b I2C_STS_ARB_LOST - Arbitration-lost +//! - \b I2C_STS_NO_ACK - No-acknowledgment (NACK) +//! - \b I2C_STS_REG_ACCESS_RDY - Register-access-ready (ARDY) +//! - \b I2C_STS_RX_DATA_RDY - Receive-data-ready +//! - \b I2C_STS_TX_DATA_RDY - Transmit-data-ready +//! - \b I2C_STS_STOP_CONDITION - Stop condition detected +//! - \b I2C_STS_ADDR_ZERO - Address of all zeros detected +//! - \b I2C_STS_ADDR_TARGET - Addressed as Target +//! - \b I2C_STS_TX_EMPTY - Transmit shift register empty +//! - \b I2C_STS_RX_FULL - Receive shift register full +//! - \b I2C_STS_BUS_BUSY - Bus busy, wait for STOP or reset +//! - \b I2C_STS_NACK_SENT - NACK was sent +//! - \b I2C_STS_TARGET_DIR- Addressed as Target transmitter +// +//***************************************************************************** +static inline uint16_t +I2C_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return contents of the status register + // + return(HWREGH(base + I2C_O_STR)); +} + +//***************************************************************************** +// +//! Clears I2C status flags. +//! +//! \param base is the base address of the I2C instance used. +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! +//! This function clears the specified I2C status flags. The \e stsFlags +//! parameter is the logical OR of the following values: +//! - \b I2C_STS_ARB_LOST +//! - \b I2C_STS_NO_ACK, +//! - \b I2C_STS_REG_ACCESS_RDY +//! - \b I2C_STS_RX_DATA_RDY +//! - \b I2C_STS_STOP_CONDITION +//! - \b I2C_STS_NACK_SENT +//! - \b I2C_STS_TARGET_DIR +//! +//! \note Note that some of the status flags returned by I2C_getStatus() cannot +//! be cleared by this function. Some may only be cleared by hardware or a +//! reset of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_clearStatus(uint32_t base, uint16_t stsFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write to the status registers to clear them. + // + HWREGH(base + I2C_O_STR) = stsFlags; +} + +//***************************************************************************** +// +//! Controls the state of the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! \param config is the command to be issued to the I2C module. +//! +//! This function is used to control the state of the controller and target send and +//! receive operations. The \e config is a logical OR of the following options. +//! +//! One of the following four options: +//! - \b I2C_CONTROLLER_SEND_MODE - Controller-transmitter mode +//! - \b I2C_CONTROLLER_RECEIVE_MODE - Controller-receiver mode +//! - \b I2C_TARGET_SEND_MODE - Target-transmitter mode +//! - \b I2C_TARGET_RECEIVE_MODE - Target-receiver mode +//! +//! Any of the following: +//! - \b I2C_REPEAT_MODE - Sends data until stop bit is set, ignores data count +//! - \b I2C_START_BYTE_MODE - Use start byte mode +//! - \b I2C_FREE_DATA_FORMAT - Use free data format, transfers have no address +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setConfig(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the selected options to the mode register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & + ~(I2C_MDR_CNT | I2C_MDR_TRX | I2C_MDR_RM | + I2C_MDR_STB | I2C_MDR_FDF)) | config; +} + +//***************************************************************************** +// +//! Sets the data byte bit count the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! \param size is the number of bits per data byte. +//! +//! The \e size parameter is a value I2C_BITCOUNT_x where x is the number of +//! bits per data byte. The default and maximum size is 8 bits. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setBitCount(uint32_t base, I2C_BitCount size) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the selected options to the mode register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_BC_M) | + (uint16_t)size; +} + +//***************************************************************************** +// +//! Issues an I2C START condition. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a start condition. This +//! function is only valid when the I2C module specified by the \b base +//! parameter is a controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendStartCondition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the START condition bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_STT; +} + +//***************************************************************************** +// +//! Issues an I2C STOP condition. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a stop condition. This +//! function is only valid when the I2C module specified by the \b base +//! parameter is a controller. +//! +//! To check on the status of the STOP condition, I2C_getStopConditionStatus() +//! can be used. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendStopCondition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the STOP condition bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_STP; +} + +//***************************************************************************** +// +//! Issues a no-acknowledge (NACK) bit. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a NACK bit. This is only +//! applicable when the I2C module is acting as a receiver. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendNACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the NACK mode bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_NACKMOD; +} + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads a byte of data from the I2C Data Receive Register. +//! +//! \return Returns the byte received from by the I2C cast as an uint16_t. +// +//***************************************************************************** +static inline uint16_t +I2C_getData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the contents of the receive register. + // + return(HWREGH(base + I2C_O_DRR)); +} + +//***************************************************************************** +// +//! Transmits a byte from the I2C. +//! +//! \param base is the base address of the I2C instance used. +//! \param data is the data to be transmitted from the I2C Controller. +//! +//! This function places the supplied data into I2C Data Transmit Register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_putData(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Place the data into the transmit register. + // + HWREGH(base + I2C_O_DXR) = data; +} + +//***************************************************************************** +// +//! Get stop condition status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads and returns the stop condition bit status. +//! +//! \return Returns \b true if the STP bit has been set by the device to +//! generate a stop condition when the internal data counter of the I2C module +//! has reached 0. Returns \b false when the STP bit is zero. This bit is +//! automatically cleared after the stop condition has been generated. +// +//***************************************************************************** +static inline bool +I2C_getStopConditionStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Check the stop condition bit and return appropriately. + // + return((HWREGH(base + I2C_O_MDR) & I2C_MDR_STP) != 0U); +} + +//***************************************************************************** +// +//! Set number of bytes to be to transfer or receive when repeat mode is off. +//! +//! \param base is the base address of the I2C instance used. +//! \param count is the value to be put in the I2C data count register. +//! +//! This function sets the number of bytes to transfer or receive when repeat +//! mode is off. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setDataCount(uint32_t base, uint16_t count) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the count value to the appropriate register. + // + HWREGH(base + I2C_O_CNT) = count; +} + +//***************************************************************************** +// +//! Sets the addressing mode to either 7-bit or 10-bit. +//! +//! \param base is the base address of the I2C instance used. +//! \param mode is the address mode, 7-bit or 10-bit. +//! +//! This function configures the I2C module for either a 7-bit address +//! (default) or a 10-bit address. The \e mode parameter configures the address +//! length to 10 bits when its value is \b I2C_ADDR_MODE_10BITS and 7 bits when +//! \b I2C_ADDR_MODE_7BITS. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setAddressMode(uint32_t base, I2C_AddressMode mode) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the appropriate value to the address expansion bit. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_XA) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Sets I2C emulation mode. +//! +//! \param base is the base address of the I2C instance used. +//! \param mode is the emulation mode. +//! +//! This function sets the behavior of the I2C operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b I2C_EMULATION_STOP_SCL_LOW - If SCL is low when the breakpoint occurs, +//! the I2C module stops immediately. If SCL is high, the I2C module waits +//! until SCL becomes low and then stops. +//! - \b I2C_EMULATION_FREE_RUN - I2C operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setEmulationMode(uint32_t base, I2C_EmulationMode mode) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the desired emulation mode to the register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_FREE) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Enables I2C loopback mode. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function enables loopback mode. This mode is only valid during controller +//! mode and is helpful during device testing as it causes data transmitted out +//! of the data transmit register to be received in data receive register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the bit that enables loopback mode. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_DLB; +} + +//***************************************************************************** +// +//! Disables I2C loopback mode. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function disables loopback mode. Loopback mode is disabled by default +//! after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Clear the bit that enables loopback mode. + // + HWREGH(base + I2C_O_MDR) &= ~I2C_MDR_DLB; +} + +//***************************************************************************** +// +//! Returns the current I2C interrupt source. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the event that generated an I2C basic (non-FIFO) +//! interrupt. The possible sources are the following: +//! - \b I2C_INTSRC_NONE +//! - \b I2C_INTSRC_ARB_LOST +//! - \b I2C_INTSRC_NO_ACK +//! - \b I2C_INTSRC_REG_ACCESS_RDY +//! - \b I2C_INTSRC_RX_DATA_RDY +//! - \b I2C_INTSRC_TX_DATA_RDY +//! - \b I2C_INTSRC_STOP_CONDITION +//! - \b I2C_INTSRC_ADDR_TARGET +//! +//! Calling this function will result in hardware automatically clearing the +//! current interrupt code and if ready, loading the next pending enabled +//! interrupt. It will also clear the corresponding interrupt flag if the +//! source is \b I2C_INTSRC_ARB_LOST, \b I2C_INTSRC_NO_ACK, or +//! \b I2C_INTSRC_STOP_CONDITION. +//! +//! \note Note that this function differs from I2C_getInterruptStatus() in that +//! it returns a single interrupt source. I2C_getInterruptSource() will return +//! the status of all interrupt flags possible, including the flags that aren't +//! necessarily enabled to generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline I2C_InterruptSource +I2C_getInterruptSource(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the interrupt source value + // + return((I2C_InterruptSource)(HWREGH(base + I2C_O_ISRC) & + I2C_ISRC_INTCODE_M)); +} + + + + + + + +//***************************************************************************** +// +//! Initializes the I2C Controller. +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param bitRate is the rate of the controller clock signal, SCL. +//! \param dutyCycle is duty cycle of the SCL signal. +//! +//! This function initializes operation of the I2C Controller by configuring the +//! bus speed for the controller. Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! A programmable prescaler in the I2C module divides down the input clock +//! (rate specified by \e sysclkHz) to produce the module clock (calculated to +//! be around 10 MHz in this function). That clock is then divided down further +//! to configure the SCL signal to run at the rate specified by \e bitRate. The +//! \e dutyCycle parameter determines the percentage of time high and time low +//! on the clock signal. The valid values are \b I2C_DUTYCYCLE_33 for 33% and +//! \b I2C_DUTYCYCLE_50 for 50%. +//! +//! The peripheral clock is the system clock. This value is returned by +//! SysCtl_getClock(), or it can be explicitly hard coded if it is +//! constant and known (to save the code/execution overhead of a call to +//! SysCtl_getClock()). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_initController(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle); + +//***************************************************************************** +// +//! Initializes the I2C Controller. +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param bitRate is the rate of the controller clock signal, SCL. +//! \param dutyCycle is duty cycle of the SCL signal. +//! \param moduleFrequency is the module clock used by I2C module +//! +//! This function initializes operation of the I2C Controller by configuring the +//! bus speed for the controller. Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! A programmable prescaler in the I2C module divides down the input clock +//! (rate specified by \e sysclkHz) to produce the module clock (calculated to +//! be around 10 MHz in this function). That clock is then divided down further +//! to configure the SCL signal to run at the rate specified by \e bitRate. The +//! \e dutyCycle parameter determines the percentage of time high and time low +//! on the clock signal. The valid values are \b I2C_DUTYCYCLE_33 for 33% and +//! \b I2C_DUTYCYCLE_50 for 50%. +//! +//! The peripheral clock is the system clock. This value is returned by +//! SysCtl_getClock(), or it can be explicitly hard coded if it is +//! constant and known (to save the code/execution overhead of a call to +//! SysCtl_getClock()). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_initControllerModuleFrequency(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle, uint32_t moduleFrequency); + +//***************************************************************************** +// +//! Enables I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated I2C Controller interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! +//! - \b I2C_INT_ARB_LOST - Arbitration-lost interrupt +//! - \b I2C_INT_NO_ACK - No-acknowledgment (NACK) interrupt +//! - \b I2C_INT_REG_ACCESS_RDY - Register-access-ready interrupt +//! - \b I2C_INT_RX_DATA_RDY - Receive-data-ready interrupt +//! - \b I2C_INT_TX_DATA_RDY - Transmit-data-ready interrupt +//! - \b I2C_INT_STOP_CONDITION - Stop condition detected +//! - \b I2C_INT_ADDR_TARGET - Addressed as target interrupt +//! - \b I2C_INT_RXFF - RX FIFO level interrupt +//! - \b I2C_INT_TXFF - TX FIFO level interrupt +//! +//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO +//! interrupt vector. All others are associated with the I2C basic interrupt. +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! This function disables the indicated I2C Target interrupt sources. Only +//! the sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to I2C_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current I2C interrupt status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the interrupt status for the I2C module. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! - \b I2C_INT_ARB_LOST +//! - \b I2C_INT_NO_ACK +//! - \b I2C_INT_REG_ACCESS_RDY +//! - \b I2C_INT_RX_DATA_RDY +//! - \b I2C_INT_TX_DATA_RDY +//! - \b I2C_INT_STOP_CONDITION +//! - \b I2C_INT_ADDR_TARGET +//! - \b I2C_INT_RXFF +//! - \b I2C_INT_TXFF +//! +//! \note This function will only return the status flags associated with +//! interrupts. However, a flag may be set even if its corresponding interrupt +//! is disabled. +// +//***************************************************************************** +extern uint32_t +I2C_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified I2C interrupt sources are cleared, so that they no longer +//! assert. This function must be called in the interrupt handler to keep the +//! interrupt from being triggered again immediately upon exit. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to I2C_enableInterrupt(). +//! +//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO +//! interrupt vector. All others are associated with the I2C basic interrupt. +//! +//! \note Also note that some of the status flags returned by +//! I2C_getInterruptStatus() cannot be cleared by this function. Some may only +//! be cleared by hardware or a reset of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_clearInterruptStatus(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Configures I2C Module Clock Frequency +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! +//! This function configures I2C module clock frequency by initializing +//! prescale register based on SYSCLK frequency. +//! Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_configureModuleFrequency(uint32_t base, uint32_t sysclkHz); + +//***************************************************************************** +// +//! Configures I2C Module Clock Frequency with a given module clock +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param moduleFrequency is the rate of the module clock used by I2C module +//! This function configures I2C module clock frequency by initializing +//! prescale register based on SYSCLK frequency. +//! Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_configureModuleClockFrequency(uint32_t base, uint32_t sysclkHz, uint32_t moduleFrequency); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // I2C_H diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_adc.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_adc.h new file mode 100644 index 0000000..89bd529 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_adc.h @@ -0,0 +1,911 @@ +//########################################################################### +// +// FILE: hw_adc.h +// +// TITLE: Definitions for the ADC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ADC_H +#define HW_ADC_H + +//************************************************************************************************* +// +// The following are defines for the ADC register offsets +// +//************************************************************************************************* +#define ADC_O_CTL1 0x0U // ADC Control 1 Register +#define ADC_O_CTL2 0x1U // ADC Control 2 Register +#define ADC_O_BURSTCTL 0x2U // ADC Burst Control Register +#define ADC_O_INTFLG 0x3U // ADC Interrupt Flag Register +#define ADC_O_INTFLGCLR 0x4U // ADC Interrupt Flag Clear Register +#define ADC_O_INTOVF 0x5U // ADC Interrupt Overflow Register +#define ADC_O_INTOVFCLR 0x6U // ADC Interrupt Overflow Clear Register +#define ADC_O_INTSEL1N2 0x7U // ADC Interrupt 1 and 2 Selection Register +#define ADC_O_INTSEL3N4 0x8U // ADC Interrupt 3 and 4 Selection Register +#define ADC_O_SOCPRICTL 0x9U // ADC SOC Priority Control Register +#define ADC_O_INTSOCSEL1 0xAU // ADC Interrupt SOC Selection 1 Register +#define ADC_O_INTSOCSEL2 0xBU // ADC Interrupt SOC Selection 2 Register +#define ADC_O_SOCFLG1 0xCU // ADC SOC Flag 1 Register +#define ADC_O_SOCFRC1 0xDU // ADC SOC Force 1 Register +#define ADC_O_SOCOVF1 0xEU // ADC SOC Overflow 1 Register +#define ADC_O_SOCOVFCLR1 0xFU // ADC SOC Overflow Clear 1 Register +#define ADC_O_SOC0CTL 0x10U // ADC SOC0 Control Register +#define ADC_O_SOC1CTL 0x12U // ADC SOC1 Control Register +#define ADC_O_SOC2CTL 0x14U // ADC SOC2 Control Register +#define ADC_O_SOC3CTL 0x16U // ADC SOC3 Control Register +#define ADC_O_SOC4CTL 0x18U // ADC SOC4 Control Register +#define ADC_O_SOC5CTL 0x1AU // ADC SOC5 Control Register +#define ADC_O_SOC6CTL 0x1CU // ADC SOC6 Control Register +#define ADC_O_SOC7CTL 0x1EU // ADC SOC7 Control Register +#define ADC_O_SOC8CTL 0x20U // ADC SOC8 Control Register +#define ADC_O_SOC9CTL 0x22U // ADC SOC9 Control Register +#define ADC_O_SOC10CTL 0x24U // ADC SOC10 Control Register +#define ADC_O_SOC11CTL 0x26U // ADC SOC11 Control Register +#define ADC_O_SOC12CTL 0x28U // ADC SOC12 Control Register +#define ADC_O_SOC13CTL 0x2AU // ADC SOC13 Control Register +#define ADC_O_SOC14CTL 0x2CU // ADC SOC14 Control Register +#define ADC_O_SOC15CTL 0x2EU // ADC SOC15 Control Register +#define ADC_O_EVTSTAT 0x30U // ADC Event Status Register +#define ADC_O_EVTCLR 0x32U // ADC Event Clear Register +#define ADC_O_EVTSEL 0x34U // ADC Event Selection Register +#define ADC_O_EVTINTSEL 0x36U // ADC Event Interrupt Selection Register +#define ADC_O_OSDETECT 0x38U // ADC Open and Shorts Detect Register +#define ADC_O_COUNTER 0x39U // ADC Counter Register +#define ADC_O_REV 0x3AU // ADC Revision Register +#define ADC_O_OFFTRIM 0x3BU // ADC Offset Trim Register +#define ADC_O_PPB1CONFIG 0x40U // ADC PPB1 Config Register +#define ADC_O_PPB1STAMP 0x41U // ADC PPB1 Sample Delay Time Stamp Register +#define ADC_O_PPB1OFFCAL 0x42U // ADC PPB1 Offset Calibration Register +#define ADC_O_PPB1OFFREF 0x43U // ADC PPB1 Offset Reference Register +#define ADC_O_PPB1TRIPHI 0x44U // ADC PPB1 Trip High Register +#define ADC_O_PPB1TRIPLO 0x46U // ADC PPB1 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB2CONFIG 0x48U // ADC PPB2 Config Register +#define ADC_O_PPB2STAMP 0x49U // ADC PPB2 Sample Delay Time Stamp Register +#define ADC_O_PPB2OFFCAL 0x4AU // ADC PPB2 Offset Calibration Register +#define ADC_O_PPB2OFFREF 0x4BU // ADC PPB2 Offset Reference Register +#define ADC_O_PPB2TRIPHI 0x4CU // ADC PPB2 Trip High Register +#define ADC_O_PPB2TRIPLO 0x4EU // ADC PPB2 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB3CONFIG 0x50U // ADC PPB3 Config Register +#define ADC_O_PPB3STAMP 0x51U // ADC PPB3 Sample Delay Time Stamp Register +#define ADC_O_PPB3OFFCAL 0x52U // ADC PPB3 Offset Calibration Register +#define ADC_O_PPB3OFFREF 0x53U // ADC PPB3 Offset Reference Register +#define ADC_O_PPB3TRIPHI 0x54U // ADC PPB3 Trip High Register +#define ADC_O_PPB3TRIPLO 0x56U // ADC PPB3 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB4CONFIG 0x58U // ADC PPB4 Config Register +#define ADC_O_PPB4STAMP 0x59U // ADC PPB4 Sample Delay Time Stamp Register +#define ADC_O_PPB4OFFCAL 0x5AU // ADC PPB4 Offset Calibration Register +#define ADC_O_PPB4OFFREF 0x5BU // ADC PPB4 Offset Reference Register +#define ADC_O_PPB4TRIPHI 0x5CU // ADC PPB4 Trip High Register +#define ADC_O_PPB4TRIPLO 0x5EU // ADC PPB4 Trip Low/Trigger Time Stamp Register +#define ADC_O_INLTRIM1 0x70U // ADC Linearity Trim 1 Register +#define ADC_O_INLTRIM2 0x72U // ADC Linearity Trim 2 Register +#define ADC_O_INLTRIM3 0x74U // ADC Linearity Trim 3 Register +#define ADC_O_INLTRIM4 0x76U // ADC Linearity Trim 4 Register +#define ADC_O_INLTRIM5 0x78U // ADC Linearity Trim 5 Register +#define ADC_O_INLTRIM6 0x7AU // ADC Linearity Trim 6 Register + +#define ADC_O_RESULT0 0x0U // ADC Result 0 Register +#define ADC_O_RESULT1 0x1U // ADC Result 1 Register +#define ADC_O_RESULT2 0x2U // ADC Result 2 Register +#define ADC_O_RESULT3 0x3U // ADC Result 3 Register +#define ADC_O_RESULT4 0x4U // ADC Result 4 Register +#define ADC_O_RESULT5 0x5U // ADC Result 5 Register +#define ADC_O_RESULT6 0x6U // ADC Result 6 Register +#define ADC_O_RESULT7 0x7U // ADC Result 7 Register +#define ADC_O_RESULT8 0x8U // ADC Result 8 Register +#define ADC_O_RESULT9 0x9U // ADC Result 9 Register +#define ADC_O_RESULT10 0xAU // ADC Result 10 Register +#define ADC_O_RESULT11 0xBU // ADC Result 11 Register +#define ADC_O_RESULT12 0xCU // ADC Result 12 Register +#define ADC_O_RESULT13 0xDU // ADC Result 13 Register +#define ADC_O_RESULT14 0xEU // ADC Result 14 Register +#define ADC_O_RESULT15 0xFU // ADC Result 15 Register +#define ADC_O_PPB1RESULT 0x10U // ADC Post Processing Block 1 Result Register +#define ADC_O_PPB2RESULT 0x12U // ADC Post Processing Block 2 Result Register +#define ADC_O_PPB3RESULT 0x14U // ADC Post Processing Block 3 Result Register +#define ADC_O_PPB4RESULT 0x16U // ADC Post Processing Block 4 Result Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCTL1 register +// +//************************************************************************************************* +#define ADC_CTL1_INTPULSEPOS 0x4U // ADC Interrupt Pulse Position +#define ADC_CTL1_ADCPWDNZ 0x80U // ADC Power Down +#define ADC_CTL1_ADCBSYCHN_S 8U +#define ADC_CTL1_ADCBSYCHN_M 0xF00U // ADC Busy Channel +#define ADC_CTL1_ADCBSY 0x2000U // ADC Busy + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCTL2 register +// +//************************************************************************************************* +#define ADC_CTL2_PRESCALE_S 0U +#define ADC_CTL2_PRESCALE_M 0xFU // ADC Clock Prescaler +#define ADC_CTL2_RESOLUTION 0x40U // SOC Conversion Resolution +#define ADC_CTL2_SIGNALMODE 0x80U // SOC Signaling Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCBURSTCTL register +// +//************************************************************************************************* +#define ADC_BURSTCTL_BURSTTRIGSEL_S 0U +#define ADC_BURSTCTL_BURSTTRIGSEL_M 0x3FU // SOC Burst Trigger Source Select +#define ADC_BURSTCTL_BURSTSIZE_S 8U +#define ADC_BURSTCTL_BURSTSIZE_M 0xF00U // SOC Burst Size Select +#define ADC_BURSTCTL_BURSTEN 0x8000U // SOC Burst Mode Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTFLG register +// +//************************************************************************************************* +#define ADC_INTFLG_ADCINT1 0x1U // ADC Interrupt 1 Flag +#define ADC_INTFLG_ADCINT2 0x2U // ADC Interrupt 2 Flag +#define ADC_INTFLG_ADCINT3 0x4U // ADC Interrupt 3 Flag +#define ADC_INTFLG_ADCINT4 0x8U // ADC Interrupt 4 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTFLGCLR register +// +//************************************************************************************************* +#define ADC_INTFLGCLR_ADCINT1 0x1U // ADC Interrupt 1 Flag Clear +#define ADC_INTFLGCLR_ADCINT2 0x2U // ADC Interrupt 2 Flag Clear +#define ADC_INTFLGCLR_ADCINT3 0x4U // ADC Interrupt 3 Flag Clear +#define ADC_INTFLGCLR_ADCINT4 0x8U // ADC Interrupt 4 Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTOVF register +// +//************************************************************************************************* +#define ADC_INTOVF_ADCINT1 0x1U // ADC Interrupt 1 Overflow Flags +#define ADC_INTOVF_ADCINT2 0x2U // ADC Interrupt 2 Overflow Flags +#define ADC_INTOVF_ADCINT3 0x4U // ADC Interrupt 3 Overflow Flags +#define ADC_INTOVF_ADCINT4 0x8U // ADC Interrupt 4 Overflow Flags + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTOVFCLR register +// +//************************************************************************************************* +#define ADC_INTOVFCLR_ADCINT1 0x1U // ADC Interrupt 1 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT2 0x2U // ADC Interrupt 2 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT3 0x4U // ADC Interrupt 3 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT4 0x8U // ADC Interrupt 4 Overflow Clear Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSEL1N2 register +// +//************************************************************************************************* +#define ADC_INTSEL1N2_INT1SEL_S 0U +#define ADC_INTSEL1N2_INT1SEL_M 0xFU // ADCINT1 EOC Source Select +#define ADC_INTSEL1N2_INT1E 0x20U // ADCINT1 Interrupt Enable +#define ADC_INTSEL1N2_INT1CONT 0x40U // ADCINT1 Continue to Interrupt Mode +#define ADC_INTSEL1N2_INT2SEL_S 8U +#define ADC_INTSEL1N2_INT2SEL_M 0xF00U // ADCINT2 EOC Source Select +#define ADC_INTSEL1N2_INT2E 0x2000U // ADCINT2 Interrupt Enable +#define ADC_INTSEL1N2_INT2CONT 0x4000U // ADCINT2 Continue to Interrupt Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSEL3N4 register +// +//************************************************************************************************* +#define ADC_INTSEL3N4_INT3SEL_S 0U +#define ADC_INTSEL3N4_INT3SEL_M 0xFU // ADCINT3 EOC Source Select +#define ADC_INTSEL3N4_INT3E 0x20U // ADCINT3 Interrupt Enable +#define ADC_INTSEL3N4_INT3CONT 0x40U // ADCINT3 Continue to Interrupt Mode +#define ADC_INTSEL3N4_INT4SEL_S 8U +#define ADC_INTSEL3N4_INT4SEL_M 0xF00U // ADCINT4 EOC Source Select +#define ADC_INTSEL3N4_INT4E 0x2000U // ADCINT4 Interrupt Enable +#define ADC_INTSEL3N4_INT4CONT 0x4000U // ADCINT4 Continue to Interrupt Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCPRICTL register +// +//************************************************************************************************* +#define ADC_SOCPRICTL_SOCPRIORITY_S 0U +#define ADC_SOCPRICTL_SOCPRIORITY_M 0x1FU // SOC Priority +#define ADC_SOCPRICTL_RRPOINTER_S 5U +#define ADC_SOCPRICTL_RRPOINTER_M 0x3E0U // Round Robin Pointer + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSOCSEL1 register +// +//************************************************************************************************* +#define ADC_INTSOCSEL1_SOC0_S 0U +#define ADC_INTSOCSEL1_SOC0_M 0x3U // SOC0 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC1_S 2U +#define ADC_INTSOCSEL1_SOC1_M 0xCU // SOC1 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC2_S 4U +#define ADC_INTSOCSEL1_SOC2_M 0x30U // SOC2 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC3_S 6U +#define ADC_INTSOCSEL1_SOC3_M 0xC0U // SOC3 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC4_S 8U +#define ADC_INTSOCSEL1_SOC4_M 0x300U // SOC4 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC5_S 10U +#define ADC_INTSOCSEL1_SOC5_M 0xC00U // SOC5 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC6_S 12U +#define ADC_INTSOCSEL1_SOC6_M 0x3000U // SOC6 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC7_S 14U +#define ADC_INTSOCSEL1_SOC7_M 0xC000U // SOC7 ADC Interrupt Trigger Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSOCSEL2 register +// +//************************************************************************************************* +#define ADC_INTSOCSEL2_SOC8_S 0U +#define ADC_INTSOCSEL2_SOC8_M 0x3U // SOC8 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC9_S 2U +#define ADC_INTSOCSEL2_SOC9_M 0xCU // SOC9 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC10_S 4U +#define ADC_INTSOCSEL2_SOC10_M 0x30U // SOC10 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC11_S 6U +#define ADC_INTSOCSEL2_SOC11_M 0xC0U // SOC11 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC12_S 8U +#define ADC_INTSOCSEL2_SOC12_M 0x300U // SOC12 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC13_S 10U +#define ADC_INTSOCSEL2_SOC13_M 0xC00U // SOC13 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC14_S 12U +#define ADC_INTSOCSEL2_SOC14_M 0x3000U // SOC14 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC15_S 14U +#define ADC_INTSOCSEL2_SOC15_M 0xC000U // SOC15 ADC Interrupt Trigger Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCFLG1 register +// +//************************************************************************************************* +#define ADC_SOCFLG1_SOC0 0x1U // SOC0 Start of Conversion Flag +#define ADC_SOCFLG1_SOC1 0x2U // SOC1 Start of Conversion Flag +#define ADC_SOCFLG1_SOC2 0x4U // SOC2 Start of Conversion Flag +#define ADC_SOCFLG1_SOC3 0x8U // SOC3 Start of Conversion Flag +#define ADC_SOCFLG1_SOC4 0x10U // SOC4 Start of Conversion Flag +#define ADC_SOCFLG1_SOC5 0x20U // SOC5 Start of Conversion Flag +#define ADC_SOCFLG1_SOC6 0x40U // SOC6 Start of Conversion Flag +#define ADC_SOCFLG1_SOC7 0x80U // SOC7 Start of Conversion Flag +#define ADC_SOCFLG1_SOC8 0x100U // SOC8 Start of Conversion Flag +#define ADC_SOCFLG1_SOC9 0x200U // SOC9 Start of Conversion Flag +#define ADC_SOCFLG1_SOC10 0x400U // SOC10 Start of Conversion Flag +#define ADC_SOCFLG1_SOC11 0x800U // SOC11 Start of Conversion Flag +#define ADC_SOCFLG1_SOC12 0x1000U // SOC12 Start of Conversion Flag +#define ADC_SOCFLG1_SOC13 0x2000U // SOC13 Start of Conversion Flag +#define ADC_SOCFLG1_SOC14 0x4000U // SOC14 Start of Conversion Flag +#define ADC_SOCFLG1_SOC15 0x8000U // SOC15 Start of Conversion Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCFRC1 register +// +//************************************************************************************************* +#define ADC_SOCFRC1_SOC0 0x1U // SOC0 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC1 0x2U // SOC1 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC2 0x4U // SOC2 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC3 0x8U // SOC3 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC4 0x10U // SOC4 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC5 0x20U // SOC5 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC6 0x40U // SOC6 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC7 0x80U // SOC7 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC8 0x100U // SOC8 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC9 0x200U // SOC9 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC10 0x400U // SOC10 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC11 0x800U // SOC11 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC12 0x1000U // SOC12 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC13 0x2000U // SOC13 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC14 0x4000U // SOC14 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC15 0x8000U // SOC15 Force Start of Conversion Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOVF1 register +// +//************************************************************************************************* +#define ADC_SOCOVF1_SOC0 0x1U // SOC0 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC1 0x2U // SOC1 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC2 0x4U // SOC2 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC3 0x8U // SOC3 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC4 0x10U // SOC4 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC5 0x20U // SOC5 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC6 0x40U // SOC6 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC7 0x80U // SOC7 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC8 0x100U // SOC8 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC9 0x200U // SOC9 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC10 0x400U // SOC10 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC11 0x800U // SOC11 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC12 0x1000U // SOC12 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC13 0x2000U // SOC13 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC14 0x4000U // SOC14 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC15 0x8000U // SOC15 Start of Conversion Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOVFCLR1 register +// +//************************************************************************************************* +#define ADC_SOCOVFCLR1_SOC0 0x1U // SOC0 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC1 0x2U // SOC1 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC2 0x4U // SOC2 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC3 0x8U // SOC3 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC4 0x10U // SOC4 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC5 0x20U // SOC5 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC6 0x40U // SOC6 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC7 0x80U // SOC7 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC8 0x100U // SOC8 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC9 0x200U // SOC9 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC10 0x400U // SOC10 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC11 0x800U // SOC11 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC12 0x1000U // SOC12 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC13 0x2000U // SOC13 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC14 0x4000U // SOC14 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC15 0x8000U // SOC15 Clear Start of Conversion Overflow Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC0CTL register +// +//************************************************************************************************* +#define ADC_SOC0CTL_ACQPS_S 0U +#define ADC_SOC0CTL_ACQPS_M 0x1FFU // SOC0 Acquisition Prescale +#define ADC_SOC0CTL_CHSEL_S 15U +#define ADC_SOC0CTL_CHSEL_M 0x78000U // SOC0 Channel Select +#define ADC_SOC0CTL_TRIGSEL_S 20U +#define ADC_SOC0CTL_TRIGSEL_M 0x1F00000U // SOC0 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC1CTL register +// +//************************************************************************************************* +#define ADC_SOC1CTL_ACQPS_S 0U +#define ADC_SOC1CTL_ACQPS_M 0x1FFU // SOC1 Acquisition Prescale +#define ADC_SOC1CTL_CHSEL_S 15U +#define ADC_SOC1CTL_CHSEL_M 0x78000U // SOC1 Channel Select +#define ADC_SOC1CTL_TRIGSEL_S 20U +#define ADC_SOC1CTL_TRIGSEL_M 0x1F00000U // SOC1 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC2CTL register +// +//************************************************************************************************* +#define ADC_SOC2CTL_ACQPS_S 0U +#define ADC_SOC2CTL_ACQPS_M 0x1FFU // SOC2 Acquisition Prescale +#define ADC_SOC2CTL_CHSEL_S 15U +#define ADC_SOC2CTL_CHSEL_M 0x78000U // SOC2 Channel Select +#define ADC_SOC2CTL_TRIGSEL_S 20U +#define ADC_SOC2CTL_TRIGSEL_M 0x1F00000U // SOC2 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC3CTL register +// +//************************************************************************************************* +#define ADC_SOC3CTL_ACQPS_S 0U +#define ADC_SOC3CTL_ACQPS_M 0x1FFU // SOC3 Acquisition Prescale +#define ADC_SOC3CTL_CHSEL_S 15U +#define ADC_SOC3CTL_CHSEL_M 0x78000U // SOC3 Channel Select +#define ADC_SOC3CTL_TRIGSEL_S 20U +#define ADC_SOC3CTL_TRIGSEL_M 0x1F00000U // SOC3 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC4CTL register +// +//************************************************************************************************* +#define ADC_SOC4CTL_ACQPS_S 0U +#define ADC_SOC4CTL_ACQPS_M 0x1FFU // SOC4 Acquisition Prescale +#define ADC_SOC4CTL_CHSEL_S 15U +#define ADC_SOC4CTL_CHSEL_M 0x78000U // SOC4 Channel Select +#define ADC_SOC4CTL_TRIGSEL_S 20U +#define ADC_SOC4CTL_TRIGSEL_M 0x1F00000U // SOC4 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC5CTL register +// +//************************************************************************************************* +#define ADC_SOC5CTL_ACQPS_S 0U +#define ADC_SOC5CTL_ACQPS_M 0x1FFU // SOC5 Acquisition Prescale +#define ADC_SOC5CTL_CHSEL_S 15U +#define ADC_SOC5CTL_CHSEL_M 0x78000U // SOC5 Channel Select +#define ADC_SOC5CTL_TRIGSEL_S 20U +#define ADC_SOC5CTL_TRIGSEL_M 0x1F00000U // SOC5 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC6CTL register +// +//************************************************************************************************* +#define ADC_SOC6CTL_ACQPS_S 0U +#define ADC_SOC6CTL_ACQPS_M 0x1FFU // SOC6 Acquisition Prescale +#define ADC_SOC6CTL_CHSEL_S 15U +#define ADC_SOC6CTL_CHSEL_M 0x78000U // SOC6 Channel Select +#define ADC_SOC6CTL_TRIGSEL_S 20U +#define ADC_SOC6CTL_TRIGSEL_M 0x1F00000U // SOC6 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC7CTL register +// +//************************************************************************************************* +#define ADC_SOC7CTL_ACQPS_S 0U +#define ADC_SOC7CTL_ACQPS_M 0x1FFU // SOC7 Acquisition Prescale +#define ADC_SOC7CTL_CHSEL_S 15U +#define ADC_SOC7CTL_CHSEL_M 0x78000U // SOC7 Channel Select +#define ADC_SOC7CTL_TRIGSEL_S 20U +#define ADC_SOC7CTL_TRIGSEL_M 0x1F00000U // SOC7 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC8CTL register +// +//************************************************************************************************* +#define ADC_SOC8CTL_ACQPS_S 0U +#define ADC_SOC8CTL_ACQPS_M 0x1FFU // SOC8 Acquisition Prescale +#define ADC_SOC8CTL_CHSEL_S 15U +#define ADC_SOC8CTL_CHSEL_M 0x78000U // SOC8 Channel Select +#define ADC_SOC8CTL_TRIGSEL_S 20U +#define ADC_SOC8CTL_TRIGSEL_M 0x1F00000U // SOC8 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC9CTL register +// +//************************************************************************************************* +#define ADC_SOC9CTL_ACQPS_S 0U +#define ADC_SOC9CTL_ACQPS_M 0x1FFU // SOC9 Acquisition Prescale +#define ADC_SOC9CTL_CHSEL_S 15U +#define ADC_SOC9CTL_CHSEL_M 0x78000U // SOC9 Channel Select +#define ADC_SOC9CTL_TRIGSEL_S 20U +#define ADC_SOC9CTL_TRIGSEL_M 0x1F00000U // SOC9 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC10CTL register +// +//************************************************************************************************* +#define ADC_SOC10CTL_ACQPS_S 0U +#define ADC_SOC10CTL_ACQPS_M 0x1FFU // SOC10 Acquisition Prescale +#define ADC_SOC10CTL_CHSEL_S 15U +#define ADC_SOC10CTL_CHSEL_M 0x78000U // SOC10 Channel Select +#define ADC_SOC10CTL_TRIGSEL_S 20U +#define ADC_SOC10CTL_TRIGSEL_M 0x1F00000U // SOC10 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC11CTL register +// +//************************************************************************************************* +#define ADC_SOC11CTL_ACQPS_S 0U +#define ADC_SOC11CTL_ACQPS_M 0x1FFU // SOC11 Acquisition Prescale +#define ADC_SOC11CTL_CHSEL_S 15U +#define ADC_SOC11CTL_CHSEL_M 0x78000U // SOC11 Channel Select +#define ADC_SOC11CTL_TRIGSEL_S 20U +#define ADC_SOC11CTL_TRIGSEL_M 0x1F00000U // SOC11 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC12CTL register +// +//************************************************************************************************* +#define ADC_SOC12CTL_ACQPS_S 0U +#define ADC_SOC12CTL_ACQPS_M 0x1FFU // SOC12 Acquisition Prescale +#define ADC_SOC12CTL_CHSEL_S 15U +#define ADC_SOC12CTL_CHSEL_M 0x78000U // SOC12 Channel Select +#define ADC_SOC12CTL_TRIGSEL_S 20U +#define ADC_SOC12CTL_TRIGSEL_M 0x1F00000U // SOC12 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC13CTL register +// +//************************************************************************************************* +#define ADC_SOC13CTL_ACQPS_S 0U +#define ADC_SOC13CTL_ACQPS_M 0x1FFU // SOC13 Acquisition Prescale +#define ADC_SOC13CTL_CHSEL_S 15U +#define ADC_SOC13CTL_CHSEL_M 0x78000U // SOC13 Channel Select +#define ADC_SOC13CTL_TRIGSEL_S 20U +#define ADC_SOC13CTL_TRIGSEL_M 0x1F00000U // SOC13 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC14CTL register +// +//************************************************************************************************* +#define ADC_SOC14CTL_ACQPS_S 0U +#define ADC_SOC14CTL_ACQPS_M 0x1FFU // SOC14 Acquisition Prescale +#define ADC_SOC14CTL_CHSEL_S 15U +#define ADC_SOC14CTL_CHSEL_M 0x78000U // SOC14 Channel Select +#define ADC_SOC14CTL_TRIGSEL_S 20U +#define ADC_SOC14CTL_TRIGSEL_M 0x1F00000U // SOC14 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC15CTL register +// +//************************************************************************************************* +#define ADC_SOC15CTL_ACQPS_S 0U +#define ADC_SOC15CTL_ACQPS_M 0x1FFU // SOC15 Acquisition Prescale +#define ADC_SOC15CTL_CHSEL_S 15U +#define ADC_SOC15CTL_CHSEL_M 0x78000U // SOC15 Channel Select +#define ADC_SOC15CTL_TRIGSEL_S 20U +#define ADC_SOC15CTL_TRIGSEL_M 0x1F00000U // SOC15 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTSTAT register +// +//************************************************************************************************* +#define ADC_EVTSTAT_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Flag +#define ADC_EVTSTAT_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Flag +#define ADC_EVTSTAT_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Flag +#define ADC_EVTSTAT_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Flag +#define ADC_EVTSTAT_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Flag +#define ADC_EVTSTAT_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Flag +#define ADC_EVTSTAT_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Flag +#define ADC_EVTSTAT_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Flag +#define ADC_EVTSTAT_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Flag +#define ADC_EVTSTAT_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Flag +#define ADC_EVTSTAT_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Flag +#define ADC_EVTSTAT_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTCLR register +// +//************************************************************************************************* +#define ADC_EVTCLR_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Clear +#define ADC_EVTCLR_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Clear +#define ADC_EVTCLR_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Clear +#define ADC_EVTCLR_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Clear +#define ADC_EVTCLR_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Clear +#define ADC_EVTCLR_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Clear +#define ADC_EVTCLR_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Clear +#define ADC_EVTCLR_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Clear +#define ADC_EVTCLR_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Clear +#define ADC_EVTCLR_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Clear +#define ADC_EVTCLR_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Clear +#define ADC_EVTCLR_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTSEL register +// +//************************************************************************************************* +#define ADC_EVTSEL_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Event Enable +#define ADC_EVTSEL_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Event Enable +#define ADC_EVTSEL_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Event Enable +#define ADC_EVTSEL_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Event Enable +#define ADC_EVTSEL_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Event Enable +#define ADC_EVTSEL_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Event Enable +#define ADC_EVTSEL_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Event Enable +#define ADC_EVTSEL_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Event Enable +#define ADC_EVTSEL_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Event Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTINTSEL register +// +//************************************************************************************************* +#define ADC_EVTINTSEL_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Interrupt + // Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCOSDETECT register +// +//************************************************************************************************* +#define ADC_OSDETECT_DETECTCFG_S 0U +#define ADC_OSDETECT_DETECTCFG_M 0x7U // ADC Opens and Shorts Detect Configuration + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCOUNTER register +// +//************************************************************************************************* +#define ADC_COUNTER_FREECOUNT_S 0U +#define ADC_COUNTER_FREECOUNT_M 0xFFFU // ADC Free Running Counter Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCREV register +// +//************************************************************************************************* +#define ADC_REV_TYPE_S 0U +#define ADC_REV_TYPE_M 0xFFU // ADC Type +#define ADC_REV_REV_S 8U +#define ADC_REV_REV_M 0xFF00U // ADC Revision + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCOFFTRIM register +// +//************************************************************************************************* +#define ADC_OFFTRIM_OFFTRIM_S 0U +#define ADC_OFFTRIM_OFFTRIM_M 0xFFU // ADC Offset Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1CONFIG register +// +//************************************************************************************************* +#define ADC_PPB1CONFIG_CONFIG_S 0U +#define ADC_PPB1CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 1 Configuration +#define ADC_PPB1CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 1 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1STAMP register +// +//************************************************************************************************* +#define ADC_PPB1STAMP_DLYSTAMP_S 0U +#define ADC_PPB1STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 1 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB1OFFCAL_OFFCAL_S 0U +#define ADC_PPB1OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB1TRIPHI_LIMITHI_S 0U +#define ADC_PPB1TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 1 Trip High Limit +#define ADC_PPB1TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB1TRIPLO_LIMITLO_S 0U +#define ADC_PPB1TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 1 Trip Low Limit +#define ADC_PPB1TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB1TRIPLO_REQSTAMP_S 20U +#define ADC_PPB1TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 1 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2CONFIG register +// +//************************************************************************************************* +#define ADC_PPB2CONFIG_CONFIG_S 0U +#define ADC_PPB2CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 2 Configuration +#define ADC_PPB2CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 2 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2STAMP register +// +//************************************************************************************************* +#define ADC_PPB2STAMP_DLYSTAMP_S 0U +#define ADC_PPB2STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 2 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB2OFFCAL_OFFCAL_S 0U +#define ADC_PPB2OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB2TRIPHI_LIMITHI_S 0U +#define ADC_PPB2TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 2 Trip High Limit +#define ADC_PPB2TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB2TRIPLO_LIMITLO_S 0U +#define ADC_PPB2TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 2 Trip Low Limit +#define ADC_PPB2TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB2TRIPLO_REQSTAMP_S 20U +#define ADC_PPB2TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 2 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3CONFIG register +// +//************************************************************************************************* +#define ADC_PPB3CONFIG_CONFIG_S 0U +#define ADC_PPB3CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 3 Configuration +#define ADC_PPB3CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 3 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3STAMP register +// +//************************************************************************************************* +#define ADC_PPB3STAMP_DLYSTAMP_S 0U +#define ADC_PPB3STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 3 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB3OFFCAL_OFFCAL_S 0U +#define ADC_PPB3OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB3TRIPHI_LIMITHI_S 0U +#define ADC_PPB3TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 3 Trip High Limit +#define ADC_PPB3TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB3TRIPLO_LIMITLO_S 0U +#define ADC_PPB3TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 3 Trip Low Limit +#define ADC_PPB3TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB3TRIPLO_REQSTAMP_S 20U +#define ADC_PPB3TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 3 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4CONFIG register +// +//************************************************************************************************* +#define ADC_PPB4CONFIG_CONFIG_S 0U +#define ADC_PPB4CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 4 Configuration +#define ADC_PPB4CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 4 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4STAMP register +// +//************************************************************************************************* +#define ADC_PPB4STAMP_DLYSTAMP_S 0U +#define ADC_PPB4STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 4 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB4OFFCAL_OFFCAL_S 0U +#define ADC_PPB4OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB4TRIPHI_LIMITHI_S 0U +#define ADC_PPB4TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 4 Trip High Limit +#define ADC_PPB4TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB4TRIPLO_LIMITLO_S 0U +#define ADC_PPB4TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 4 Trip Low Limit +#define ADC_PPB4TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB4TRIPLO_REQSTAMP_S 20U +#define ADC_PPB4TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 4 Request Time Stamp + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1RESULT register +// +//************************************************************************************************* +#define ADC_PPB1RESULT_PPBRESULT_S 0U +#define ADC_PPB1RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB1RESULT_SIGN_S 16U +#define ADC_PPB1RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2RESULT register +// +//************************************************************************************************* +#define ADC_PPB2RESULT_PPBRESULT_S 0U +#define ADC_PPB2RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB2RESULT_SIGN_S 16U +#define ADC_PPB2RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3RESULT register +// +//************************************************************************************************* +#define ADC_PPB3RESULT_PPBRESULT_S 0U +#define ADC_PPB3RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB3RESULT_SIGN_S 16U +#define ADC_PPB3RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4RESULT register +// +//************************************************************************************************* +#define ADC_PPB4RESULT_PPBRESULT_S 0U +#define ADC_PPB4RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB4RESULT_SIGN_S 16U +#define ADC_PPB4RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_asysctl.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_asysctl.h new file mode 100644 index 0000000..4ee1c62 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_asysctl.h @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: hw_asysctl.h +// +// TITLE: Definitions for the ASYSCTL registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ASYSCTL_H +#define HW_ASYSCTL_H + +//************************************************************************************************* +// +// The following are defines for the ASYSCTL register offsets +// +//************************************************************************************************* +#define ASYSCTL_O_INTOSC1TRIM 0x20U // Internal Oscillator 1 Trim Register +#define ASYSCTL_O_INTOSC2TRIM 0x22U // Internal Oscillator 2 Trim Register +#define ASYSCTL_O_TSNSCTL 0x26U // Temperature Sensor Control Register +#define ASYSCTL_O_LOCK 0x2EU // Lock Register +#define ASYSCTL_O_ANAREFTRIMA 0x36U // Analog Reference Trim A Register +#define ASYSCTL_O_ANAREFTRIMB 0x38U // Analog Reference Trim B Register +#define ASYSCTL_O_ANAREFTRIMC 0x3AU // Analog Reference Trim C Register +#define ASYSCTL_O_ANAREFTRIMD 0x3CU // Analog Reference Trim D Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTOSC1TRIM register +// +//************************************************************************************************* +#define ASYSCTL_INTOSC1TRIM_VALFINETRIM_S 0U +#define ASYSCTL_INTOSC1TRIM_VALFINETRIM_M 0xFFFU // Oscillator Value Fine Trim Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTOSC2TRIM register +// +//************************************************************************************************* +#define ASYSCTL_INTOSC2TRIM_VALFINETRIM_S 0U +#define ASYSCTL_INTOSC2TRIM_VALFINETRIM_M 0xFFFU // Oscillator Value Fine Trim Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TSNSCTL register +// +//************************************************************************************************* +#define ASYSCTL_TSNSCTL_ENABLE 0x1U // Temperature Sensor Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LOCK register +// +//************************************************************************************************* +#define ASYSCTL_LOCK_TSNSCTL 0x8U // Temperature Sensor Control Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMA 0x800000U // Analog Reference A Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMB 0x1000000U // Analog Reference B Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMC 0x2000000U // Analog Reference C Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMD 0x4000000U // Analog Reference D Trim Register Lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMA register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMA_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMA_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMA_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMA_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMA_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMA_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMB register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMB_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMB_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMB_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMB_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMB_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMB_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMC register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMC_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMC_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMC_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMC_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMC_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMC_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMD register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMD_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMD_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMD_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMD_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMD_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMD_IREFTRIM_M 0xF800U // Reference Current Trim + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_can.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_can.h new file mode 100644 index 0000000..05bc58b --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_can.h @@ -0,0 +1,514 @@ +//########################################################################### +// +// FILE: hw_can.h +// +// TITLE: Definitions for the CAN registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CAN_H +#define HW_CAN_H + +//************************************************************************************************* +// +// The following are defines for the CAN register offsets +// +//************************************************************************************************* +#define CAN_O_CTL 0x0U // CAN Control Register +#define CAN_O_ES 0x4U // Error and Status Register +#define CAN_O_ERRC 0x8U // Error Counter Register +#define CAN_O_BTR 0xCU // Bit Timing Register +#define CAN_O_INT 0x10U // Interrupt Register +#define CAN_O_TEST 0x14U // Test Register +#define CAN_O_PERR 0x1CU // CAN Parity Error Code Register +#define CAN_O_RAM_INIT 0x40U // CAN RAM Initialization Register +#define CAN_O_GLB_INT_EN 0x50U // CAN Global Interrupt Enable Register +#define CAN_O_GLB_INT_FLG 0x54U // CAN Global Interrupt Flag Register +#define CAN_O_GLB_INT_CLR 0x58U // CAN Global Interrupt Clear Register +#define CAN_O_ABOTR 0x80U // Auto-Bus-On Time Register +#define CAN_O_TXRQ_X 0x84U // CAN Transmission Request Register +#define CAN_O_TXRQ_21 0x88U // CAN Transmission Request 2_1 Register +#define CAN_O_NDAT_X 0x98U // CAN New Data Register +#define CAN_O_NDAT_21 0x9CU // CAN New Data 2_1 Register +#define CAN_O_IPEN_X 0xACU // CAN Interrupt Pending Register +#define CAN_O_IPEN_21 0xB0U // CAN Interrupt Pending 2_1 Register +#define CAN_O_MVAL_X 0xC0U // CAN Message Valid Register +#define CAN_O_MVAL_21 0xC4U // CAN Message Valid 2_1 Register +#define CAN_O_IP_MUX21 0xD8U // CAN Interrupt Multiplexer 2_1 Register +#define CAN_O_IF1CMD 0x100U // IF1 Command Register +#define CAN_O_IF1MSK 0x104U // IF1 Mask Register +#define CAN_O_IF1ARB 0x108U // IF1 Arbitration Register +#define CAN_O_IF1MCTL 0x10CU // IF1 Message Control Register +#define CAN_O_IF1DATA 0x110U // IF1 Data A Register +#define CAN_O_IF1DATB 0x114U // IF1 Data B Register +#define CAN_O_IF2CMD 0x120U // IF2 Command Register +#define CAN_O_IF2MSK 0x124U // IF2 Mask Register +#define CAN_O_IF2ARB 0x128U // IF2 Arbitration Register +#define CAN_O_IF2MCTL 0x12CU // IF2 Message Control Register +#define CAN_O_IF2DATA 0x130U // IF2 Data A Register +#define CAN_O_IF2DATB 0x134U // IF2 Data B Register +#define CAN_O_IF3OBS 0x140U // IF3 Observation Register +#define CAN_O_IF3MSK 0x144U // IF3 Mask Register +#define CAN_O_IF3ARB 0x148U // IF3 Arbitration Register +#define CAN_O_IF3MCTL 0x14CU // IF3 Message Control Register +#define CAN_O_IF3DATA 0x150U // IF3 Data A Register +#define CAN_O_IF3DATB 0x154U // IF3 Data B Register +#define CAN_O_IF3UPD 0x160U // IF3 Update Enable Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_CTL register +// +//************************************************************************************************* +#define CAN_CTL_INIT 0x1U // Initialization +#define CAN_CTL_IE0 0x2U // Interrupt line 0 Enable +#define CAN_CTL_SIE 0x4U // Status Change Interrupt Enable +#define CAN_CTL_EIE 0x8U // Error Interrupt Enable +#define CAN_CTL_DAR 0x20U // Disable Automatic Retransmission +#define CAN_CTL_CCE 0x40U // Configuration Change Enable +#define CAN_CTL_TEST 0x80U // Test Mode Enable +#define CAN_CTL_IDS 0x100U // Interruption Debug Support Enable +#define CAN_CTL_ABO 0x200U // Auto-Bus-On Enable +#define CAN_CTL_PMD_S 10U +#define CAN_CTL_PMD_M 0x3C00U // Parity on/off +#define CAN_CTL_SWR 0x8000U // SW Reset Enable +#define CAN_CTL_INITDBG 0x10000U // Debug Mode Status +#define CAN_CTL_IE1 0x20000U // Interrupt line 1 Enable Disabled + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_ES register +// +//************************************************************************************************* +#define CAN_ES_LEC_S 0U +#define CAN_ES_LEC_M 0x7U // Last Error Code +#define CAN_ES_TXOK 0x8U // Transmission status +#define CAN_ES_RXOK 0x10U // Reception status +#define CAN_ES_EPASS 0x20U // Error Passive State +#define CAN_ES_EWARN 0x40U // Warning State +#define CAN_ES_BOFF 0x80U // Bus-Off State +#define CAN_ES_PER 0x100U // Parity Error Detected + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_ERRC register +// +//************************************************************************************************* +#define CAN_ERRC_TEC_S 0U +#define CAN_ERRC_TEC_M 0xFFU // Transmit Error Counter +#define CAN_ERRC_REC_S 8U +#define CAN_ERRC_REC_M 0x7F00U // Receive Error Counter +#define CAN_ERRC_RP 0x8000U // Receive Error Passive + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_BTR register +// +//************************************************************************************************* +#define CAN_BTR_BRP_S 0U +#define CAN_BTR_BRP_M 0x3FU // Baud Rate Prescaler +#define CAN_BTR_SJW_S 6U +#define CAN_BTR_SJW_M 0xC0U // Synchronization Jump Width +#define CAN_BTR_TSEG1_S 8U +#define CAN_BTR_TSEG1_M 0xF00U // Time segment +#define CAN_BTR_TSEG2_S 12U +#define CAN_BTR_TSEG2_M 0x7000U // Time segment +#define CAN_BTR_BRPE_S 16U +#define CAN_BTR_BRPE_M 0xF0000U // Baud Rate Prescaler Extension + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_INT register +// +//************************************************************************************************* +#define CAN_INT_INT0ID_S 0U +#define CAN_INT_INT0ID_M 0xFFFFU // Interrupt Identifier +#define CAN_INT_INT1ID_S 16U +#define CAN_INT_INT1ID_M 0xFF0000U // Interrupt 1 Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_TEST register +// +//************************************************************************************************* +#define CAN_TEST_SILENT 0x8U // Silent Mode +#define CAN_TEST_LBACK 0x10U // Loopback Mode +#define CAN_TEST_TX_S 5U +#define CAN_TEST_TX_M 0x60U // CANTX Pin Control +#define CAN_TEST_RX 0x80U // CANRX Pin Status +#define CAN_TEST_EXL 0x100U // External Loopback Mode +#define CAN_TEST_RDA 0x200U // RAM Direct Access Enable: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_PERR register +// +//************************************************************************************************* +#define CAN_PERR_MSG_NUM_S 0U +#define CAN_PERR_MSG_NUM_M 0xFFU // Message Number +#define CAN_PERR_WORD_NUM_S 8U +#define CAN_PERR_WORD_NUM_M 0x700U // Word Number + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_RAM_INIT register +// +//************************************************************************************************* +#define CAN_RAM_INIT_KEY0 0x1U // KEY0 +#define CAN_RAM_INIT_KEY1 0x2U // KEY1 +#define CAN_RAM_INIT_KEY2 0x4U // KEY2 +#define CAN_RAM_INIT_KEY3 0x8U // KEY3 +#define CAN_RAM_INIT_CAN_RAM_INIT 0x10U // Initialize CAN Mailbox RAM +#define CAN_RAM_INIT_RAM_INIT_DONE 0x20U // CAN RAM initialization complete + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_EN register +// +//************************************************************************************************* +#define CAN_GLB_INT_EN_GLBINT0_EN 0x1U // Global Interrupt Enable for CANINT0 +#define CAN_GLB_INT_EN_GLBINT1_EN 0x2U // Global Interrupt Enable for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_FLG register +// +//************************************************************************************************* +#define CAN_GLB_INT_FLG_INT0_FLG 0x1U // Global Interrupt Flag for CANINT0 +#define CAN_GLB_INT_FLG_INT1_FLG 0x2U // Global Interrupt Flag for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_CLR register +// +//************************************************************************************************* +#define CAN_GLB_INT_CLR_INT0_FLG_CLR 0x1U // Global Interrupt flag clear for CANINT0 +#define CAN_GLB_INT_CLR_INT1_FLG_CLR 0x2U // Global Interrupt flag clear for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_TXRQ_X register +// +//************************************************************************************************* +#define CAN_TXRQ_X_TXRQSTREG1_S 0U +#define CAN_TXRQ_X_TXRQSTREG1_M 0x3U // Transmit Request Register 1 +#define CAN_TXRQ_X_TXRQSTREG2_S 2U +#define CAN_TXRQ_X_TXRQSTREG2_M 0xCU // Transmit Request Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_NDAT_X register +// +//************************************************************************************************* +#define CAN_NDAT_X_NEWDATREG1_S 0U +#define CAN_NDAT_X_NEWDATREG1_M 0x3U // New Data Register 1 +#define CAN_NDAT_X_NEWDATREG2_S 2U +#define CAN_NDAT_X_NEWDATREG2_M 0xCU // New Data Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IPEN_X register +// +//************************************************************************************************* +#define CAN_IPEN_X_INTPNDREG1_S 0U +#define CAN_IPEN_X_INTPNDREG1_M 0x3U // Interrupt Pending Register 1 +#define CAN_IPEN_X_INTPNDREG2_S 2U +#define CAN_IPEN_X_INTPNDREG2_M 0xCU // Interrupt Pending Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_MVAL_X register +// +//************************************************************************************************* +#define CAN_MVAL_X_MSGVALREG1_S 0U +#define CAN_MVAL_X_MSGVALREG1_M 0x3U // Message Valid Register 1 +#define CAN_MVAL_X_MSGVALREG2_S 2U +#define CAN_MVAL_X_MSGVALREG2_M 0xCU // Message Valid Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1CMD register +// +//************************************************************************************************* +#define CAN_IF1CMD_MSG_NUM_S 0U +#define CAN_IF1CMD_MSG_NUM_M 0xFFU // Message Number +#define CAN_IF1CMD_BUSY 0x8000U // Busy Flag +#define CAN_IF1CMD_DATA_B 0x10000U // Access Data Bytes 4-7 +#define CAN_IF1CMD_DATA_A 0x20000U // Access Data Bytes 0-3 +#define CAN_IF1CMD_TXRQST 0x40000U // Access Transmission Request Bit +#define CAN_IF1CMD_CLRINTPND 0x80000U // Clear Interrupt Pending Bit +#define CAN_IF1CMD_CONTROL 0x100000U // Access Control Bits +#define CAN_IF1CMD_ARB 0x200000U // Access Arbitration Bits +#define CAN_IF1CMD_MASK 0x400000U // Access Mask Bits +#define CAN_IF1CMD_DIR 0x800000U // Write/Read Direction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1MSK register +// +//************************************************************************************************* +#define CAN_IF1MSK_MSK_S 0U +#define CAN_IF1MSK_MSK_M 0x1FFFFFFFU // Identifier Mask +#define CAN_IF1MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF1MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1ARB register +// +//************************************************************************************************* +#define CAN_IF1ARB_ID_S 0U +#define CAN_IF1ARB_ID_M 0x1FFFFFFFU // ` +#define CAN_IF1ARB_DIR 0x20000000U // Message Direction +#define CAN_IF1ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF1ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1MCTL register +// +//************************************************************************************************* +#define CAN_IF1MCTL_DLC_S 0U +#define CAN_IF1MCTL_DLC_M 0xFU // Data length code +#define CAN_IF1MCTL_EOB 0x80U // End of Block +#define CAN_IF1MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF1MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF1MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF1MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF1MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF1MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF1MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF1MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1DATA register +// +//************************************************************************************************* +#define CAN_IF1DATA_DATA_0_S 0U +#define CAN_IF1DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF1DATA_DATA_1_S 8U +#define CAN_IF1DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF1DATA_DATA_2_S 16U +#define CAN_IF1DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF1DATA_DATA_3_S 24U +#define CAN_IF1DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1DATB register +// +//************************************************************************************************* +#define CAN_IF1DATB_DATA_4_S 0U +#define CAN_IF1DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF1DATB_DATA_5_S 8U +#define CAN_IF1DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF1DATB_DATA_6_S 16U +#define CAN_IF1DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF1DATB_DATA_7_S 24U +#define CAN_IF1DATB_DATA_7_M 0xFF000000U // Data Byte 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2CMD register +// +//************************************************************************************************* +#define CAN_IF2CMD_MSG_NUM_S 0U +#define CAN_IF2CMD_MSG_NUM_M 0xFFU // Message Number +#define CAN_IF2CMD_BUSY 0x8000U // Busy Flag +#define CAN_IF2CMD_DATA_B 0x10000U // Access Data Bytes 4-7 +#define CAN_IF2CMD_DATA_A 0x20000U // Access Data Bytes 0-3 +#define CAN_IF2CMD_TXRQST 0x40000U // Access Transmission Request Bit +#define CAN_IF2CMD_CLRINTPND 0x80000U // Clear Interrupt Pending Bit +#define CAN_IF2CMD_CONTROL 0x100000U // Access Control Bits +#define CAN_IF2CMD_ARB 0x200000U // Access Arbitration Bits +#define CAN_IF2CMD_MASK 0x400000U // Access Mask Bits +#define CAN_IF2CMD_DIR 0x800000U // Write/Read Direction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2MSK register +// +//************************************************************************************************* +#define CAN_IF2MSK_MSK_S 0U +#define CAN_IF2MSK_MSK_M 0x1FFFFFFFU // Identifier Mask +#define CAN_IF2MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF2MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2ARB register +// +//************************************************************************************************* +#define CAN_IF2ARB_ID_S 0U +#define CAN_IF2ARB_ID_M 0x1FFFFFFFU // Message Identifier +#define CAN_IF2ARB_DIR 0x20000000U // Message Direction +#define CAN_IF2ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF2ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2MCTL register +// +//************************************************************************************************* +#define CAN_IF2MCTL_DLC_S 0U +#define CAN_IF2MCTL_DLC_M 0xFU // Data length code +#define CAN_IF2MCTL_EOB 0x80U // End of Block +#define CAN_IF2MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF2MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF2MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF2MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF2MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF2MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF2MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF2MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2DATA register +// +//************************************************************************************************* +#define CAN_IF2DATA_DATA_0_S 0U +#define CAN_IF2DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF2DATA_DATA_1_S 8U +#define CAN_IF2DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF2DATA_DATA_2_S 16U +#define CAN_IF2DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF2DATA_DATA_3_S 24U +#define CAN_IF2DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2DATB register +// +//************************************************************************************************* +#define CAN_IF2DATB_DATA_4_S 0U +#define CAN_IF2DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF2DATB_DATA_5_S 8U +#define CAN_IF2DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF2DATB_DATA_6_S 16U +#define CAN_IF2DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF2DATB_DATA_7_S 24U +#define CAN_IF2DATB_DATA_7_M 0xFF000000U // Data Byte 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3OBS register +// +//************************************************************************************************* +#define CAN_IF3OBS_MASK 0x1U // Mask data read observation +#define CAN_IF3OBS_ARB 0x2U // Arbitration data read observation +#define CAN_IF3OBS_CTRL 0x4U // Ctrl read observation +#define CAN_IF3OBS_DATA_A 0x8U // Data A read observation +#define CAN_IF3OBS_DATA_B 0x10U // Data B read observation +#define CAN_IF3OBS_IF3SM 0x100U // IF3 Status of Mask data read access +#define CAN_IF3OBS_IF3SA 0x200U // IF3 Status of Arbitration data read access +#define CAN_IF3OBS_IF3SC 0x400U // IF3 Status of Control bits read access +#define CAN_IF3OBS_IF3SDA 0x800U // IF3 Status of Data A read access +#define CAN_IF3OBS_IF3SDB 0x1000U // IF3 Status of Data B read access +#define CAN_IF3OBS_IF3UPD 0x8000U // IF3 Update Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3MSK register +// +//************************************************************************************************* +#define CAN_IF3MSK_MSK_S 0U +#define CAN_IF3MSK_MSK_M 0x1FFFFFFFU // Mask +#define CAN_IF3MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF3MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3ARB register +// +//************************************************************************************************* +#define CAN_IF3ARB_ID_S 0U +#define CAN_IF3ARB_ID_M 0x1FFFFFFFU // Message Identifier +#define CAN_IF3ARB_DIR 0x20000000U // Message Direction +#define CAN_IF3ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF3ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3MCTL register +// +//************************************************************************************************* +#define CAN_IF3MCTL_DLC_S 0U +#define CAN_IF3MCTL_DLC_M 0xFU // Data length code +#define CAN_IF3MCTL_EOB 0x80U // End of Block +#define CAN_IF3MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF3MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF3MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF3MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF3MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF3MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF3MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF3MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3DATA register +// +//************************************************************************************************* +#define CAN_IF3DATA_DATA_0_S 0U +#define CAN_IF3DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF3DATA_DATA_1_S 8U +#define CAN_IF3DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF3DATA_DATA_2_S 16U +#define CAN_IF3DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF3DATA_DATA_3_S 24U +#define CAN_IF3DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3DATB register +// +//************************************************************************************************* +#define CAN_IF3DATB_DATA_4_S 0U +#define CAN_IF3DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF3DATB_DATA_5_S 8U +#define CAN_IF3DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF3DATB_DATA_6_S 16U +#define CAN_IF3DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF3DATB_DATA_7_S 24U +#define CAN_IF3DATB_DATA_7_M 0xFF000000U // Data Byte 7 + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_cla.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cla.h new file mode 100644 index 0000000..0206de7 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cla.h @@ -0,0 +1,241 @@ +//########################################################################### +// +// FILE: hw_cla.h +// +// TITLE: Definitions for the CLA registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLA_H +#define HW_CLA_H + +//************************************************************************************************* +// +// The following are defines for the CLA register offsets +// +//************************************************************************************************* +#ifndef __TMS320C28XX_CLA__ +#define CLA_O_MVECT1 0x0U // Task Interrupt Vector +#define CLA_O_MVECT2 0x1U // Task Interrupt Vector +#define CLA_O_MVECT3 0x2U // Task Interrupt Vector +#define CLA_O_MVECT4 0x3U // Task Interrupt Vector +#define CLA_O_MVECT5 0x4U // Task Interrupt Vector +#define CLA_O_MVECT6 0x5U // Task Interrupt Vector +#define CLA_O_MVECT7 0x6U // Task Interrupt Vector +#define CLA_O_MVECT8 0x7U // Task Interrupt Vector +#define CLA_O_MCTL 0x10U // Control Register +#define CLA_O_MIFR 0x20U // Interrupt Flag Register +#define CLA_O_MIOVF 0x21U // Interrupt Overflow Flag Register +#define CLA_O_MIFRC 0x22U // Interrupt Force Register +#define CLA_O_MICLR 0x23U // Interrupt Flag Clear Register +#define CLA_O_MICLROVF 0x24U // Interrupt Overflow Flag Clear Register +#define CLA_O_MIER 0x25U // Interrupt Enable Register +#define CLA_O_MIRUN 0x26U // Interrupt Run Status Register +#define CLA_O_MPC 0x28U // CLA Program Counter +#define CLA_O_MAR0 0x2AU // CLA Auxiliary Register 0 +#define CLA_O_MAR1 0x2BU // CLA Auxiliary Register 1 +#define CLA_O_MSTF 0x2EU // CLA Floating-Point Status Register +#define CLA_O_MR0 0x30U // CLA Floating-Point Result Register 0 +#define CLA_O_MR1 0x34U // CLA Floating-Point Result Register 1 +#define CLA_O_MR2 0x38U // CLA Floating-Point Result Register 2 +#define CLA_O_MR3 0x3CU // CLA Floating-Point Result Register 3 +#endif + +#ifdef __TMS320C28XX_CLA__ +#define CLA_O_SOFTINTEN 0x0U // CLA Software Interrupt Enable Register +#define CLA_O_SOFTINTFRC 0x2U // CLA Software Interrupt Force Register +#endif + + +#ifndef __TMS320C28XX_CLA__ +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCTL register +// +//************************************************************************************************* +#define CLA_MCTL_HARDRESET 0x1U // Hard Reset +#define CLA_MCTL_SOFTRESET 0x2U // Soft Reset +#define CLA_MCTL_IACKE 0x4U // IACK enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIFR register +// +//************************************************************************************************* +#define CLA_MIFR_INT1 0x1U // Task 1 Interrupt Flag +#define CLA_MIFR_INT2 0x2U // Task 2 Interrupt Flag +#define CLA_MIFR_INT3 0x4U // Task 3 Interrupt Flag +#define CLA_MIFR_INT4 0x8U // Task 4 Interrupt Flag +#define CLA_MIFR_INT5 0x10U // Task 5 Interrupt Flag +#define CLA_MIFR_INT6 0x20U // Task 6 Interrupt Flag +#define CLA_MIFR_INT7 0x40U // Task 7 Interrupt Flag +#define CLA_MIFR_INT8 0x80U // Task 8 Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIOVF register +// +//************************************************************************************************* +#define CLA_MIOVF_INT1 0x1U // Task 1 Interrupt Overflow Flag +#define CLA_MIOVF_INT2 0x2U // Task 2 Interrupt Overflow Flag +#define CLA_MIOVF_INT3 0x4U // Task 3 Interrupt Overflow Flag +#define CLA_MIOVF_INT4 0x8U // Task 4 Interrupt Overflow Flag +#define CLA_MIOVF_INT5 0x10U // Task 5 Interrupt Overflow Flag +#define CLA_MIOVF_INT6 0x20U // Task 6 Interrupt Overflow Flag +#define CLA_MIOVF_INT7 0x40U // Task 7 Interrupt Overflow Flag +#define CLA_MIOVF_INT8 0x80U // Task 8 Interrupt Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIFRC register +// +//************************************************************************************************* +#define CLA_MIFRC_INT1 0x1U // Task 1 Interrupt Force +#define CLA_MIFRC_INT2 0x2U // Task 2 Interrupt Force +#define CLA_MIFRC_INT3 0x4U // Task 3 Interrupt Force +#define CLA_MIFRC_INT4 0x8U // Task 4 Interrupt Force +#define CLA_MIFRC_INT5 0x10U // Task 5 Interrupt Force +#define CLA_MIFRC_INT6 0x20U // Task 6 Interrupt Force +#define CLA_MIFRC_INT7 0x40U // Task 7 Interrupt Force +#define CLA_MIFRC_INT8 0x80U // Task 8 Interrupt Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MICLR register +// +//************************************************************************************************* +#define CLA_MICLR_INT1 0x1U // Task 1 Interrupt Flag Clear +#define CLA_MICLR_INT2 0x2U // Task 2 Interrupt Flag Clear +#define CLA_MICLR_INT3 0x4U // Task 3 Interrupt Flag Clear +#define CLA_MICLR_INT4 0x8U // Task 4 Interrupt Flag Clear +#define CLA_MICLR_INT5 0x10U // Task 5 Interrupt Flag Clear +#define CLA_MICLR_INT6 0x20U // Task 6 Interrupt Flag Clear +#define CLA_MICLR_INT7 0x40U // Task 7 Interrupt Flag Clear +#define CLA_MICLR_INT8 0x80U // Task 8 Interrupt Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MICLROVF register +// +//************************************************************************************************* +#define CLA_MICLROVF_INT1 0x1U // Task 1 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT2 0x2U // Task 2 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT3 0x4U // Task 3 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT4 0x8U // Task 4 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT5 0x10U // Task 5 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT6 0x20U // Task 6 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT7 0x40U // Task 7 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT8 0x80U // Task 8 Interrupt Overflow Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIER register +// +//************************************************************************************************* +#define CLA_MIER_INT1 0x1U // Task 1 Interrupt Enable +#define CLA_MIER_INT2 0x2U // Task 2 Interrupt Enable +#define CLA_MIER_INT3 0x4U // Task 3 Interrupt Enable +#define CLA_MIER_INT4 0x8U // Task 4 Interrupt Enable +#define CLA_MIER_INT5 0x10U // Task 5 Interrupt Enable +#define CLA_MIER_INT6 0x20U // Task 6 Interrupt Enable +#define CLA_MIER_INT7 0x40U // Task 7 Interrupt Enable +#define CLA_MIER_INT8 0x80U // Task 8 Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIRUN register +// +//************************************************************************************************* +#define CLA_MIRUN_INT1 0x1U // Task 1 Run Status +#define CLA_MIRUN_INT2 0x2U // Task 2 Run Status +#define CLA_MIRUN_INT3 0x4U // Task 3 Run Status +#define CLA_MIRUN_INT4 0x8U // Task 4 Run Status +#define CLA_MIRUN_INT5 0x10U // Task 5 Run Status +#define CLA_MIRUN_INT6 0x20U // Task 6 Run Status +#define CLA_MIRUN_INT7 0x40U // Task 7 Run Status +#define CLA_MIRUN_INT8 0x80U // Task 8 Run Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the _MSTF register +// +//************************************************************************************************* +#define CLA_MSTF_LVF 0x1U // Latched Overflow Flag +#define CLA_MSTF_LUF 0x2U // Latched Underflow Flag +#define CLA_MSTF_NF 0x4U // Negative Float Flag +#define CLA_MSTF_ZF 0x8U // Zero Float Flag +#define CLA_MSTF_TF 0x40U // Test Flag +#define CLA_MSTF_RNDF32 0x200U // Round 32-bit Floating-Point Mode +#define CLA_MSTF_MEALLOW 0x800U // MEALLOW Status +#define CLA_MSTF_RPC_S 12U +#define CLA_MSTF_RPC_M 0xFFFF000U // Return PC + +#endif + +#ifdef __TMS320C28XX_CLA__ +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTINTEN register +// +//************************************************************************************************* +#define CLA_SOFTINTEN_TASK1 0x1U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK2 0x2U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK3 0x4U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK4 0x8U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK5 0x10U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK6 0x20U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK7 0x40U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK8 0x80U // Configure Software Interrupt or End of Task interrupt. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTINTFRC register +// +//************************************************************************************************* +#define CLA_SOFTINTFRC_TASK1 0x1U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK2 0x2U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK3 0x4U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK4 0x8U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK5 0x10U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK6 0x20U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK7 0x40U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK8 0x80U // Force CLA software interrupt for the corresponding task. + +#endif + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_clb.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_clb.h new file mode 100644 index 0000000..4390004 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_clb.h @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: hw_clb.h +// +// TITLE: Definitions for the CLB registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLB_H +#define HW_CLB_H + +//************************************************************************************************* +// +// The following are defines for the CLB register offsets +// +//************************************************************************************************* +#define CLB_O_COUNT_RESET 0x2U // Counter Block RESET +#define CLB_O_COUNT_MODE_1 0x4U // Counter Block MODE_1 +#define CLB_O_COUNT_MODE_0 0x6U // Counter Block MODE_0 +#define CLB_O_COUNT_EVENT 0x8U // Counter Block EVENT +#define CLB_O_FSM_EXTRA_IN0 0xAU // FSM Extra EXT_IN0 +#define CLB_O_FSM_EXTERNAL_IN0 0xCU // FSM EXT_IN0 +#define CLB_O_FSM_EXTERNAL_IN1 0xEU // FSM_EXT_IN1 +#define CLB_O_FSM_EXTRA_IN1 0x10U // FSM Extra_EXT_IN1 +#define CLB_O_LUT4_IN0 0x12U // LUT4_0/1/2 IN0 input source +#define CLB_O_LUT4_IN1 0x14U // LUT4_0/1/2 IN1 input source +#define CLB_O_LUT4_IN2 0x16U // LUT4_0/1/2 IN2 input source +#define CLB_O_LUT4_IN3 0x18U // LUT4_0/1/2 IN3 input source +#define CLB_O_FSM_LUT_FN1_0 0x1CU // LUT function for FSM Unit 1 and Unit 0 +#define CLB_O_FSM_LUT_FN2 0x1EU // LUT function for FSM Unit 2 +#define CLB_O_LUT4_FN1_0 0x20U // LUT function for LUT4 block of Unit 1 and 0 +#define CLB_O_LUT4_FN2 0x22U // LUT function for LUT4 block of Unit 2 +#define CLB_O_FSM_NEXT_STATE_0 0x24U // FSM Next state equations for Unit 0 +#define CLB_O_FSM_NEXT_STATE_1 0x26U // FSM Next state equations for Unit 1 +#define CLB_O_FSM_NEXT_STATE_2 0x28U // FSM Next state equations for Unit 2 +#define CLB_O_MISC_CONTROL 0x2AU // Static controls for Ctr,FSM +#define CLB_O_OUTPUT_LUT_0 0x2CU // Inp Sel, LUT fns for Out0 +#define CLB_O_OUTPUT_LUT_1 0x2EU // Inp Sel, LUT fns for Out1 +#define CLB_O_OUTPUT_LUT_2 0x30U // Inp Sel, LUT fns for Out2 +#define CLB_O_OUTPUT_LUT_3 0x32U // Inp Sel, LUT fns for Out3 +#define CLB_O_OUTPUT_LUT_4 0x34U // Inp Sel, LUT fns for Out4 +#define CLB_O_OUTPUT_LUT_5 0x36U // Inp Sel, LUT fns for Out5 +#define CLB_O_OUTPUT_LUT_6 0x38U // Inp Sel, LUT fns for Out6 +#define CLB_O_OUTPUT_LUT_7 0x3AU // Inp Sel, LUT fns for Out7 +#define CLB_O_HLC_EVENT_SEL 0x3CU // Event Selector register for the High Level controller + +#define CLB_O_LOAD_EN 0x0U // Global enable & indirect load enable control +#define CLB_O_LOAD_ADDR 0x2U // Indirect address +#define CLB_O_LOAD_DATA 0x4U // Data for indirect loads +#define CLB_O_INPUT_FILTER 0x6U // Input filter selection for both edge detection and + // synchronizers +#define CLB_O_IN_MUX_SEL_0 0x8U // Input selection to decide between Signals and GP register +#define CLB_O_LCL_MUX_SEL_1 0xAU // Input Mux selection for local mux +#define CLB_O_LCL_MUX_SEL_2 0xCU // Input Mux selection for local mux +#define CLB_O_BUF_PTR 0xEU // PUSH and PULL pointers +#define CLB_O_GP_REG 0x10U // General purpose register for CELL inputs +#define CLB_O_OUT_EN 0x12U // CELL output enable register +#define CLB_O_GLBL_MUX_SEL_1 0x14U // Global Mux select for CELL inputs +#define CLB_O_GLBL_MUX_SEL_2 0x16U // Global Mux select for CELL inputs +#define CLB_O_INTR_TAG_REG 0x20U // Interrupt Tag register +#define CLB_O_LOCK 0x22U // Lock control register +#define CLB_O_DBG_R0 0x30U // R0 of High level Controller +#define CLB_O_DBG_R1 0x32U // R1 of High level Controller +#define CLB_O_DBG_R2 0x34U // R2 of High level Controller +#define CLB_O_DBG_R3 0x36U // R3 of High level Controller +#define CLB_O_DBG_C0 0x38U // Count of Unit 0 +#define CLB_O_DBG_C1 0x3AU // Count of Unit 1 +#define CLB_O_DBG_C2 0x3CU // Count of Unit 2 +#define CLB_O_DBG_OUT 0x3EU // Outputs of various units in the Cell + +#define CLB_O_PUSH(i) (0x0U + ((i) * 0x2U)) // (0 <= i < 4) CLB_PUSH FIFO Registers (from + // HLC) +#define CLB_O_PULL(i) (0x100U + ((i) * 0x2U)) // (0 <= i < 4) CLB_PULL FIFO Registers (TO HLC) + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_RESET register +// +//************************************************************************************************* +#define CLB_COUNT_RESET_SEL_0_S 0U +#define CLB_COUNT_RESET_SEL_0_M 0x1FU // Count Reset Select 0 +#define CLB_COUNT_RESET_SEL_1_S 5U +#define CLB_COUNT_RESET_SEL_1_M 0x3E0U // Count Reset Select 1 +#define CLB_COUNT_RESET_SEL_2_S 10U +#define CLB_COUNT_RESET_SEL_2_M 0x7C00U // Count Reset Select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_MODE_1 register +// +//************************************************************************************************* +#define CLB_COUNT_MODE_1_SEL_0_S 0U +#define CLB_COUNT_MODE_1_SEL_0_M 0x1FU // Counter mode 1 select 0 +#define CLB_COUNT_MODE_1_SEL_1_S 5U +#define CLB_COUNT_MODE_1_SEL_1_M 0x3E0U // Counter mode 1 select 1 +#define CLB_COUNT_MODE_1_SEL_2_S 10U +#define CLB_COUNT_MODE_1_SEL_2_M 0x7C00U // Counter mode 1 select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_MODE_0 register +// +//************************************************************************************************* +#define CLB_COUNT_MODE_0_SEL_0_S 0U +#define CLB_COUNT_MODE_0_SEL_0_M 0x1FU // Counter mode 0 select 0 +#define CLB_COUNT_MODE_0_SEL_1_S 5U +#define CLB_COUNT_MODE_0_SEL_1_M 0x3E0U // Counter mode 0 select 1 +#define CLB_COUNT_MODE_0_SEL_2_S 10U +#define CLB_COUNT_MODE_0_SEL_2_M 0x7C00U // Counter mode 0 select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_EVENT register +// +//************************************************************************************************* +#define CLB_COUNT_EVENT_SEL_0_S 0U +#define CLB_COUNT_EVENT_SEL_0_M 0x1FU // Counter event select 0 +#define CLB_COUNT_EVENT_SEL_1_S 5U +#define CLB_COUNT_EVENT_SEL_1_M 0x3E0U // Counter event select 1 +#define CLB_COUNT_EVENT_SEL_2_S 10U +#define CLB_COUNT_EVENT_SEL_2_M 0x7C00U // Counter event select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN0 register +// +//************************************************************************************************* +#define CLB_FSM_EXTRA_IN0_SEL_0_S 0U +#define CLB_FSM_EXTRA_IN0_SEL_0_M 0x1FU // FSM extra ext input select 0 +#define CLB_FSM_EXTRA_IN0_SEL_1_S 5U +#define CLB_FSM_EXTRA_IN0_SEL_1_M 0x3E0U // FSM extra ext input select 1 +#define CLB_FSM_EXTRA_IN0_SEL_2_S 10U +#define CLB_FSM_EXTRA_IN0_SEL_2_M 0x7C00U // FSM extra ext input select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN0 register +// +//************************************************************************************************* +#define CLB_FSM_EXTERNAL_IN0_SEL_0_S 0U +#define CLB_FSM_EXTERNAL_IN0_SEL_0_M 0x1FU // FSM EXT_IN0 select input for unit 0 +#define CLB_FSM_EXTERNAL_IN0_SEL_1_S 5U +#define CLB_FSM_EXTERNAL_IN0_SEL_1_M 0x3E0U // FSM EXT_IN0 select input for unit 1 +#define CLB_FSM_EXTERNAL_IN0_SEL_2_S 10U +#define CLB_FSM_EXTERNAL_IN0_SEL_2_M 0x7C00U // FSM EXT_IN0 select input for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN1 register +// +//************************************************************************************************* +#define CLB_FSM_EXTERNAL_IN1_SEL_0_S 0U +#define CLB_FSM_EXTERNAL_IN1_SEL_0_M 0x1FU // FSM EXT_IN1 select input for unit 0 +#define CLB_FSM_EXTERNAL_IN1_SEL_1_S 5U +#define CLB_FSM_EXTERNAL_IN1_SEL_1_M 0x3E0U // FSM EXT_IN1 select input for unit 1 +#define CLB_FSM_EXTERNAL_IN1_SEL_2_S 10U +#define CLB_FSM_EXTERNAL_IN1_SEL_2_M 0x7C00U // FSM EXT_IN1 select input for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN1 register +// +//************************************************************************************************* +#define CLB_FSM_EXTRA_IN1_SEL_0_S 0U +#define CLB_FSM_EXTRA_IN1_SEL_0_M 0x1FU // FSM extra ext input select 0 +#define CLB_FSM_EXTRA_IN1_SEL_1_S 5U +#define CLB_FSM_EXTRA_IN1_SEL_1_M 0x3E0U // FSM extra ext input select 1 +#define CLB_FSM_EXTRA_IN1_SEL_2_S 10U +#define CLB_FSM_EXTRA_IN1_SEL_2_M 0x7C00U // FSM extra ext input select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN0 register +// +//************************************************************************************************* +#define CLB_LUT4_IN0_SEL_0_S 0U +#define CLB_LUT4_IN0_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN0_SEL_1_S 5U +#define CLB_LUT4_IN0_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN0_SEL_2_S 10U +#define CLB_LUT4_IN0_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN1 register +// +//************************************************************************************************* +#define CLB_LUT4_IN1_SEL_0_S 0U +#define CLB_LUT4_IN1_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN1_SEL_1_S 5U +#define CLB_LUT4_IN1_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN1_SEL_2_S 10U +#define CLB_LUT4_IN1_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN2 register +// +//************************************************************************************************* +#define CLB_LUT4_IN2_SEL_0_S 0U +#define CLB_LUT4_IN2_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN2_SEL_1_S 5U +#define CLB_LUT4_IN2_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN2_SEL_2_S 10U +#define CLB_LUT4_IN2_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN3 register +// +//************************************************************************************************* +#define CLB_LUT4_IN3_SEL_0_S 0U +#define CLB_LUT4_IN3_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN3_SEL_1_S 5U +#define CLB_LUT4_IN3_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN3_SEL_2_S 10U +#define CLB_LUT4_IN3_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_LUT_FN1_0 register +// +//************************************************************************************************* +#define CLB_FSM_LUT_FN1_0_FN0_S 0U +#define CLB_FSM_LUT_FN1_0_FN0_M 0xFFFFU // FSM LUT output function for unit 0 +#define CLB_FSM_LUT_FN1_0_FN1_S 16U +#define CLB_FSM_LUT_FN1_0_FN1_M 0xFFFF0000U // FSM LUT output function for unit 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_LUT_FN2 register +// +//************************************************************************************************* +#define CLB_FSM_LUT_FN2_FN1_S 0U +#define CLB_FSM_LUT_FN2_FN1_M 0xFFFFU // FSM LUT output function for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_FN1_0 register +// +//************************************************************************************************* +#define CLB_LUT4_FN1_0_FN0_S 0U +#define CLB_LUT4_FN1_0_FN0_M 0xFFFFU // LUT4 output function for unit 0 +#define CLB_LUT4_FN1_0_FN1_S 16U +#define CLB_LUT4_FN1_0_FN1_M 0xFFFF0000U // LUT4 output function for unit 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_FN2 register +// +//************************************************************************************************* +#define CLB_LUT4_FN2_FN1_S 0U +#define CLB_LUT4_FN2_FN1_M 0xFFFFU // LUT4 output function for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_0 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_0_S0_S 0U +#define CLB_FSM_NEXT_STATE_0_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_0_S1_S 16U +#define CLB_FSM_NEXT_STATE_0_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_1 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_1_S0_S 0U +#define CLB_FSM_NEXT_STATE_1_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_1_S1_S 16U +#define CLB_FSM_NEXT_STATE_1_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_2 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_2_S0_S 0U +#define CLB_FSM_NEXT_STATE_2_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_2_S1_S 16U +#define CLB_FSM_NEXT_STATE_2_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_MISC_CONTROL register +// +//************************************************************************************************* +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_0 0x1U // Add/Shift for counter 0 +#define CLB_MISC_CONTROL_COUNT_DIR_0 0x2U // Direction for counter 0 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_0 0x4U // Event control for counter 0 +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_1 0x8U // Add/Shift for counter 1 +#define CLB_MISC_CONTROL_COUNT_DIR_1 0x10U // Direction for counter 1 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_1 0x20U // Event control for counter 1 +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_2 0x40U // Add/Shift for counter 2 +#define CLB_MISC_CONTROL_COUNT_DIR_2 0x80U // Direction for counter 2 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_2 0x100U // Event control for counter 2 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_0 0x200U // Serializer enable 0 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_1 0x400U // Serializer enable 1 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_2 0x800U // Serializer enable 2 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_0 0x1000U // FSM extra_sel0 for 0 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_0 0x2000U // FSM extra_sel1 for 0 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_1 0x4000U // FSM extra_sel0 for 1 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_1 0x8000U // FSM extra_sel1 for 1 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_2 0x10000U // FSM extra_sel0 for 2 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_2 0x20000U // FSM extra_sel1 for 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_0 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_0_IN0_S 0U +#define CLB_OUTPUT_LUT_0_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_0_IN1_S 5U +#define CLB_OUTPUT_LUT_0_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_0_IN2_S 10U +#define CLB_OUTPUT_LUT_0_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_0_FN_S 15U +#define CLB_OUTPUT_LUT_0_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_1 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_1_IN0_S 0U +#define CLB_OUTPUT_LUT_1_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_1_IN1_S 5U +#define CLB_OUTPUT_LUT_1_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_1_IN2_S 10U +#define CLB_OUTPUT_LUT_1_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_1_FN_S 15U +#define CLB_OUTPUT_LUT_1_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_2 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_2_IN0_S 0U +#define CLB_OUTPUT_LUT_2_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_2_IN1_S 5U +#define CLB_OUTPUT_LUT_2_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_2_IN2_S 10U +#define CLB_OUTPUT_LUT_2_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_2_FN_S 15U +#define CLB_OUTPUT_LUT_2_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_3 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_3_IN0_S 0U +#define CLB_OUTPUT_LUT_3_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_3_IN1_S 5U +#define CLB_OUTPUT_LUT_3_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_3_IN2_S 10U +#define CLB_OUTPUT_LUT_3_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_3_FN_S 15U +#define CLB_OUTPUT_LUT_3_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_4 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_4_IN0_S 0U +#define CLB_OUTPUT_LUT_4_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_4_IN1_S 5U +#define CLB_OUTPUT_LUT_4_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_4_IN2_S 10U +#define CLB_OUTPUT_LUT_4_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_4_FN_S 15U +#define CLB_OUTPUT_LUT_4_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_5 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_5_IN0_S 0U +#define CLB_OUTPUT_LUT_5_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_5_IN1_S 5U +#define CLB_OUTPUT_LUT_5_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_5_IN2_S 10U +#define CLB_OUTPUT_LUT_5_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_5_FN_S 15U +#define CLB_OUTPUT_LUT_5_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_6 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_6_IN0_S 0U +#define CLB_OUTPUT_LUT_6_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_6_IN1_S 5U +#define CLB_OUTPUT_LUT_6_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_6_IN2_S 10U +#define CLB_OUTPUT_LUT_6_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_6_FN_S 15U +#define CLB_OUTPUT_LUT_6_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_7 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_7_IN0_S 0U +#define CLB_OUTPUT_LUT_7_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_7_IN1_S 5U +#define CLB_OUTPUT_LUT_7_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_7_IN2_S 10U +#define CLB_OUTPUT_LUT_7_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_7_FN_S 15U +#define CLB_OUTPUT_LUT_7_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_HLC_EVENT_SEL register +// +//************************************************************************************************* +#define CLB_HLC_EVENT_SEL_EVENT0_SEL_S 0U +#define CLB_HLC_EVENT_SEL_EVENT0_SEL_M 0x1FU // Event Select 0 +#define CLB_HLC_EVENT_SEL_EVENT1_SEL_S 5U +#define CLB_HLC_EVENT_SEL_EVENT1_SEL_M 0x3E0U // Event Select 1 +#define CLB_HLC_EVENT_SEL_EVENT2_SEL_S 10U +#define CLB_HLC_EVENT_SEL_EVENT2_SEL_M 0x7C00U // Event Select 2 +#define CLB_HLC_EVENT_SEL_EVENT3_SEL_S 15U +#define CLB_HLC_EVENT_SEL_EVENT3_SEL_M 0xF8000U // Event Select 3 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOAD_EN register +// +//************************************************************************************************* +#define CLB_LOAD_EN_LOAD_EN 0x1U // Load Enable +#define CLB_LOAD_EN_GLOBAL_EN 0x2U // Global Enable +#define CLB_LOAD_EN_STOP 0x4U // Debug stop control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOAD_ADDR register +// +//************************************************************************************************* +#define CLB_LOAD_ADDR_ADDR_S 0U +#define CLB_LOAD_ADDR_ADDR_M 0x3FU // Indirect Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_INPUT_FILTER register +// +//************************************************************************************************* +#define CLB_INPUT_FILTER_FIN0_S 0U +#define CLB_INPUT_FILTER_FIN0_M 0x3U // Input filter control 0 +#define CLB_INPUT_FILTER_FIN1_S 2U +#define CLB_INPUT_FILTER_FIN1_M 0xCU // Input filter control 1 +#define CLB_INPUT_FILTER_FIN2_S 4U +#define CLB_INPUT_FILTER_FIN2_M 0x30U // Input filter control 2 +#define CLB_INPUT_FILTER_FIN3_S 6U +#define CLB_INPUT_FILTER_FIN3_M 0xC0U // Input filter control 3 +#define CLB_INPUT_FILTER_FIN4_S 8U +#define CLB_INPUT_FILTER_FIN4_M 0x300U // Input filter control 4 +#define CLB_INPUT_FILTER_FIN5_S 10U +#define CLB_INPUT_FILTER_FIN5_M 0xC00U // Input filter control 5 +#define CLB_INPUT_FILTER_FIN6_S 12U +#define CLB_INPUT_FILTER_FIN6_M 0x3000U // Input filter control 6 +#define CLB_INPUT_FILTER_FIN7_S 14U +#define CLB_INPUT_FILTER_FIN7_M 0xC000U // Input filter control 7 +#define CLB_INPUT_FILTER_SYNC0 0x10000U // Synchronizer control 0 +#define CLB_INPUT_FILTER_SYNC1 0x20000U // Synchronizer control 1 +#define CLB_INPUT_FILTER_SYNC2 0x40000U // Synchronizer control 2 +#define CLB_INPUT_FILTER_SYNC3 0x80000U // Synchronizer control 3 +#define CLB_INPUT_FILTER_SYNC4 0x100000U // Synchronizer control 4 +#define CLB_INPUT_FILTER_SYNC5 0x200000U // Synchronizer control 5 +#define CLB_INPUT_FILTER_SYNC6 0x400000U // Synchronizer control 6 +#define CLB_INPUT_FILTER_SYNC7 0x800000U // Synchronizer control 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_IN_MUX_SEL_0 register +// +//************************************************************************************************* +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_0 0x1U // Select GP register 0 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_1 0x2U // Select GP register 1 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_2 0x4U // Select GP register 2 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_3 0x8U // Select GP register 3 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_4 0x10U // Select GP register 4 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_5 0x20U // Select GP register 5 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_6 0x40U // Select GP register 6 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_7 0x80U // Select GP register 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_1 register +// +//************************************************************************************************* +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_S 0U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M 0x1FU // Local Mux select 0 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S 5U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_M 0x3E0U // Local Mux select 1 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_2_S 10U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_2_M 0x7C00U // Local Mux select 2 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_3_S 15U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_3_M 0xF8000U // Local Mux select 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_2 register +// +//************************************************************************************************* +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_4_S 0U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_4_M 0x1FU // Local Mux select 4 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_5_S 5U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_5_M 0x3E0U // Local Mux select 5 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_6_S 10U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_6_M 0x7C00U // Local Mux select 6 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_7_S 15U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_7_M 0xF8000U // Local Mux select 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_BUF_PTR register +// +//************************************************************************************************* +#define CLB_BUF_PTR_PULL_S 0U +#define CLB_BUF_PTR_PULL_M 0xFFU // Data pointer for pull +#define CLB_BUF_PTR_PUSH_S 16U +#define CLB_BUF_PTR_PUSH_M 0xFF0000U // Data pointer for pull + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GP_REG register +// +//************************************************************************************************* +#define CLB_GP_REG_REG_S 0U +#define CLB_GP_REG_REG_M 0xFFU // General Purpose bit register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_1 register +// +//************************************************************************************************* +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_S 0U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M 0x7FU // Global Mux select 0 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S 7U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_M 0x3F80U // Global Mux select 1 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_2_S 14U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_2_M 0x1FC000U // Global Mux select 2 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_3_S 21U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_3_M 0xFE00000U // Global Mux select 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_2 register +// +//************************************************************************************************* +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_4_S 0U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_4_M 0x7FU // Global Mux select 4 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_5_S 7U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_5_M 0x3F80U // Global Mux select 5 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_6_S 14U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_6_M 0x1FC000U // Global Mux select 6 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_7_S 21U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_7_M 0xFE00000U // Global Mux select 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_INTR_TAG_REG register +// +//************************************************************************************************* +#define CLB_INTR_TAG_REG_TAG_S 0U +#define CLB_INTR_TAG_REG_TAG_M 0x3FU // Interrupt tag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOCK register +// +//************************************************************************************************* +#define CLB_LOCK_LOCK 0x1U // LOCK enable +#define CLB_LOCK_KEY_S 16U +#define CLB_LOCK_KEY_M 0xFFFF0000U // Key for enabling write + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_DBG_OUT register +// +//************************************************************************************************* +#define CLB_DBG_OUT_COUNT0_MATCH2 0x2U // COUNT_MATCH2 UNIT 0 +#define CLB_DBG_OUT_COUNT0_ZERO 0x4U // COUNT_ZERO UNIT 0 +#define CLB_DBG_OUT_COUNT0_MATCH1 0x8U // COUNT_MATCH1 UNIT 0 +#define CLB_DBG_OUT_FSM0_S0 0x10U // FSM_S0 UNIT 0 +#define CLB_DBG_OUT_FSM0_S1 0x20U // FSM_S1 UNIT 0 +#define CLB_DBG_OUT_FSM0_LUTOUT 0x40U // FSM_LUT_OUT UNIT 0 +#define CLB_DBG_OUT_LUT40_OUT 0x80U // LUT4_OUT UNIT 0 +#define CLB_DBG_OUT_COUNT1_MATCH2 0x200U // COUNT_MATCH2 UNIT 1 +#define CLB_DBG_OUT_COUNT1_ZERO 0x400U // COUNT_ZERO UNIT 1 +#define CLB_DBG_OUT_COUNT1_MATCH1 0x800U // COUNT_MATCH1 UNIT 1 +#define CLB_DBG_OUT_FSM1_S0 0x1000U // FSM_S0 UNIT 1 +#define CLB_DBG_OUT_FSM1_S1 0x2000U // FSM_S1 UNIT 1 +#define CLB_DBG_OUT_FSM1_LUTOUT 0x4000U // FSM_LUT_OUT UNIT 1 +#define CLB_DBG_OUT_LUT41_OUT 0x8000U // LUT4_OUT UNIT 1 +#define CLB_DBG_OUT_COUNT2_MATCH2 0x20000U // COUNT_MATCH2 UNIT 2 +#define CLB_DBG_OUT_COUNT2_ZERO 0x40000U // COUNT_ZERO UNIT 2 +#define CLB_DBG_OUT_COUNT2_MATCH1 0x80000U // COUNT_MATCH1 UNIT 2 +#define CLB_DBG_OUT_FSM2_S0 0x100000U // FSM_S0 UNIT 2 +#define CLB_DBG_OUT_FSM2_S1 0x200000U // FSM_S1 UNIT 2 +#define CLB_DBG_OUT_FSM2_LUTOUT 0x400000U // FSM_LUT_OUT UNIT 2 +#define CLB_DBG_OUT_LUT42_OUT 0x800000U // LUT4_OUT UNIT 2 +#define CLB_DBG_OUT_OUT0 0x1000000U // CELL Output 0 +#define CLB_DBG_OUT_OUT1 0x2000000U // CELL Output 1 +#define CLB_DBG_OUT_OUT2 0x4000000U // CELL Output 2 +#define CLB_DBG_OUT_OUT3 0x8000000U // CELL Output 3 +#define CLB_DBG_OUT_OUT4 0x10000000U // CELL Output 4 +#define CLB_DBG_OUT_OUT5 0x20000000U // CELL Output 5 +#define CLB_DBG_OUT_OUT6 0x40000000U // CELL Output 6 +#define CLB_DBG_OUT_OUT7 0x80000000U // CELL Output 7 + + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_clbxbar.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_clbxbar.h new file mode 100644 index 0000000..64072e2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_clbxbar.h @@ -0,0 +1,1272 @@ +//########################################################################### +// +// FILE: hw_clbxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLBXBAR_H +#define HW_CLBXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_AUXSIG0MUX0TO15CFG 0x0U // CLB XBAR Mux Configuration for Output-0 +#define XBAR_O_AUXSIG0MUX16TO31CFG 0x2U // CLB XBAR Mux Configuration for Output-0 +#define XBAR_O_AUXSIG1MUX0TO15CFG 0x4U // CLB XBAR Mux Configuration for Output-1 +#define XBAR_O_AUXSIG1MUX16TO31CFG 0x6U // CLB XBAR Mux Configuration for Output-1 +#define XBAR_O_AUXSIG2MUX0TO15CFG 0x8U // CLB XBAR Mux Configuration for Output-2 +#define XBAR_O_AUXSIG2MUX16TO31CFG 0xAU // CLB XBAR Mux Configuration for Output-2 +#define XBAR_O_AUXSIG3MUX0TO15CFG 0xCU // CLB XBAR Mux Configuration for Output-3 +#define XBAR_O_AUXSIG3MUX16TO31CFG 0xEU // CLB XBAR Mux Configuration for Output-3 +#define XBAR_O_AUXSIG4MUX0TO15CFG 0x10U // CLB XBAR Mux Configuration for Output-4 +#define XBAR_O_AUXSIG4MUX16TO31CFG 0x12U // CLB XBAR Mux Configuration for Output-4 +#define XBAR_O_AUXSIG5MUX0TO15CFG 0x14U // CLB XBAR Mux Configuration for Output-5 +#define XBAR_O_AUXSIG5MUX16TO31CFG 0x16U // CLB XBAR Mux Configuration for Output-5 +#define XBAR_O_AUXSIG6MUX0TO15CFG 0x18U // CLB XBAR Mux Configuration for Output-6 +#define XBAR_O_AUXSIG6MUX16TO31CFG 0x1AU // CLB XBAR Mux Configuration for Output-6 +#define XBAR_O_AUXSIG7MUX0TO15CFG 0x1CU // CLB XBAR Mux Configuration for Output-7 +#define XBAR_O_AUXSIG7MUX16TO31CFG 0x1EU // CLB XBAR Mux Configuration for Output-7 +#define XBAR_O_AUXSIG0MUXENABLE 0x20U // CLB XBAR Mux Enable Register for Output-0 +#define XBAR_O_AUXSIG1MUXENABLE 0x22U // CLB XBAR Mux Enable Register for Output-1 +#define XBAR_O_AUXSIG2MUXENABLE 0x24U // CLB XBAR Mux Enable Register for Output-2 +#define XBAR_O_AUXSIG3MUXENABLE 0x26U // CLB XBAR Mux Enable Register for Output-3 +#define XBAR_O_AUXSIG4MUXENABLE 0x28U // CLB XBAR Mux Enable Register for Output-4 +#define XBAR_O_AUXSIG5MUXENABLE 0x2AU // CLB XBAR Mux Enable Register for Output-5 +#define XBAR_O_AUXSIG6MUXENABLE 0x2CU // CLB XBAR Mux Enable Register for Output-6 +#define XBAR_O_AUXSIG7MUXENABLE 0x2EU // CLB XBAR Mux Enable Register for Output-7 +#define XBAR_O_AUXSIGOUTINV 0x38U // CLB XBAR Output Inversion Register +#define XBAR_O_AUXSIGLOCK 0x3EU // ClbXbar Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG0 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG0 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG1 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG1 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG2 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG2 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG3 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG3 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG4 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG4 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG5 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG5 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG6 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG6 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG7 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG7 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG0 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG1 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG2 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG3 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG4 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG5 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG6 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG7 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIGOUTINV register +// +//************************************************************************************************* +#define XBAR_AUXSIGOUTINV_OUT0 0x1U // Selects polarity for AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT1 0x2U // Selects polarity for AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT2 0x4U // Selects polarity for AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT3 0x8U // Selects polarity for AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT4 0x10U // Selects polarity for AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT5 0x20U // Selects polarity for AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT6 0x40U // Selects polarity for AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT7 0x80U // Selects polarity for AUXSIG7 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIGLOCK register +// +//************************************************************************************************* +#define XBAR_AUXSIGLOCK_LOCK 0x1U // Locks the configuration for CLB-XBAR +#define XBAR_AUXSIGLOCK_KEY_S 16U +#define XBAR_AUXSIGLOCK_KEY_M 0xFFFF0000U // Write Protection KEY + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_cmpss.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cmpss.h new file mode 100644 index 0000000..67d32e3 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cmpss.h @@ -0,0 +1,235 @@ +//########################################################################### +// +// FILE: hw_cmpss.h +// +// TITLE: Definitions for the CMPSS registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CMPSS_H +#define HW_CMPSS_H + +//************************************************************************************************* +// +// The following are defines for the CMPSS register offsets +// +//************************************************************************************************* +#define CMPSS_O_COMPCTL 0x0U // CMPSS Comparator Control Register +#define CMPSS_O_COMPHYSCTL 0x1U // CMPSS Comparator Hysteresis Control Register +#define CMPSS_O_COMPSTS 0x2U // CMPSS Comparator Status Register +#define CMPSS_O_COMPSTSCLR 0x3U // CMPSS Comparator Status Clear Register +#define CMPSS_O_COMPDACCTL 0x4U // CMPSS DAC Control Register +#define CMPSS_O_DACHVALS 0x6U // CMPSS High DAC Value Shadow Register +#define CMPSS_O_DACHVALA 0x7U // CMPSS High DAC Value Active Register +#define CMPSS_O_RAMPMAXREFA 0x8U // CMPSS Ramp Max Reference Active Register +#define CMPSS_O_RAMPMAXREFS 0xAU // CMPSS Ramp Max Reference Shadow Register +#define CMPSS_O_RAMPDECVALA 0xCU // CMPSS Ramp Decrement Value Active Register +#define CMPSS_O_RAMPDECVALS 0xEU // CMPSS Ramp Decrement Value Shadow Register +#define CMPSS_O_RAMPSTS 0x10U // CMPSS Ramp Status Register +#define CMPSS_O_DACLVALS 0x12U // CMPSS Low DAC Value Shadow Register +#define CMPSS_O_DACLVALA 0x13U // CMPSS Low DAC Value Active Register +#define CMPSS_O_RAMPDLYA 0x14U // CMPSS Ramp Delay Active Register +#define CMPSS_O_RAMPDLYS 0x15U // CMPSS Ramp Delay Shadow Register +#define CMPSS_O_CTRIPLFILCTL 0x16U // CTRIPL Filter Control Register +#define CMPSS_O_CTRIPLFILCLKCTL 0x17U // CTRIPL Filter Clock Control Register +#define CMPSS_O_CTRIPHFILCTL 0x18U // CTRIPH Filter Control Register +#define CMPSS_O_CTRIPHFILCLKCTL 0x19U // CTRIPH Filter Clock Control Register +#define CMPSS_O_COMPLOCK 0x1AU // CMPSS Lock Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPCTL register +// +//************************************************************************************************* +#define CMPSS_COMPCTL_COMPHSOURCE 0x1U // High Comparator Source Select +#define CMPSS_COMPCTL_COMPHINV 0x2U // High Comparator Invert Select +#define CMPSS_COMPCTL_CTRIPHSEL_S 2U +#define CMPSS_COMPCTL_CTRIPHSEL_M 0xCU // High Comparator Trip Select +#define CMPSS_COMPCTL_CTRIPOUTHSEL_S 4U +#define CMPSS_COMPCTL_CTRIPOUTHSEL_M 0x30U // High Comparator Trip Output Select +#define CMPSS_COMPCTL_ASYNCHEN 0x40U // High Comparator Asynchronous Path Enable +#define CMPSS_COMPCTL_COMPLSOURCE 0x100U // Low Comparator Source Select +#define CMPSS_COMPCTL_COMPLINV 0x200U // Low Comparator Invert Select +#define CMPSS_COMPCTL_CTRIPLSEL_S 10U +#define CMPSS_COMPCTL_CTRIPLSEL_M 0xC00U // Low Comparator Trip Select +#define CMPSS_COMPCTL_CTRIPOUTLSEL_S 12U +#define CMPSS_COMPCTL_CTRIPOUTLSEL_M 0x3000U // Low Comparator Trip Output Select +#define CMPSS_COMPCTL_ASYNCLEN 0x4000U // Low Comparator Asynchronous Path Enable +#define CMPSS_COMPCTL_COMPDACE 0x8000U // Comparator/DAC Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPHYSCTL register +// +//************************************************************************************************* +#define CMPSS_COMPHYSCTL_COMPHYS_S 0U +#define CMPSS_COMPHYSCTL_COMPHYS_M 0x7U // Comparator Hysteresis Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPSTS register +// +//************************************************************************************************* +#define CMPSS_COMPSTS_COMPHSTS 0x1U // High Comparator Status +#define CMPSS_COMPSTS_COMPHLATCH 0x2U // High Comparator Latched Status +#define CMPSS_COMPSTS_COMPLSTS 0x100U // Low Comparator Status +#define CMPSS_COMPSTS_COMPLLATCH 0x200U // Low Comparator Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPSTSCLR register +// +//************************************************************************************************* +#define CMPSS_COMPSTSCLR_HLATCHCLR 0x2U // High Comparator Latched Status Clear +#define CMPSS_COMPSTSCLR_HSYNCCLREN 0x4U // High Comparator EPWMSYNCPER Clear Enable +#define CMPSS_COMPSTSCLR_LLATCHCLR 0x200U // Low Comparator Latched Status Clear +#define CMPSS_COMPSTSCLR_LSYNCCLREN 0x400U // Low Comparator EPWMSYNCPER Clear Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPDACCTL register +// +//************************************************************************************************* +#define CMPSS_COMPDACCTL_DACSOURCE 0x1U // DAC Source Control +#define CMPSS_COMPDACCTL_RAMPSOURCE_S 1U +#define CMPSS_COMPDACCTL_RAMPSOURCE_M 0x1EU // Ramp Generator Source Control +#define CMPSS_COMPDACCTL_SELREF 0x20U // DAC Reference Select +#define CMPSS_COMPDACCTL_RAMPLOADSEL 0x40U // Ramp Load Select +#define CMPSS_COMPDACCTL_SWLOADSEL 0x80U // Software Load Select +#define CMPSS_COMPDACCTL_FREESOFT_S 14U +#define CMPSS_COMPDACCTL_FREESOFT_M 0xC000U // Free/Soft Emulation Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACHVALS register +// +//************************************************************************************************* +#define CMPSS_DACHVALS_DACVAL_S 0U +#define CMPSS_DACHVALS_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACHVALA register +// +//************************************************************************************************* +#define CMPSS_DACHVALA_DACVAL_S 0U +#define CMPSS_DACHVALA_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLVALS register +// +//************************************************************************************************* +#define CMPSS_DACLVALS_DACVAL_S 0U +#define CMPSS_DACLVALS_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLVALA register +// +//************************************************************************************************* +#define CMPSS_DACLVALA_DACVAL_S 0U +#define CMPSS_DACLVALA_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMPDLYA register +// +//************************************************************************************************* +#define CMPSS_RAMPDLYA_DELAY_S 0U +#define CMPSS_RAMPDLYA_DELAY_M 0x1FFFU // Ramp Delay Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMPDLYS register +// +//************************************************************************************************* +#define CMPSS_RAMPDLYS_DELAY_S 0U +#define CMPSS_RAMPDLYS_DELAY_M 0x1FFFU // Ramp Delay Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPLFILCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPLFILCTL_SAMPWIN_S 4U +#define CMPSS_CTRIPLFILCTL_SAMPWIN_M 0x1F0U // Sample Window +#define CMPSS_CTRIPLFILCTL_THRESH_S 9U +#define CMPSS_CTRIPLFILCTL_THRESH_M 0x3E00U // Majority Voting Threshold +#define CMPSS_CTRIPLFILCTL_FILINIT 0x8000U // Filter Initialization Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPLFILCLKCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPLFILCLKCTL_CLKPRESCALE_S 0U +#define CMPSS_CTRIPLFILCLKCTL_CLKPRESCALE_M 0x3FFU // Sample Clock Prescale + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPHFILCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPHFILCTL_SAMPWIN_S 4U +#define CMPSS_CTRIPHFILCTL_SAMPWIN_M 0x1F0U // Sample Window +#define CMPSS_CTRIPHFILCTL_THRESH_S 9U +#define CMPSS_CTRIPHFILCTL_THRESH_M 0x3E00U // Majority Voting Threshold +#define CMPSS_CTRIPHFILCTL_FILINIT 0x8000U // Filter Initialization Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPHFILCLKCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPHFILCLKCTL_CLKPRESCALE_S 0U +#define CMPSS_CTRIPHFILCLKCTL_CLKPRESCALE_M 0x3FFU // Sample Clock Prescale + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPLOCK register +// +//************************************************************************************************* +#define CMPSS_COMPLOCK_COMPCTL 0x1U // COMPCTL Lock +#define CMPSS_COMPLOCK_COMPHYSCTL 0x2U // COMPHYSCTL Lock +#define CMPSS_COMPLOCK_DACCTL 0x4U // DACCTL Lock +#define CMPSS_COMPLOCK_CTRIP 0x8U // CTRIP Lock + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_cputimer.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cputimer.h new file mode 100644 index 0000000..f7613fb --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_cputimer.h @@ -0,0 +1,112 @@ +//########################################################################### +// +// FILE: hw_cputimer.h +// +// TITLE: Definitions for the CPUTIMER registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CPUTIMER_H +#define HW_CPUTIMER_H + +//************************************************************************************************* +// +// The following are defines for the CPUTIMER register offsets +// +//************************************************************************************************* +#define CPUTIMER_O_TIM 0x0U // CPU-Timer, Counter Register +#define CPUTIMER_O_PRD 0x2U // CPU-Timer, Period Register +#define CPUTIMER_O_TCR 0x4U // CPU-Timer, Control Register +#define CPUTIMER_O_TPR 0x6U // CPU-Timer, Prescale Register +#define CPUTIMER_O_TPRH 0x7U // CPU-Timer, Prescale Register High + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TIM register +// +//************************************************************************************************* +#define CPUTIMER_TIM_LSW_S 0U +#define CPUTIMER_TIM_LSW_M 0xFFFFU // CPU-Timer Counter Registers +#define CPUTIMER_TIM_MSW_S 16U +#define CPUTIMER_TIM_MSW_M 0xFFFF0000U // CPU-Timer Counter Registers High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRD register +// +//************************************************************************************************* +#define CPUTIMER_PRD_LSW_S 0U +#define CPUTIMER_PRD_LSW_M 0xFFFFU // CPU-Timer Period Registers +#define CPUTIMER_PRD_MSW_S 16U +#define CPUTIMER_PRD_MSW_M 0xFFFF0000U // CPU-Timer Period Registers High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TCR register +// +//************************************************************************************************* +#define CPUTIMER_TCR_TSS 0x10U // CPU-Timer stop status bit. +#define CPUTIMER_TCR_TRB 0x20U // Timer reload +#define CPUTIMER_TCR_SOFT 0x400U // Emulation modes +#define CPUTIMER_TCR_FREE 0x800U // Emulation modes +#define CPUTIMER_TCR_TIE 0x4000U // CPU-Timer Interrupt Enable. +#define CPUTIMER_TCR_TIF 0x8000U // CPU-Timer Interrupt Flag. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TPR register +// +//************************************************************************************************* +#define CPUTIMER_TPR_TDDR_S 0U +#define CPUTIMER_TPR_TDDR_M 0xFFU // CPU-Timer Divide-Down. +#define CPUTIMER_TPR_PSC_S 8U +#define CPUTIMER_TPR_PSC_M 0xFF00U // CPU-Timer Prescale Counter. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TPRH register +// +//************************************************************************************************* +#define CPUTIMER_TPRH_TDDRH_S 0U +#define CPUTIMER_TPRH_TDDRH_M 0xFFU // CPU-Timer Divide-Down. +#define CPUTIMER_TPRH_PSCH_S 8U +#define CPUTIMER_TPRH_PSCH_M 0xFF00U // CPU-Timer Prescale Counter. + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_dac.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dac.h new file mode 100644 index 0000000..3e3d3a2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dac.h @@ -0,0 +1,122 @@ +//########################################################################### +// +// FILE: hw_dac.h +// +// TITLE: Definitions for the DAC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DAC_H +#define HW_DAC_H + +//************************************************************************************************* +// +// The following are defines for the DAC register offsets +// +//************************************************************************************************* +#define DAC_O_REV 0x0U // DAC Revision Register +#define DAC_O_CTL 0x1U // DAC Control Register +#define DAC_O_VALA 0x2U // DAC Value Register - Active +#define DAC_O_VALS 0x3U // DAC Value Register - Shadow +#define DAC_O_OUTEN 0x4U // DAC Output Enable Register +#define DAC_O_LOCK 0x5U // DAC Lock Register +#define DAC_O_TRIM 0x6U // DAC Trim Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACREV register +// +//************************************************************************************************* +#define DAC_REV_REV_S 0U +#define DAC_REV_REV_M 0xFFU // DAC Revision Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACCTL register +// +//************************************************************************************************* +#define DAC_CTL_DACREFSEL 0x1U // DAC Reference Select +#define DAC_CTL_LOADMODE 0x4U // DACVALA Load Mode +#define DAC_CTL_SYNCSEL_S 4U +#define DAC_CTL_SYNCSEL_M 0xF0U // DAC EPWMSYNCPER Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACVALA register +// +//************************************************************************************************* +#define DAC_VALA_DACVALA_S 0U +#define DAC_VALA_DACVALA_M 0xFFFU // DAC Active Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACVALS register +// +//************************************************************************************************* +#define DAC_VALS_DACVALS_S 0U +#define DAC_VALS_DACVALS_M 0xFFFU // DAC Shadow Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACOUTEN register +// +//************************************************************************************************* +#define DAC_OUTEN_DACOUTEN 0x1U // DAC Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLOCK register +// +//************************************************************************************************* +#define DAC_LOCK_DACCTL 0x1U // DAC Control Register Lock +#define DAC_LOCK_DACVAL 0x2U // DAC Value Register Lock +#define DAC_LOCK_DACOUTEN 0x4U // DAC Output Enable Register Lock +#define DAC_LOCK_KEY_S 12U +#define DAC_LOCK_KEY_M 0xF000U // DAC Register Lock Key + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACTRIM register +// +//************************************************************************************************* +#define DAC_TRIM_OFFSET_TRIM_S 0U +#define DAC_TRIM_OFFSET_TRIM_M 0xFFU // DAC Offset Trim + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_dcsm.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dcsm.h new file mode 100644 index 0000000..c81bcb1 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dcsm.h @@ -0,0 +1,442 @@ +//########################################################################### +// +// FILE: hw_dcsm.h +// +// TITLE: Definitions for the DCSM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DCSM_H +#define HW_DCSM_H + +//************************************************************************************************* +// +// The following are defines for the DCSM register offsets +// +//************************************************************************************************* +#define DCSM_O_Z1OTP_LINKPOINTER1 0x0U // Zone 1 Link Pointer1 in Z1 OTP +#define DCSM_O_Z1OTP_LINKPOINTER2 0x4U // Zone 1 Link Pointer2 in Z1 OTP +#define DCSM_O_Z1OTP_LINKPOINTER3 0x8U // Zone 1 Link Pointer3 in Z1 OTP +#define DCSM_O_Z1OTP_PSWDLOCK 0x10U // Secure Password Lock in Z1 OTP +#define DCSM_O_Z1OTP_CRCLOCK 0x14U // Secure CRC Lock in Z1 OTP +#define DCSM_O_Z1OTP_BOOTCTRL 0x1EU // Boot Mode in Z1 OTP + +#define DCSM_O_Z2OTP_LINKPOINTER1 0x0U // Zone 2 Link Pointer1 in Z2 OTP +#define DCSM_O_Z2OTP_LINKPOINTER2 0x4U // Zone 2 Link Pointer2 in Z2 OTP +#define DCSM_O_Z2OTP_LINKPOINTER3 0x8U // Zone 2 Link Pointer3 in Z2 OTP +#define DCSM_O_Z2OTP_PSWDLOCK 0x10U // Secure Password Lock in Z2 OTP +#define DCSM_O_Z2OTP_CRCLOCK 0x14U // Secure CRC Lock in Z2 OTP +#define DCSM_O_Z2OTP_BOOTCTRL 0x1EU // Boot Mode in Z2 OTP + +#define DCSM_O_Z1_LINKPOINTER 0x0U // Zone 1 Link Pointer +#define DCSM_O_Z1_OTPSECLOCK 0x2U // Zone 1 OTP Secure JTAG lock +#define DCSM_O_Z1_BOOTCTRL 0x4U // Boot Mode +#define DCSM_O_Z1_LINKPOINTERERR 0x6U // Link Pointer Error +#define DCSM_O_Z1_CSMKEY0 0x10U // Zone 1 CSM Key 0 +#define DCSM_O_Z1_CSMKEY1 0x12U // Zone 1 CSM Key 1 +#define DCSM_O_Z1_CSMKEY2 0x14U // Zone 1 CSM Key 2 +#define DCSM_O_Z1_CSMKEY3 0x16U // Zone 1 CSM Key 3 +#define DCSM_O_Z1_CR 0x19U // Zone 1 CSM Control Register +#define DCSM_O_Z1_GRABSECTR 0x1AU // Zone 1 Grab Flash Sectors Register +#define DCSM_O_Z1_GRABRAMR 0x1CU // Zone 1 Grab RAM Blocks Register +#define DCSM_O_Z1_EXEONLYSECTR 0x1EU // Zone 1 Flash Execute_Only Sector Register +#define DCSM_O_Z1_EXEONLYRAMR 0x20U // Zone 1 RAM Execute_Only Block Register + +#define DCSM_O_Z2_LINKPOINTER 0x0U // Zone 2 Link Pointer +#define DCSM_O_Z2_OTPSECLOCK 0x2U // Zone 2 OTP Secure JTAG lock +#define DCSM_O_Z2_BOOTCTRL 0x4U // Boot Mode +#define DCSM_O_Z2_LINKPOINTERERR 0x6U // Link Pointer Error +#define DCSM_O_Z2_CSMKEY0 0x10U // Zone 2 CSM Key 0 +#define DCSM_O_Z2_CSMKEY1 0x12U // Zone 2 CSM Key 1 +#define DCSM_O_Z2_CSMKEY2 0x14U // Zone 2 CSM Key 2 +#define DCSM_O_Z2_CSMKEY3 0x16U // Zone 2 CSM Key 3 +#define DCSM_O_Z2_CR 0x19U // Zone 2 CSM Control Register +#define DCSM_O_Z2_GRABSECTR 0x1AU // Zone 2 Grab Flash Sectors Register +#define DCSM_O_Z2_GRABRAMR 0x1CU // Zone 2 Grab RAM Blocks Register +#define DCSM_O_Z2_EXEONLYSECTR 0x1EU // Zone 2 Flash Execute_Only Sector Register +#define DCSM_O_Z2_EXEONLYRAMR 0x20U // Zone 2 RAM Execute_Only Block Register + +#define DCSM_O_FLSEM 0x0U // Flash Wrapper Semaphore Register +#define DCSM_O_SECTSTAT 0x2U // Sectors Status Register +#define DCSM_O_RAMSTAT 0x4U // RAM Status Register + + + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_LINKPOINTER register +// +//************************************************************************************************* +#define DCSM_Z1_LINKPOINTER_LINKPOINTER_S 0U +#define DCSM_Z1_LINKPOINTER_LINKPOINTER_M 0x1FFFFFFFU // Zone1 LINK Pointer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_OTPSECLOCK register +// +//************************************************************************************************* +#define DCSM_Z1_OTPSECLOCK_PSWDLOCK_S 4U +#define DCSM_Z1_OTPSECLOCK_PSWDLOCK_M 0xF0U // Zone1 Password Lock. +#define DCSM_Z1_OTPSECLOCK_CRCLOCK_S 8U +#define DCSM_Z1_OTPSECLOCK_CRCLOCK_M 0xF00U // Zone1 CRC Lock. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_BOOTCTRL register +// +//************************************************************************************************* +#define DCSM_Z1_BOOTCTRL_KEY_S 0U +#define DCSM_Z1_BOOTCTRL_KEY_M 0xFFU // OTP Boot Key +#define DCSM_Z1_BOOTCTRL_BMODE_S 8U +#define DCSM_Z1_BOOTCTRL_BMODE_M 0xFF00U // OTP Boot Mode +#define DCSM_Z1_BOOTCTRL_BOOTPIN0_S 16U +#define DCSM_Z1_BOOTCTRL_BOOTPIN0_M 0xFF0000U // OTP Boot Pin 0 Mapping +#define DCSM_Z1_BOOTCTRL_BOOTPIN1_S 24U +#define DCSM_Z1_BOOTCTRL_BOOTPIN1_M 0xFF000000U // OTP Boot Pin 1 Mapping + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_CR register +// +//************************************************************************************************* +#define DCSM_Z1_CR_ALLZERO 0x8U // CSMPSWD All Zeros +#define DCSM_Z1_CR_ALLONE 0x10U // CSMPSWD All Ones +#define DCSM_Z1_CR_UNSECURE 0x20U // CSMPSWD Match CSMKEY +#define DCSM_Z1_CR_ARMED 0x40U // CSM Armed +#define DCSM_Z1_CR_FORCESEC 0x8000U // Force Secure + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_GRABSECTR register +// +//************************************************************************************************* +#define DCSM_Z1_GRABSECTR_GRAB_SECTA_S 0U +#define DCSM_Z1_GRABSECTR_GRAB_SECTA_M 0x3U // Grab Flash Sector A +#define DCSM_Z1_GRABSECTR_GRAB_SECTB_S 2U +#define DCSM_Z1_GRABSECTR_GRAB_SECTB_M 0xCU // Grab Flash Sector B +#define DCSM_Z1_GRABSECTR_GRAB_SECTC_S 4U +#define DCSM_Z1_GRABSECTR_GRAB_SECTC_M 0x30U // Grab Flash Sector C +#define DCSM_Z1_GRABSECTR_GRAB_SECTD_S 6U +#define DCSM_Z1_GRABSECTR_GRAB_SECTD_M 0xC0U // Grab Flash Sector D +#define DCSM_Z1_GRABSECTR_GRAB_SECTE_S 8U +#define DCSM_Z1_GRABSECTR_GRAB_SECTE_M 0x300U // Grab Flash Sector E +#define DCSM_Z1_GRABSECTR_GRAB_SECTF_S 10U +#define DCSM_Z1_GRABSECTR_GRAB_SECTF_M 0xC00U // Grab Flash Sector F +#define DCSM_Z1_GRABSECTR_GRAB_SECTG_S 12U +#define DCSM_Z1_GRABSECTR_GRAB_SECTG_M 0x3000U // Grab Flash Sector G +#define DCSM_Z1_GRABSECTR_GRAB_SECTH_S 14U +#define DCSM_Z1_GRABSECTR_GRAB_SECTH_M 0xC000U // Grab Flash Sector H +#define DCSM_Z1_GRABSECTR_GRAB_SECTI_S 16U +#define DCSM_Z1_GRABSECTR_GRAB_SECTI_M 0x30000U // Grab Flash Sector I +#define DCSM_Z1_GRABSECTR_GRAB_SECTJ_S 18U +#define DCSM_Z1_GRABSECTR_GRAB_SECTJ_M 0xC0000U // Grab Flash Sector J +#define DCSM_Z1_GRABSECTR_GRAB_SECTK_S 20U +#define DCSM_Z1_GRABSECTR_GRAB_SECTK_M 0x300000U // Grab Flash Sector K +#define DCSM_Z1_GRABSECTR_GRAB_SECTL_S 22U +#define DCSM_Z1_GRABSECTR_GRAB_SECTL_M 0xC00000U // Grab Flash Sector L +#define DCSM_Z1_GRABSECTR_GRAB_SECTM_S 24U +#define DCSM_Z1_GRABSECTR_GRAB_SECTM_M 0x3000000U // Grab Flash Sector M +#define DCSM_Z1_GRABSECTR_GRAB_SECTN_S 26U +#define DCSM_Z1_GRABSECTR_GRAB_SECTN_M 0xC000000U // Grab Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_GRABRAMR register +// +//************************************************************************************************* +#define DCSM_Z1_GRABRAMR_GRAB_RAM0_S 0U +#define DCSM_Z1_GRABRAMR_GRAB_RAM0_M 0x3U // Grab RAM LS0 +#define DCSM_Z1_GRABRAMR_GRAB_RAM1_S 2U +#define DCSM_Z1_GRABRAMR_GRAB_RAM1_M 0xCU // Grab RAM LS1 +#define DCSM_Z1_GRABRAMR_GRAB_RAM2_S 4U +#define DCSM_Z1_GRABRAMR_GRAB_RAM2_M 0x30U // Grab RAM LS2 +#define DCSM_Z1_GRABRAMR_GRAB_RAM3_S 6U +#define DCSM_Z1_GRABRAMR_GRAB_RAM3_M 0xC0U // Grab RAM LS3 +#define DCSM_Z1_GRABRAMR_GRAB_RAM4_S 8U +#define DCSM_Z1_GRABRAMR_GRAB_RAM4_M 0x300U // Grab RAM LS4 +#define DCSM_Z1_GRABRAMR_GRAB_RAM5_S 10U +#define DCSM_Z1_GRABRAMR_GRAB_RAM5_M 0xC00U // Grab RAM LS5 +#define DCSM_Z1_GRABRAMR_GRAB_RAM6_S 12U +#define DCSM_Z1_GRABRAMR_GRAB_RAM6_M 0x3000U // Grab RAM D0 +#define DCSM_Z1_GRABRAMR_GRAB_RAM7_S 14U +#define DCSM_Z1_GRABRAMR_GRAB_RAM7_M 0xC000U // Grab RAM D1 +#define DCSM_Z1_GRABRAMR_GRAB_CLA1_S 28U +#define DCSM_Z1_GRABRAMR_GRAB_CLA1_M 0x30000000U // Grab CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_EXEONLYSECTR register +// +//************************************************************************************************* +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTA 0x1U // Execute-Only Flash Sector A +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTB 0x2U // Execute-Only Flash Sector B +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTC 0x4U // Execute-Only Flash Sector C +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTD 0x8U // Execute-Only Flash Sector D +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTE 0x10U // Execute-Only Flash Sector E +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTF 0x20U // Execute-Only Flash Sector F +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTG 0x40U // Execute-Only Flash Sector G +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTH 0x80U // Execute-Only Flash Sector H +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTI 0x100U // Execute-Only Flash Sector I +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTJ 0x200U // Execute-Only Flash Sector J +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTK 0x400U // Execute-Only Flash Sector K +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTL 0x800U // Execute-Only Flash Sector L +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTM 0x1000U // Execute-Only Flash Sector M +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTN 0x2000U // Execute-Only Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_EXEONLYRAMR register +// +//************************************************************************************************* +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM0 0x1U // Execute-Only RAM LS0 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM1 0x2U // Execute-Only RAM LS1 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM2 0x4U // Execute-Only RAM LS2 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM3 0x8U // Execute-Only RAM LS3 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM4 0x10U // Execute-Only RAM LS4 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM5 0x20U // Execute-Only RAM LS5 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM6 0x40U // Execute-Only RAM D0 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM7 0x80U // Execute-Only RAM D1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_LINKPOINTER register +// +//************************************************************************************************* +#define DCSM_Z2_LINKPOINTER_LINKPOINTER_S 0U +#define DCSM_Z2_LINKPOINTER_LINKPOINTER_M 0x1FFFFFFFU // Zone2 LINK Pointer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_OTPSECLOCK register +// +//************************************************************************************************* +#define DCSM_Z2_OTPSECLOCK_PSWDLOCK_S 4U +#define DCSM_Z2_OTPSECLOCK_PSWDLOCK_M 0xF0U // Zone2 Password Lock. +#define DCSM_Z2_OTPSECLOCK_CRCLOCK_S 8U +#define DCSM_Z2_OTPSECLOCK_CRCLOCK_M 0xF00U // Zone2 CRC Lock. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_BOOTCTRL register +// +//************************************************************************************************* +#define DCSM_Z2_BOOTCTRL_KEY_S 0U +#define DCSM_Z2_BOOTCTRL_KEY_M 0xFFU // OTP Boot Key +#define DCSM_Z2_BOOTCTRL_BMODE_S 8U +#define DCSM_Z2_BOOTCTRL_BMODE_M 0xFF00U // OTP Boot Mode +#define DCSM_Z2_BOOTCTRL_BOOTPIN0_S 16U +#define DCSM_Z2_BOOTCTRL_BOOTPIN0_M 0xFF0000U // OTP Boot Pin 0 Mapping +#define DCSM_Z2_BOOTCTRL_BOOTPIN1_S 24U +#define DCSM_Z2_BOOTCTRL_BOOTPIN1_M 0xFF000000U // OTP Boot Pin 1 Mapping + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_CR register +// +//************************************************************************************************* +#define DCSM_Z2_CR_ALLZERO 0x8U // CSMPSWD All Zeros +#define DCSM_Z2_CR_ALLONE 0x10U // CSMPSWD All Ones +#define DCSM_Z2_CR_UNSECURE 0x20U // CSMPSWD Match CSMKEY +#define DCSM_Z2_CR_ARMED 0x40U // CSM Armed +#define DCSM_Z2_CR_FORCESEC 0x8000U // Force Secure + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_GRABSECTR register +// +//************************************************************************************************* +#define DCSM_Z2_GRABSECTR_GRAB_SECTA_S 0U +#define DCSM_Z2_GRABSECTR_GRAB_SECTA_M 0x3U // Grab Flash Sector A +#define DCSM_Z2_GRABSECTR_GRAB_SECTB_S 2U +#define DCSM_Z2_GRABSECTR_GRAB_SECTB_M 0xCU // Grab Flash Sector B +#define DCSM_Z2_GRABSECTR_GRAB_SECTC_S 4U +#define DCSM_Z2_GRABSECTR_GRAB_SECTC_M 0x30U // Grab Flash Sector C +#define DCSM_Z2_GRABSECTR_GRAB_SECTD_S 6U +#define DCSM_Z2_GRABSECTR_GRAB_SECTD_M 0xC0U // Grab Flash Sector D +#define DCSM_Z2_GRABSECTR_GRAB_SECTE_S 8U +#define DCSM_Z2_GRABSECTR_GRAB_SECTE_M 0x300U // Grab Flash Sector E +#define DCSM_Z2_GRABSECTR_GRAB_SECTF_S 10U +#define DCSM_Z2_GRABSECTR_GRAB_SECTF_M 0xC00U // Grab Flash Sector F +#define DCSM_Z2_GRABSECTR_GRAB_SECTG_S 12U +#define DCSM_Z2_GRABSECTR_GRAB_SECTG_M 0x3000U // Grab Flash Sector G +#define DCSM_Z2_GRABSECTR_GRAB_SECTH_S 14U +#define DCSM_Z2_GRABSECTR_GRAB_SECTH_M 0xC000U // Grab Flash Sector H +#define DCSM_Z2_GRABSECTR_GRAB_SECTI_S 16U +#define DCSM_Z2_GRABSECTR_GRAB_SECTI_M 0x30000U // Grab Flash Sector I +#define DCSM_Z2_GRABSECTR_GRAB_SECTJ_S 18U +#define DCSM_Z2_GRABSECTR_GRAB_SECTJ_M 0xC0000U // Grab Flash Sector J +#define DCSM_Z2_GRABSECTR_GRAB_SECTK_S 20U +#define DCSM_Z2_GRABSECTR_GRAB_SECTK_M 0x300000U // Grab Flash Sector K +#define DCSM_Z2_GRABSECTR_GRAB_SECTL_S 22U +#define DCSM_Z2_GRABSECTR_GRAB_SECTL_M 0xC00000U // Grab Flash Sector L +#define DCSM_Z2_GRABSECTR_GRAB_SECTM_S 24U +#define DCSM_Z2_GRABSECTR_GRAB_SECTM_M 0x3000000U // Grab Flash Sector M +#define DCSM_Z2_GRABSECTR_GRAB_SECTN_S 26U +#define DCSM_Z2_GRABSECTR_GRAB_SECTN_M 0xC000000U // Grab Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_GRABRAMR register +// +//************************************************************************************************* +#define DCSM_Z2_GRABRAMR_GRAB_RAM0_S 0U +#define DCSM_Z2_GRABRAMR_GRAB_RAM0_M 0x3U // Grab RAM LS0 +#define DCSM_Z2_GRABRAMR_GRAB_RAM1_S 2U +#define DCSM_Z2_GRABRAMR_GRAB_RAM1_M 0xCU // Grab RAM LS1 +#define DCSM_Z2_GRABRAMR_GRAB_RAM2_S 4U +#define DCSM_Z2_GRABRAMR_GRAB_RAM2_M 0x30U // Grab RAM LS2 +#define DCSM_Z2_GRABRAMR_GRAB_RAM3_S 6U +#define DCSM_Z2_GRABRAMR_GRAB_RAM3_M 0xC0U // Grab RAM LS3 +#define DCSM_Z2_GRABRAMR_GRAB_RAM4_S 8U +#define DCSM_Z2_GRABRAMR_GRAB_RAM4_M 0x300U // Grab RAM LS4 +#define DCSM_Z2_GRABRAMR_GRAB_RAM5_S 10U +#define DCSM_Z2_GRABRAMR_GRAB_RAM5_M 0xC00U // Grab RAM LS5 +#define DCSM_Z2_GRABRAMR_GRAB_RAM6_S 12U +#define DCSM_Z2_GRABRAMR_GRAB_RAM6_M 0x3000U // Grab RAM D0 +#define DCSM_Z2_GRABRAMR_GRAB_RAM7_S 14U +#define DCSM_Z2_GRABRAMR_GRAB_RAM7_M 0xC000U // Grab RAM D1 +#define DCSM_Z2_GRABRAMR_GRAB_CLA1_S 28U +#define DCSM_Z2_GRABRAMR_GRAB_CLA1_M 0x30000000U // Grab CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_EXEONLYSECTR register +// +//************************************************************************************************* +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTA 0x1U // Execute-Only Flash Sector A +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTB 0x2U // Execute-Only Flash Sector B +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTC 0x4U // Execute-Only Flash Sector C +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTD 0x8U // Execute-Only Flash Sector D +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTE 0x10U // Execute-Only Flash Sector E +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTF 0x20U // Execute-Only Flash Sector F +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTG 0x40U // Execute-Only Flash Sector G +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTH 0x80U // Execute-Only Flash Sector H +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTI 0x100U // Execute-Only Flash Sector I +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTJ 0x200U // Execute-Only Flash Sector J +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTK 0x400U // Execute-Only Flash Sector K +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTL 0x800U // Execute-Only Flash Sector L +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTM 0x1000U // Execute-Only Flash Sector M +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTN 0x2000U // Execute-Only Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_EXEONLYRAMR register +// +//************************************************************************************************* +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM0 0x1U // Execute-Only RAM LS0 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM1 0x2U // Execute-Only RAM LS1 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM2 0x4U // Execute-Only RAM LS2 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM3 0x8U // Execute-Only RAM LS3 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM4 0x10U // Execute-Only RAM LS4 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM5 0x20U // Execute-Only RAM LS5 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM6 0x40U // Execute-Only RAM D0 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM7 0x80U // Execute-Only RAM D1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FLSEM register +// +//************************************************************************************************* +#define DCSM_FLSEM_SEM_S 0U +#define DCSM_FLSEM_SEM_M 0x3U // Flash Semaphore Bit +#define DCSM_FLSEM_KEY_S 8U +#define DCSM_FLSEM_KEY_M 0xFF00U // Semaphore Key + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SECTSTAT register +// +//************************************************************************************************* +#define DCSM_SECTSTAT_STATUS_SECTA_S 0U +#define DCSM_SECTSTAT_STATUS_SECTA_M 0x3U // Zone Status Flash Sector A +#define DCSM_SECTSTAT_STATUS_SECTB_S 2U +#define DCSM_SECTSTAT_STATUS_SECTB_M 0xCU // Zone Status Flash Sector B +#define DCSM_SECTSTAT_STATUS_SECTC_S 4U +#define DCSM_SECTSTAT_STATUS_SECTC_M 0x30U // Zone Status Flash Sector C +#define DCSM_SECTSTAT_STATUS_SECTD_S 6U +#define DCSM_SECTSTAT_STATUS_SECTD_M 0xC0U // Zone Status Flash Sector D +#define DCSM_SECTSTAT_STATUS_SECTE_S 8U +#define DCSM_SECTSTAT_STATUS_SECTE_M 0x300U // Zone Status Flash Sector E +#define DCSM_SECTSTAT_STATUS_SECTF_S 10U +#define DCSM_SECTSTAT_STATUS_SECTF_M 0xC00U // Zone Status Flash Sector F +#define DCSM_SECTSTAT_STATUS_SECTG_S 12U +#define DCSM_SECTSTAT_STATUS_SECTG_M 0x3000U // Zone Status Flash Sector G +#define DCSM_SECTSTAT_STATUS_SECTH_S 14U +#define DCSM_SECTSTAT_STATUS_SECTH_M 0xC000U // Zone Status Flash Sector H +#define DCSM_SECTSTAT_STATUS_SECTI_S 16U +#define DCSM_SECTSTAT_STATUS_SECTI_M 0x30000U // Zone Status Flash Sector I +#define DCSM_SECTSTAT_STATUS_SECTJ_S 18U +#define DCSM_SECTSTAT_STATUS_SECTJ_M 0xC0000U // Zone Status Flash Sector J +#define DCSM_SECTSTAT_STATUS_SECTK_S 20U +#define DCSM_SECTSTAT_STATUS_SECTK_M 0x300000U // Zone Status Flash Sector K +#define DCSM_SECTSTAT_STATUS_SECTL_S 22U +#define DCSM_SECTSTAT_STATUS_SECTL_M 0xC00000U // Zone Status Flash Sector L +#define DCSM_SECTSTAT_STATUS_SECTM_S 24U +#define DCSM_SECTSTAT_STATUS_SECTM_M 0x3000000U // Zone Status Flash Sector M +#define DCSM_SECTSTAT_STATUS_SECTN_S 26U +#define DCSM_SECTSTAT_STATUS_SECTN_M 0xC000000U // Zone Status Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMSTAT register +// +//************************************************************************************************* +#define DCSM_RAMSTAT_STATUS_RAM0_S 0U +#define DCSM_RAMSTAT_STATUS_RAM0_M 0x3U // Zone Status RAM LS0 +#define DCSM_RAMSTAT_STATUS_RAM1_S 2U +#define DCSM_RAMSTAT_STATUS_RAM1_M 0xCU // Zone Status RAM LS1 +#define DCSM_RAMSTAT_STATUS_RAM2_S 4U +#define DCSM_RAMSTAT_STATUS_RAM2_M 0x30U // Zone Status RAM LS2 +#define DCSM_RAMSTAT_STATUS_RAM3_S 6U +#define DCSM_RAMSTAT_STATUS_RAM3_M 0xC0U // Zone Status RAM LS3 +#define DCSM_RAMSTAT_STATUS_RAM4_S 8U +#define DCSM_RAMSTAT_STATUS_RAM4_M 0x300U // Zone Status RAM LS4 +#define DCSM_RAMSTAT_STATUS_RAM5_S 10U +#define DCSM_RAMSTAT_STATUS_RAM5_M 0xC00U // Zone Status RAM LS5 +#define DCSM_RAMSTAT_STATUS_RAM6_S 12U +#define DCSM_RAMSTAT_STATUS_RAM6_M 0x3000U // Zone Status RAM D0 +#define DCSM_RAMSTAT_STATUS_RAM7_S 14U +#define DCSM_RAMSTAT_STATUS_RAM7_M 0xC000U // Zone Status RAM D1 +#define DCSM_RAMSTAT_STATUS_CLA1_S 28U +#define DCSM_RAMSTAT_STATUS_CLA1_M 0x30000000U // Zone Status CLA1 + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_dma.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dma.h new file mode 100644 index 0000000..1ecd1d7 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_dma.h @@ -0,0 +1,165 @@ +//########################################################################### +// +// FILE: hw_dma.h +// +// TITLE: Definitions for the DMA registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DMA_H +#define HW_DMA_H + +//************************************************************************************************* +// +// The following are defines for the DMA register offsets +// +//************************************************************************************************* +#define DMA_O_CTRL 0x0U // DMA Control Register +#define DMA_O_DEBUGCTRL 0x1U // Debug Control Register +#define DMA_O_PRIORITYCTRL1 0x4U // Priority Control 1 Register +#define DMA_O_PRIORITYSTAT 0x6U // Priority Status Register + +#define DMA_O_MODE 0x0U // Mode Register +#define DMA_O_CONTROL 0x1U // Control Register +#define DMA_O_BURST_SIZE 0x2U // Burst Size Register +#define DMA_O_BURST_COUNT 0x3U // Burst Count Register +#define DMA_O_SRC_BURST_STEP 0x4U // Source Burst Step Register +#define DMA_O_DST_BURST_STEP 0x5U // Destination Burst Step Register +#define DMA_O_TRANSFER_SIZE 0x6U // Transfer Size Register +#define DMA_O_TRANSFER_COUNT 0x7U // Transfer Count Register +#define DMA_O_SRC_TRANSFER_STEP 0x8U // Source Transfer Step Register +#define DMA_O_DST_TRANSFER_STEP 0x9U // Destination Transfer Step Register +#define DMA_O_SRC_WRAP_SIZE 0xAU // Source Wrap Size Register +#define DMA_O_SRC_WRAP_COUNT 0xBU // Source Wrap Count Register +#define DMA_O_SRC_WRAP_STEP 0xCU // Source Wrap Step Register +#define DMA_O_DST_WRAP_SIZE 0xDU // Destination Wrap Size Register +#define DMA_O_DST_WRAP_COUNT 0xEU // Destination Wrap Count Register +#define DMA_O_DST_WRAP_STEP 0xFU // Destination Wrap Step Register +#define DMA_O_SRC_BEG_ADDR_SHADOW 0x10U // Source Begin Address Shadow Register +#define DMA_O_SRC_ADDR_SHADOW 0x12U // Source Address Shadow Register +#define DMA_O_SRC_BEG_ADDR_ACTIVE 0x14U // Source Begin Address Active Register +#define DMA_O_SRC_ADDR_ACTIVE 0x16U // Source Address Active Register +#define DMA_O_DST_BEG_ADDR_SHADOW 0x18U // Destination Begin Address Shadow Register +#define DMA_O_DST_ADDR_SHADOW 0x1AU // Destination Address Shadow Register +#define DMA_O_DST_BEG_ADDR_ACTIVE 0x1CU // Destination Begin Address Active Register +#define DMA_O_DST_ADDR_ACTIVE 0x1EU // Destination Address Active Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACTRL register +// +//************************************************************************************************* +#define DMA_CTRL_HARDRESET 0x1U // Hard Reset Bit +#define DMA_CTRL_PRIORITYRESET 0x2U // Priority Reset Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DEBUGCTRL register +// +//************************************************************************************************* +#define DMA_DEBUGCTRL_FREE 0x8000U // Debug Mode Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRIORITYCTRL1 register +// +//************************************************************************************************* +#define DMA_PRIORITYCTRL1_CH1PRIORITY 0x1U // Ch1 Priority Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRIORITYSTAT register +// +//************************************************************************************************* +#define DMA_PRIORITYSTAT_ACTIVESTS_S 0U +#define DMA_PRIORITYSTAT_ACTIVESTS_M 0x7U // Active Channel Status Bits +#define DMA_PRIORITYSTAT_ACTIVESTS_SHADOW_S 4U +#define DMA_PRIORITYSTAT_ACTIVESTS_SHADOW_M 0x70U // Active Channel Status Shadow Bits + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MODE register +// +//************************************************************************************************* +#define DMA_MODE_PERINTSEL_S 0U +#define DMA_MODE_PERINTSEL_M 0x1FU // Peripheral Interrupt and Sync Select +#define DMA_MODE_OVRINTE 0x80U // Overflow Interrupt Enable +#define DMA_MODE_PERINTE 0x100U // Peripheral Interrupt Enable +#define DMA_MODE_CHINTMODE 0x200U // Channel Interrupt Mode +#define DMA_MODE_ONESHOT 0x400U // One Shot Mode Bit +#define DMA_MODE_CONTINUOUS 0x800U // Continuous Mode Bit +#define DMA_MODE_DATASIZE 0x4000U // Data Size Mode Bit +#define DMA_MODE_CHINTE 0x8000U // Channel Interrupt Enable Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CONTROL register +// +//************************************************************************************************* +#define DMA_CONTROL_RUN 0x1U // Run Bit +#define DMA_CONTROL_HALT 0x2U // Halt Bit +#define DMA_CONTROL_SOFTRESET 0x4U // Soft Reset Bit +#define DMA_CONTROL_PERINTFRC 0x8U // Interrupt Force Bit +#define DMA_CONTROL_PERINTCLR 0x10U // Interrupt Clear Bit +#define DMA_CONTROL_ERRCLR 0x80U // Error Clear Bit +#define DMA_CONTROL_PERINTFLG 0x100U // Interrupt Flag Bit +#define DMA_CONTROL_TRANSFERSTS 0x800U // Transfer Status Bit +#define DMA_CONTROL_BURSTSTS 0x1000U // Burst Status Bit +#define DMA_CONTROL_RUNSTS 0x2000U // Run Status Bit +#define DMA_CONTROL_OVRFLG 0x4000U // Overflow Flag Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the BURST_SIZE register +// +//************************************************************************************************* +#define DMA_BURST_SIZE_BURSTSIZE_S 0U +#define DMA_BURST_SIZE_BURSTSIZE_M 0x1FU // Burst Transfer Size + +//************************************************************************************************* +// +// The following are defines for the bit fields in the BURST_COUNT register +// +//************************************************************************************************* +#define DMA_BURST_COUNT_BURSTCOUNT_S 0U +#define DMA_BURST_COUNT_BURSTCOUNT_M 0x1FU // Burst Transfer Size + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_ecap.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ecap.h new file mode 100644 index 0000000..48981d6 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ecap.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_ecap.h +// +// TITLE: Definitions for the ECAP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ECAP_H +#define HW_ECAP_H + +//************************************************************************************************* +// +// The following are defines for the ECAP register offsets +// +//************************************************************************************************* +#define ECAP_O_TSCTR 0x0U // Time-Stamp Counter +#define ECAP_O_CTRPHS 0x2U // Counter Phase Offset Value Register +#define ECAP_O_CAP1 0x4U // Capture 1 Register +#define ECAP_O_CAP2 0x6U // Capture 2 Register +#define ECAP_O_CAP3 0x8U // Capture 3 Register +#define ECAP_O_CAP4 0xAU // Capture 4 Register +#define ECAP_O_ECCTL1 0x14U // Capture Control Register 1 +#define ECAP_O_ECCTL2 0x15U // Capture Control Register 2 +#define ECAP_O_ECEINT 0x16U // Capture Interrupt Enable Register +#define ECAP_O_ECFLG 0x17U // Capture Interrupt Flag Register +#define ECAP_O_ECCLR 0x18U // Capture Interrupt Clear Register +#define ECAP_O_ECFRC 0x19U // Capture Interrupt Force Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCTL1 register +// +//************************************************************************************************* +#define ECAP_ECCTL1_CAP1POL 0x1U // Capture Event 1 Polarity select +#define ECAP_ECCTL1_CTRRST1 0x2U // Counter Reset on Capture Event 1 +#define ECAP_ECCTL1_CAP2POL 0x4U // Capture Event 2 Polarity select +#define ECAP_ECCTL1_CTRRST2 0x8U // Counter Reset on Capture Event 2 +#define ECAP_ECCTL1_CAP3POL 0x10U // Capture Event 3 Polarity select +#define ECAP_ECCTL1_CTRRST3 0x20U // Counter Reset on Capture Event 3 +#define ECAP_ECCTL1_CAP4POL 0x40U // Capture Event 4 Polarity select +#define ECAP_ECCTL1_CTRRST4 0x80U // Counter Reset on Capture Event 4 +#define ECAP_ECCTL1_CAPLDEN 0x100U // Enable Loading CAP1-4 regs on a Cap Event +#define ECAP_ECCTL1_PRESCALE_S 9U +#define ECAP_ECCTL1_PRESCALE_M 0x3E00U // Event Filter prescale select +#define ECAP_ECCTL1_FREE_SOFT_S 14U +#define ECAP_ECCTL1_FREE_SOFT_M 0xC000U // Emulation mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCTL2 register +// +//************************************************************************************************* +#define ECAP_ECCTL2_CONT_ONESHT 0x1U // Continuous or one-shot +#define ECAP_ECCTL2_STOP_WRAP_S 1U +#define ECAP_ECCTL2_STOP_WRAP_M 0x6U // Stop value for one-shot, Wrap for continuous +#define ECAP_ECCTL2_REARM 0x8U // One-shot re-arm +#define ECAP_ECCTL2_TSCTRSTOP 0x10U // TSCNT counter stop +#define ECAP_ECCTL2_SYNCI_EN 0x20U // Counter sync-in select +#define ECAP_ECCTL2_SYNCO_SEL_S 6U +#define ECAP_ECCTL2_SYNCO_SEL_M 0xC0U // Sync-out mode +#define ECAP_ECCTL2_SWSYNC 0x100U // SW forced counter sync +#define ECAP_ECCTL2_CAP_APWM 0x200U // CAP/APWM operating mode select +#define ECAP_ECCTL2_APWMPOL 0x400U // APWM output polarity select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECEINT register +// +//************************************************************************************************* +#define ECAP_ECEINT_CEVT1 0x2U // Capture Event 1 Interrupt Enable +#define ECAP_ECEINT_CEVT2 0x4U // Capture Event 2 Interrupt Enable +#define ECAP_ECEINT_CEVT3 0x8U // Capture Event 3 Interrupt Enable +#define ECAP_ECEINT_CEVT4 0x10U // Capture Event 4 Interrupt Enable +#define ECAP_ECEINT_CTROVF 0x20U // Counter Overflow Interrupt Enable +#define ECAP_ECEINT_CTR_EQ_PRD 0x40U // Period Equal Interrupt Enable +#define ECAP_ECEINT_CTR_EQ_CMP 0x80U // Compare Equal Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECFLG register +// +//************************************************************************************************* +#define ECAP_ECFLG_INT 0x1U // Global Flag +#define ECAP_ECFLG_CEVT1 0x2U // Capture Event 1 Interrupt Flag +#define ECAP_ECFLG_CEVT2 0x4U // Capture Event 2 Interrupt Flag +#define ECAP_ECFLG_CEVT3 0x8U // Capture Event 3 Interrupt Flag +#define ECAP_ECFLG_CEVT4 0x10U // Capture Event 4 Interrupt Flag +#define ECAP_ECFLG_CTROVF 0x20U // Counter Overflow Interrupt Flag +#define ECAP_ECFLG_CTR_PRD 0x40U // Period Equal Interrupt Flag +#define ECAP_ECFLG_CTR_CMP 0x80U // Compare Equal Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCLR register +// +//************************************************************************************************* +#define ECAP_ECCLR_INT 0x1U // ECAP Global Interrupt Status Clear +#define ECAP_ECCLR_CEVT1 0x2U // Capture Event 1 Status Clear +#define ECAP_ECCLR_CEVT2 0x4U // Capture Event 2 Status Clear +#define ECAP_ECCLR_CEVT3 0x8U // Capture Event 3 Status Clear +#define ECAP_ECCLR_CEVT4 0x10U // Capture Event 4 Status Clear +#define ECAP_ECCLR_CTROVF 0x20U // Counter Overflow Status Clear +#define ECAP_ECCLR_CTR_PRD 0x40U // Period Equal Status Clear +#define ECAP_ECCLR_CTR_CMP 0x80U // Compare Equal Status Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECFRC register +// +//************************************************************************************************* +#define ECAP_ECFRC_CEVT1 0x2U // Capture Event 1 Force Interrupt +#define ECAP_ECFRC_CEVT2 0x4U // Capture Event 2 Force Interrupt +#define ECAP_ECFRC_CEVT3 0x8U // Capture Event 3 Force Interrupt +#define ECAP_ECFRC_CEVT4 0x10U // Capture Event 4 Force Interrupt +#define ECAP_ECFRC_CTROVF 0x20U // Counter Overflow Force Interrupt +#define ECAP_ECFRC_CTR_PRD 0x40U // Period Equal Force Interrupt +#define ECAP_ECFRC_CTR_CMP 0x80U // Compare Equal Force Interrupt + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_emif.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_emif.h new file mode 100644 index 0000000..9f1401e --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_emif.h @@ -0,0 +1,259 @@ +//########################################################################### +// +// FILE: hw_emif.h +// +// TITLE: Definitions for the EMIF registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EMIF_H +#define HW_EMIF_H + +//************************************************************************************************* +// +// The following are defines for the EMIF register offsets +// +//************************************************************************************************* +#define EMIF_O_RCSR 0x0U // Revision Code and Status Register +#define EMIF_O_ASYNC_WCCR 0x2U // Async Wait Cycle Config Register +#define EMIF_O_SDRAM_CR 0x4U // SDRAM (EMxCS0n) Config Register +#define EMIF_O_SDRAM_RCR 0x6U // SDRAM Refresh Control Register +#define EMIF_O_ASYNC_CS2_CR 0x8U // Async 1 (EMxCS2n) Config Register +#define EMIF_O_ASYNC_CS3_CR 0xAU // Async 2 (EMxCS3n) Config Register +#define EMIF_O_ASYNC_CS4_CR 0xCU // Async 3 (EMxCS4n) Config Register +#define EMIF_O_SDRAM_TR 0x10U // SDRAM Timing Register +#define EMIF_O_TOTAL_SDRAM_AR 0x18U // Total SDRAM Accesses Register +#define EMIF_O_TOTAL_SDRAM_ACTR 0x1AU // Total SDRAM Activate Register +#define EMIF_O_SDR_EXT_TMNG 0x1EU // SDRAM SR/PD Exit Timing Register +#define EMIF_O_INT_RAW 0x20U // Interrupt Raw Register +#define EMIF_O_INT_MSK 0x22U // Interrupt Masked Register +#define EMIF_O_INT_MSK_SET 0x24U // Interrupt Mask Set Register +#define EMIF_O_INT_MSK_CLR 0x26U // Interrupt Mask Clear Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCSR register +// +//************************************************************************************************* +#define EMIF_RCSR_MINOR_REVISION_S 0U +#define EMIF_RCSR_MINOR_REVISION_M 0xFFU // Minor Revision. +#define EMIF_RCSR_MAJOR_REVISION_S 8U +#define EMIF_RCSR_MAJOR_REVISION_M 0xFF00U // Major Revision. +#define EMIF_RCSR_MODULE_ID_S 16U +#define EMIF_RCSR_MODULE_ID_M 0x3FFF0000U // EMIF module ID. +#define EMIF_RCSR_FR 0x40000000U // EMIF is running in full rate or half rate. +#define EMIF_RCSR_BE 0x80000000U // EMIF endian mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_WCCR register +// +//************************************************************************************************* +#define EMIF_ASYNC_WCCR_MAX_EXT_WAIT_S 0U +#define EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M 0xFFU // Maximum Extended Wait cycles. +#define EMIF_ASYNC_WCCR_WP0 0x10000000U // Polarity for EMxWAIT. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_CR register +// +//************************************************************************************************* +#define EMIF_SDRAM_CR_PAGESIGE_S 0U +#define EMIF_SDRAM_CR_PAGESIGE_M 0x7U // Page Size. +#define EMIF_SDRAM_CR_IBANK_S 4U +#define EMIF_SDRAM_CR_IBANK_M 0x70U // Internal Bank setup of SDRAM devices. +#define EMIF_SDRAM_CR_BIT_11_9_LOCK 0x100U // Bits 11 to 9 are writable only if this bit + // is set. +#define EMIF_SDRAM_CR_CL_S 9U +#define EMIF_SDRAM_CR_CL_M 0xE00U // CAS Latency. +#define EMIF_SDRAM_CR_NM 0x4000U // Narrow Mode. +#define EMIF_SDRAM_CR_PDWR 0x20000000U // Perform refreshes during Power Down. +#define EMIF_SDRAM_CR_PD 0x40000000U // Power Down. +#define EMIF_SDRAM_CR_SR 0x80000000U // Self Refresh. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_RCR register +// +//************************************************************************************************* +#define EMIF_SDRAM_RCR_REFRESH_RATE_S 0U +#define EMIF_SDRAM_RCR_REFRESH_RATE_M 0x1FFFU // Refresh Rate. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS2_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS2_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS2_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS2_CR_TA_S 2U +#define EMIF_ASYNC_CS2_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS2_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS2_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS2_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS2_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS2_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS2_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS2_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS2_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS2_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS2_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS2_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS2_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS2_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS2_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS3_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS3_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS3_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS3_CR_TA_S 2U +#define EMIF_ASYNC_CS3_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS3_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS3_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS3_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS3_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS3_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS3_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS3_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS3_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS3_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS3_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS3_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS3_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS3_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS3_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS4_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS4_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS4_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS4_CR_TA_S 2U +#define EMIF_ASYNC_CS4_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS4_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS4_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS4_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS4_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS4_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS4_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS4_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS4_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS4_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS4_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS4_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS4_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS4_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS4_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_TR register +// +//************************************************************************************************* +#define EMIF_SDRAM_TR_T_RRD_S 4U +#define EMIF_SDRAM_TR_T_RRD_M 0x70U // Activate to Activate timing for different bank. +#define EMIF_SDRAM_TR_T_RC_S 8U +#define EMIF_SDRAM_TR_T_RC_M 0xF00U // Activate to Activate timing . +#define EMIF_SDRAM_TR_T_RAS_S 12U +#define EMIF_SDRAM_TR_T_RAS_M 0xF000U // Activate to Precharge timing. +#define EMIF_SDRAM_TR_T_WR_S 16U +#define EMIF_SDRAM_TR_T_WR_M 0x70000U // Last Write to Precharge timing. +#define EMIF_SDRAM_TR_T_RCD_S 20U +#define EMIF_SDRAM_TR_T_RCD_M 0x700000U // Activate to Read/Write timing. +#define EMIF_SDRAM_TR_T_RP_S 24U +#define EMIF_SDRAM_TR_T_RP_M 0x7000000U // Precharge to Activate/Refresh timing. +#define EMIF_SDRAM_TR_T_RFC_S 27U +#define EMIF_SDRAM_TR_T_RFC_M 0xF8000000U // Refresh/Load Mode to Refresh/Activate timing + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDR_EXT_TMNG register +// +//************************************************************************************************* +#define EMIF_SDR_EXT_TMNG_T_XS_S 0U +#define EMIF_SDR_EXT_TMNG_T_XS_M 0x1FU // Self Refresh exit to new command timing. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_RAW register +// +//************************************************************************************************* +#define EMIF_INT_RAW_AT 0x1U // Asynchronous Timeout. +#define EMIF_INT_RAW_LT 0x2U // Line Trap. +#define EMIF_INT_RAW_WR_S 2U +#define EMIF_INT_RAW_WR_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK register +// +//************************************************************************************************* +#define EMIF_INT_MSK_AT_MASKED 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_LT_MASKED 0x2U // Line Trap. +#define EMIF_INT_MSK_WR_MASKED_S 2U +#define EMIF_INT_MSK_WR_MASKED_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK_SET register +// +//************************************************************************************************* +#define EMIF_INT_MSK_SET_AT_MASK_SET 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_SET_LT_MASK_SET 0x2U // Line Trap. +#define EMIF_INT_MSK_SET_WR_MASK_SET_S 2U +#define EMIF_INT_MSK_SET_WR_MASK_SET_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK_CLR register +// +//************************************************************************************************* +#define EMIF_INT_MSK_CLR_AT_MASK_CLR 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_CLR_LT_MASK_CLR 0x2U // Line Trap. +#define EMIF_INT_MSK_CLR_WR_MASK_CLR_S 2U +#define EMIF_INT_MSK_CLR_WR_MASK_CLR_M 0x3CU // Wait Rise. + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwm.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwm.h new file mode 100644 index 0000000..6f7bf2d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwm.h @@ -0,0 +1,1050 @@ +//########################################################################### +// +// FILE: hw_epwm.h +// +// TITLE: Definitions for the EPWM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EPWM_H +#define HW_EPWM_H + +//************************************************************************************************* +// +// The following are defines for the EPWM register offsets +// +//************************************************************************************************* +#define EPWM_O_TBCTL 0x0U // Time Base Control Register +#define EPWM_O_TBCTL2 0x1U // Time Base Control Register 2 +#define EPWM_O_TBCTR 0x4U // Time Base Counter Register +#define EPWM_O_TBSTS 0x5U // Time Base Status Register +#define EPWM_O_CMPCTL 0x8U // Counter Compare Control Register +#define EPWM_O_CMPCTL2 0x9U // Counter Compare Control Register 2 +#define EPWM_O_DBCTL 0xCU // Dead-Band Generator Control Register +#define EPWM_O_DBCTL2 0xDU // Dead-Band Generator Control Register 2 +#define EPWM_O_AQCTL 0x10U // Action Qualifier Control Register +#define EPWM_O_AQTSRCSEL 0x11U // Action Qualifier Trigger Event Source Select Register +#define EPWM_O_PCCTL 0x14U // PWM Chopper Control Register +#define EPWM_O_VCAPCTL 0x18U // Valley Capture Control Register +#define EPWM_O_VCNTCFG 0x19U // Valley Counter Config Register +#define EPWM_O_HRCNFG 0x20U // HRPWM Configuration Register +#define EPWM_O_HRPWR 0x21U // HRPWM Power Register +#define EPWM_O_HRMSTEP 0x26U // HRPWM MEP Step Register +#define EPWM_O_HRCNFG2 0x27U // HRPWM Configuration 2 Register +#define EPWM_O_HRPCTL 0x2DU // High Resolution Period Control Register +#define EPWM_O_TRREM 0x2EU // HRPWM High Resolution Remainder Register +#define EPWM_O_GLDCTL 0x34U // Global PWM Load Control Register +#define EPWM_O_GLDCFG 0x35U // Global PWM Load Config Register +#define EPWM_O_XLINK 0x38U // EPWMx Link Register +#define EPWM_O_AQCTLA 0x40U // Action Qualifier Control Register For Output A +#define EPWM_O_AQCTLA2 0x41U // Additional Action Qualifier Control Register For Output A +#define EPWM_O_AQCTLB 0x42U // Action Qualifier Control Register For Output B +#define EPWM_O_AQCTLB2 0x43U // Additional Action Qualifier Control Register For Output B +#define EPWM_O_AQSFRC 0x47U // Action Qualifier Software Force Register +#define EPWM_O_AQCSFRC 0x49U // Action Qualifier Continuous S/W Force Register +#define EPWM_O_DBREDHR 0x50U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define EPWM_O_DBRED 0x51U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define EPWM_O_DBFEDHR 0x52U // Dead-Band Generator Falling Edge Delay High Resolution + // Register +#define EPWM_O_DBFED 0x53U // Dead-Band Generator Falling Edge Delay Count Register +#define EPWM_O_TBPHS 0x60U // Time Base Phase High +#define EPWM_O_TBPRDHR 0x62U // Time Base Period High Resolution Register +#define EPWM_O_TBPRD 0x63U // Time Base Period Register +#define EPWM_O_CMPA 0x6AU // Counter Compare A Register +#define EPWM_O_CMPB 0x6CU // Compare B Register +#define EPWM_O_CMPC 0x6FU // Counter Compare C Register +#define EPWM_O_CMPD 0x71U // Counter Compare D Register +#define EPWM_O_GLDCTL2 0x74U // Global PWM Load Control Register 2 +#define EPWM_O_SWVDELVAL 0x77U // Software Valley Mode Delay Register +#define EPWM_O_TZSEL 0x80U // Trip Zone Select Register +#define EPWM_O_TZDCSEL 0x82U // Trip Zone Digital Comparator Select Register +#define EPWM_O_TZCTL 0x84U // Trip Zone Control Register +#define EPWM_O_TZCTL2 0x85U // Additional Trip Zone Control Register +#define EPWM_O_TZCTLDCA 0x86U // Trip Zone Control Register Digital Compare A +#define EPWM_O_TZCTLDCB 0x87U // Trip Zone Control Register Digital Compare B +#define EPWM_O_TZEINT 0x8DU // Trip Zone Enable Interrupt Register +#define EPWM_O_TZFLG 0x93U // Trip Zone Flag Register +#define EPWM_O_TZCBCFLG 0x94U // Trip Zone CBC Flag Register +#define EPWM_O_TZOSTFLG 0x95U // Trip Zone OST Flag Register +#define EPWM_O_TZCLR 0x97U // Trip Zone Clear Register +#define EPWM_O_TZCBCCLR 0x98U // Trip Zone CBC Clear Register +#define EPWM_O_TZOSTCLR 0x99U // Trip Zone OST Clear Register +#define EPWM_O_TZFRC 0x9BU // Trip Zone Force Register +#define EPWM_O_ETSEL 0xA4U // Event Trigger Selection Register +#define EPWM_O_ETPS 0xA6U // Event Trigger Pre-Scale Register +#define EPWM_O_ETFLG 0xA8U // Event Trigger Flag Register +#define EPWM_O_ETCLR 0xAAU // Event Trigger Clear Register +#define EPWM_O_ETFRC 0xACU // Event Trigger Force Register +#define EPWM_O_ETINTPS 0xAEU // Event-Trigger Interrupt Pre-Scale Register +#define EPWM_O_ETSOCPS 0xB0U // Event-Trigger SOC Pre-Scale Register +#define EPWM_O_ETCNTINITCTL 0xB2U // Event-Trigger Counter Initialization Control Register +#define EPWM_O_ETCNTINIT 0xB4U // Event-Trigger Counter Initialization Register +#define EPWM_O_DCTRIPSEL 0xC0U // Digital Compare Trip Select Register +#define EPWM_O_DCACTL 0xC3U // Digital Compare A Control Register +#define EPWM_O_DCBCTL 0xC4U // Digital Compare B Control Register +#define EPWM_O_DCFCTL 0xC7U // Digital Compare Filter Control Register +#define EPWM_O_DCCAPCTL 0xC8U // Digital Compare Capture Control Register +#define EPWM_O_DCFOFFSET 0xC9U // Digital Compare Filter Offset Register +#define EPWM_O_DCFOFFSETCNT 0xCAU // Digital Compare Filter Offset Counter Register +#define EPWM_O_DCFWINDOW 0xCBU // Digital Compare Filter Window Register +#define EPWM_O_DCFWINDOWCNT 0xCCU // Digital Compare Filter Window Counter Register +#define EPWM_O_DCCAP 0xCFU // Digital Compare Counter Capture Register +#define EPWM_O_DCAHTRIPSEL 0xD2U // Digital Compare AH Trip Select +#define EPWM_O_DCALTRIPSEL 0xD3U // Digital Compare AL Trip Select +#define EPWM_O_DCBHTRIPSEL 0xD4U // Digital Compare BH Trip Select +#define EPWM_O_DCBLTRIPSEL 0xD5U // Digital Compare BL Trip Select +#define EPWM_O_HWVDELVAL 0xFDU // Hardware Valley Mode Delay Register +#define EPWM_O_VCNTVAL 0xFEU // Hardware Valley Counter Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL register +// +//************************************************************************************************* +#define EPWM_TBCTL_CTRMODE_S 0U +#define EPWM_TBCTL_CTRMODE_M 0x3U // Counter Mode +#define EPWM_TBCTL_PHSEN 0x4U // Phase Load Enable +#define EPWM_TBCTL_PRDLD 0x8U // Active Period Load +#define EPWM_TBCTL_SYNCOSEL_S 4U +#define EPWM_TBCTL_SYNCOSEL_M 0x30U // Sync Output Select +#define EPWM_TBCTL_SWFSYNC 0x40U // Software Force Sync Pulse +#define EPWM_TBCTL_HSPCLKDIV_S 7U +#define EPWM_TBCTL_HSPCLKDIV_M 0x380U // High Speed TBCLK Pre-scaler +#define EPWM_TBCTL_CLKDIV_S 10U +#define EPWM_TBCTL_CLKDIV_M 0x1C00U // Time Base Clock Pre-scaler +#define EPWM_TBCTL_PHSDIR 0x2000U // Phase Direction Bit +#define EPWM_TBCTL_FREE_SOFT_S 14U +#define EPWM_TBCTL_FREE_SOFT_M 0xC000U // Emulation Mode Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL2 register +// +//************************************************************************************************* +#define EPWM_TBCTL2_OSHTSYNCMODE 0x40U // One shot sync mode +#define EPWM_TBCTL2_OSHTSYNC 0x80U // One shot sync +#define EPWM_TBCTL2_SYNCOSELX_S 12U +#define EPWM_TBCTL2_SYNCOSELX_M 0x3000U // Syncout selection +#define EPWM_TBCTL2_PRDLDSYNC_S 14U +#define EPWM_TBCTL2_PRDLDSYNC_M 0xC000U // PRD Shadow to Active Load on SYNC Event + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBSTS register +// +//************************************************************************************************* +#define EPWM_TBSTS_CTRDIR 0x1U // Counter Direction Status +#define EPWM_TBSTS_SYNCI 0x2U // External Input Sync Status +#define EPWM_TBSTS_CTRMAX 0x4U // Counter Max Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL register +// +//************************************************************************************************* +#define EPWM_CMPCTL_LOADAMODE_S 0U +#define EPWM_CMPCTL_LOADAMODE_M 0x3U // Active Compare A Load +#define EPWM_CMPCTL_LOADBMODE_S 2U +#define EPWM_CMPCTL_LOADBMODE_M 0xCU // Active Compare B Load +#define EPWM_CMPCTL_SHDWAMODE 0x10U // Compare A Register Block Operating Mode +#define EPWM_CMPCTL_SHDWBMODE 0x40U // Compare B Register Block Operating Mode +#define EPWM_CMPCTL_SHDWAFULL 0x100U // Compare A Shadow Register Full Status +#define EPWM_CMPCTL_SHDWBFULL 0x200U // Compare B Shadow Register Full Status +#define EPWM_CMPCTL_LOADASYNC_S 10U +#define EPWM_CMPCTL_LOADASYNC_M 0xC00U // Active Compare A Load on SYNC +#define EPWM_CMPCTL_LOADBSYNC_S 12U +#define EPWM_CMPCTL_LOADBSYNC_M 0x3000U // Active Compare B Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL2 register +// +//************************************************************************************************* +#define EPWM_CMPCTL2_LOADCMODE_S 0U +#define EPWM_CMPCTL2_LOADCMODE_M 0x3U // Active Compare C Load +#define EPWM_CMPCTL2_LOADDMODE_S 2U +#define EPWM_CMPCTL2_LOADDMODE_M 0xCU // Active Compare D load +#define EPWM_CMPCTL2_SHDWCMODE 0x10U // Compare C Block Operating Mode +#define EPWM_CMPCTL2_SHDWDMODE 0x40U // Compare D Block Operating Mode +#define EPWM_CMPCTL2_LOADCSYNC_S 10U +#define EPWM_CMPCTL2_LOADCSYNC_M 0xC00U // Active Compare C Load on SYNC +#define EPWM_CMPCTL2_LOADDSYNC_S 12U +#define EPWM_CMPCTL2_LOADDSYNC_M 0x3000U // Active Compare D Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL register +// +//************************************************************************************************* +#define EPWM_DBCTL_OUT_MODE_S 0U +#define EPWM_DBCTL_OUT_MODE_M 0x3U // Dead Band Output Mode Control +#define EPWM_DBCTL_POLSEL_S 2U +#define EPWM_DBCTL_POLSEL_M 0xCU // Polarity Select Control +#define EPWM_DBCTL_IN_MODE_S 4U +#define EPWM_DBCTL_IN_MODE_M 0x30U // Dead Band Input Select Mode Control +#define EPWM_DBCTL_LOADREDMODE_S 6U +#define EPWM_DBCTL_LOADREDMODE_M 0xC0U // Active DBRED Load Mode +#define EPWM_DBCTL_LOADFEDMODE_S 8U +#define EPWM_DBCTL_LOADFEDMODE_M 0x300U // Active DBFED Load Mode +#define EPWM_DBCTL_SHDWDBREDMODE 0x400U // DBRED Block Operating Mode +#define EPWM_DBCTL_SHDWDBFEDMODE 0x800U // DBFED Block Operating Mode +#define EPWM_DBCTL_OUTSWAP_S 12U +#define EPWM_DBCTL_OUTSWAP_M 0x3000U // Dead Band Output Swap Control +#define EPWM_DBCTL_DEDB_MODE 0x4000U // Dead Band Dual-Edge B Mode Control +#define EPWM_DBCTL_HALFCYCLE 0x8000U // Half Cycle Clocking Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL2 register +// +//************************************************************************************************* +#define EPWM_DBCTL2_LOADDBCTLMODE_S 0U +#define EPWM_DBCTL2_LOADDBCTLMODE_M 0x3U // DBCTL Load from Shadow Mode Select +#define EPWM_DBCTL2_SHDWDBCTLMODE 0x4U // DBCTL Load mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTL register +// +//************************************************************************************************* +#define EPWM_AQCTL_LDAQAMODE_S 0U +#define EPWM_AQCTL_LDAQAMODE_M 0x3U // Action Qualifier A Load Select +#define EPWM_AQCTL_LDAQBMODE_S 2U +#define EPWM_AQCTL_LDAQBMODE_M 0xCU // Action Qualifier B Load Select +#define EPWM_AQCTL_SHDWAQAMODE 0x10U // Action Qualifer A Operating Mode +#define EPWM_AQCTL_SHDWAQBMODE 0x40U // Action Qualifier B Operating Mode +#define EPWM_AQCTL_LDAQASYNC_S 8U +#define EPWM_AQCTL_LDAQASYNC_M 0x300U // AQCTLA Register Load on SYNC +#define EPWM_AQCTL_LDAQBSYNC_S 10U +#define EPWM_AQCTL_LDAQBSYNC_M 0xC00U // AQCTLB Register Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQTSRCSEL register +// +//************************************************************************************************* +#define EPWM_AQTSRCSEL_T1SEL_S 0U +#define EPWM_AQTSRCSEL_T1SEL_M 0xFU // T1 Event Source Select Bits +#define EPWM_AQTSRCSEL_T2SEL_S 4U +#define EPWM_AQTSRCSEL_T2SEL_M 0xF0U // T2 Event Source Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCCTL register +// +//************************************************************************************************* +#define EPWM_PCCTL_CHPEN 0x1U // PWM chopping enable +#define EPWM_PCCTL_OSHTWTH_S 1U +#define EPWM_PCCTL_OSHTWTH_M 0x1EU // One-shot pulse width +#define EPWM_PCCTL_CHPFREQ_S 5U +#define EPWM_PCCTL_CHPFREQ_M 0xE0U // Chopping clock frequency +#define EPWM_PCCTL_CHPDUTY_S 8U +#define EPWM_PCCTL_CHPDUTY_M 0x700U // Chopping clock Duty cycle + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCAPCTL register +// +//************************************************************************************************* +#define EPWM_VCAPCTL_VCAPE 0x1U // Valley Capture mode +#define EPWM_VCAPCTL_VCAPSTART 0x2U // Valley Capture Start +#define EPWM_VCAPCTL_TRIGSEL_S 2U +#define EPWM_VCAPCTL_TRIGSEL_M 0x1CU // Capture Trigger Select +#define EPWM_VCAPCTL_VDELAYDIV_S 7U +#define EPWM_VCAPCTL_VDELAYDIV_M 0x380U // Valley Delay Mode Divide Enable +#define EPWM_VCAPCTL_EDGEFILTDLYSEL 0x400U // Valley Switching Mode Delay Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCNTCFG register +// +//************************************************************************************************* +#define EPWM_VCNTCFG_STARTEDGE_S 0U +#define EPWM_VCNTCFG_STARTEDGE_M 0xFU // Counter Start Edge Selection +#define EPWM_VCNTCFG_STARTEDGESTS 0x80U // Start Edge Status Bit +#define EPWM_VCNTCFG_STOPEDGE_S 8U +#define EPWM_VCNTCFG_STOPEDGE_M 0xF00U // Counter Start Edge Selection +#define EPWM_VCNTCFG_STOPEDGESTS 0x8000U // Stop Edge Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG register +// +//************************************************************************************************* +#define EPWM_HRCNFG_EDGMODE_S 0U +#define EPWM_HRCNFG_EDGMODE_M 0x3U // ePWMxA Edge Mode Select Bits +#define EPWM_HRCNFG_CTLMODE 0x4U // ePWMxA Control Mode Select Bits +#define EPWM_HRCNFG_HRLOAD_S 3U +#define EPWM_HRCNFG_HRLOAD_M 0x18U // ePWMxA Shadow Mode Select Bits +#define EPWM_HRCNFG_SELOUTB 0x20U // EPWMB Output Selection Bit +#define EPWM_HRCNFG_AUTOCONV 0x40U // Autoconversion Bit +#define EPWM_HRCNFG_SWAPAB 0x80U // Swap EPWMA and EPWMB Outputs Bit +#define EPWM_HRCNFG_EDGMODEB_S 8U +#define EPWM_HRCNFG_EDGMODEB_M 0x300U // ePWMxB Edge Mode Select Bits +#define EPWM_HRCNFG_CTLMODEB 0x400U // ePWMxB Control Mode Select Bits +#define EPWM_HRCNFG_HRLOADB_S 11U +#define EPWM_HRCNFG_HRLOADB_M 0x1800U // ePWMxB Shadow Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPWR register +// +//************************************************************************************************* +#define EPWM_HRPWR_CALPWRON 0x8000U // Calibration Power On + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRMSTEP register +// +//************************************************************************************************* +#define EPWM_HRMSTEP_HRMSTEP_S 0U +#define EPWM_HRMSTEP_HRMSTEP_M 0xFFU // High Resolution Micro Step Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG2 register +// +//************************************************************************************************* +#define EPWM_HRCNFG2_EDGMODEDB_S 0U +#define EPWM_HRCNFG2_EDGMODEDB_M 0x3U // Dead-Band Edge-Mode Select Bits +#define EPWM_HRCNFG2_CTLMODEDBRED_S 2U +#define EPWM_HRCNFG2_CTLMODEDBRED_M 0xCU // DBRED Control Mode Select Bits +#define EPWM_HRCNFG2_CTLMODEDBFED_S 4U +#define EPWM_HRCNFG2_CTLMODEDBFED_M 0x30U // DBFED Control Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPCTL register +// +//************************************************************************************************* +#define EPWM_HRPCTL_HRPE 0x1U // High Resolution Period Enable +#define EPWM_HRPCTL_PWMSYNCSEL 0x2U // EPWMSYNCPER Source Select +#define EPWM_HRPCTL_TBPHSHRLOADE 0x4U // TBPHSHR Load Enable +#define EPWM_HRPCTL_PWMSYNCSELX_S 4U +#define EPWM_HRPCTL_PWMSYNCSELX_M 0x70U // EPWMSYNCPER Extended Source Select Bit: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRREM register +// +//************************************************************************************************* +#define EPWM_TRREM_TRREM_S 0U +#define EPWM_TRREM_TRREM_M 0x7FFU // HRPWM Remainder Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL register +// +//************************************************************************************************* +#define EPWM_GLDCTL_GLD 0x1U // Global Shadow to Active load event control +#define EPWM_GLDCTL_GLDMODE_S 1U +#define EPWM_GLDCTL_GLDMODE_M 0x1EU // Shadow to Active Global Load Pulse Selection +#define EPWM_GLDCTL_OSHTMODE 0x20U // One Shot Load mode control bit +#define EPWM_GLDCTL_GLDPRD_S 7U +#define EPWM_GLDCTL_GLDPRD_M 0x380U // Global Load Strobe Period Select Register +#define EPWM_GLDCTL_GLDCNT_S 10U +#define EPWM_GLDCTL_GLDCNT_M 0x1C00U // Global Load Strobe Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCFG register +// +//************************************************************************************************* +#define EPWM_GLDCFG_TBPRD_TBPRDHR 0x1U // Global load event configuration for TBPRD:TBPRDHR +#define EPWM_GLDCFG_CMPA_CMPAHR 0x2U // Global load event configuration for CMPA:CMPAHR +#define EPWM_GLDCFG_CMPB_CMPBHR 0x4U // Global load event configuration for CMPB:CMPBHR +#define EPWM_GLDCFG_CMPC 0x8U // Global load event configuration for CMPC +#define EPWM_GLDCFG_CMPD 0x10U // Global load event configuration for CMPD +#define EPWM_GLDCFG_DBRED_DBREDHR 0x20U // Global load event configuration for DBRED:DBREDHR +#define EPWM_GLDCFG_DBFED_DBFEDHR 0x40U // Global load event configuration for DBFED:DBFEDHR +#define EPWM_GLDCFG_DBCTL 0x80U // Global load event configuration for DBCTL +#define EPWM_GLDCFG_AQCTLA_AQCTLA2 0x100U // Global load event configuration for AQCTLA/A2 +#define EPWM_GLDCFG_AQCTLB_AQCTLB2 0x200U // Global load event configuration for AQCTLB/B2 +#define EPWM_GLDCFG_AQCSFRC 0x400U // Global load event configuration for AQCSFRC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EPWMXLINK register +// +//************************************************************************************************* +#define EPWM_XLINK_TBPRDLINK_S 0U +#define EPWM_XLINK_TBPRDLINK_M 0xFU // TBPRD:TBPRDHR Link +#define EPWM_XLINK_CMPALINK_S 4U +#define EPWM_XLINK_CMPALINK_M 0xF0U // CMPA:CMPAHR Link +#define EPWM_XLINK_CMPBLINK_S 8U +#define EPWM_XLINK_CMPBLINK_M 0xF00U // CMPB:CMPBHR Link +#define EPWM_XLINK_CMPCLINK_S 12U +#define EPWM_XLINK_CMPCLINK_M 0xF000U // CMPC Link +#define EPWM_XLINK_CMPDLINK_S 16U +#define EPWM_XLINK_CMPDLINK_M 0xF0000U // CMPD Link +#define EPWM_XLINK_GLDCTL2LINK_S 28U +#define EPWM_XLINK_GLDCTL2LINK_M 0xF0000000U // GLDCTL2 Link + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA register +// +//************************************************************************************************* +#define EPWM_AQCTLA_ZRO_S 0U +#define EPWM_AQCTLA_ZRO_M 0x3U // Action Counter = Zero +#define EPWM_AQCTLA_PRD_S 2U +#define EPWM_AQCTLA_PRD_M 0xCU // Action Counter = Period +#define EPWM_AQCTLA_CAU_S 4U +#define EPWM_AQCTLA_CAU_M 0x30U // Action Counter = Compare A Up +#define EPWM_AQCTLA_CAD_S 6U +#define EPWM_AQCTLA_CAD_M 0xC0U // Action Counter = Compare A Down +#define EPWM_AQCTLA_CBU_S 8U +#define EPWM_AQCTLA_CBU_M 0x300U // Action Counter = Compare B Up +#define EPWM_AQCTLA_CBD_S 10U +#define EPWM_AQCTLA_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA2 register +// +//************************************************************************************************* +#define EPWM_AQCTLA2_T1U_S 0U +#define EPWM_AQCTLA2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define EPWM_AQCTLA2_T1D_S 2U +#define EPWM_AQCTLA2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define EPWM_AQCTLA2_T2U_S 4U +#define EPWM_AQCTLA2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define EPWM_AQCTLA2_T2D_S 6U +#define EPWM_AQCTLA2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB register +// +//************************************************************************************************* +#define EPWM_AQCTLB_ZRO_S 0U +#define EPWM_AQCTLB_ZRO_M 0x3U // Action Counter = Zero +#define EPWM_AQCTLB_PRD_S 2U +#define EPWM_AQCTLB_PRD_M 0xCU // Action Counter = Period +#define EPWM_AQCTLB_CAU_S 4U +#define EPWM_AQCTLB_CAU_M 0x30U // Action Counter = Compare A Up +#define EPWM_AQCTLB_CAD_S 6U +#define EPWM_AQCTLB_CAD_M 0xC0U // Action Counter = Compare A Down +#define EPWM_AQCTLB_CBU_S 8U +#define EPWM_AQCTLB_CBU_M 0x300U // Action Counter = Compare B Up +#define EPWM_AQCTLB_CBD_S 10U +#define EPWM_AQCTLB_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB2 register +// +//************************************************************************************************* +#define EPWM_AQCTLB2_T1U_S 0U +#define EPWM_AQCTLB2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define EPWM_AQCTLB2_T1D_S 2U +#define EPWM_AQCTLB2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define EPWM_AQCTLB2_T2U_S 4U +#define EPWM_AQCTLB2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define EPWM_AQCTLB2_T2D_S 6U +#define EPWM_AQCTLB2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQSFRC register +// +//************************************************************************************************* +#define EPWM_AQSFRC_ACTSFA_S 0U +#define EPWM_AQSFRC_ACTSFA_M 0x3U // Action when One-time SW Force A Invoked +#define EPWM_AQSFRC_OTSFA 0x4U // One-time SW Force A Output +#define EPWM_AQSFRC_ACTSFB_S 3U +#define EPWM_AQSFRC_ACTSFB_M 0x18U // Action when One-time SW Force B Invoked +#define EPWM_AQSFRC_OTSFB 0x20U // One-time SW Force A Output +#define EPWM_AQSFRC_RLDCSF_S 6U +#define EPWM_AQSFRC_RLDCSF_M 0xC0U // Reload from Shadow Options + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCSFRC register +// +//************************************************************************************************* +#define EPWM_AQCSFRC_CSFA_S 0U +#define EPWM_AQCSFRC_CSFA_M 0x3U // Continuous Software Force on output A +#define EPWM_AQCSFRC_CSFB_S 2U +#define EPWM_AQCSFRC_CSFB_M 0xCU // Continuous Software Force on output B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBREDHR register +// +//************************************************************************************************* +#define EPWM_DBREDHR_DBREDHR_S 9U +#define EPWM_DBREDHR_DBREDHR_M 0xFE00U // DBREDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBRED register +// +//************************************************************************************************* +#define EPWM_DBRED_DBRED_S 0U +#define EPWM_DBRED_DBRED_M 0x3FFFU // Rising edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFEDHR register +// +//************************************************************************************************* +#define EPWM_DBFEDHR_DBFEDHR_S 9U +#define EPWM_DBFEDHR_DBFEDHR_M 0xFE00U // DBFEDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFED register +// +//************************************************************************************************* +#define EPWM_DBFED_DBFED_S 0U +#define EPWM_DBFED_DBFED_M 0x3FFFU // Falling edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBPHS register +// +//************************************************************************************************* +#define EPWM_TBPHS_TBPHSHR_S 0U +#define EPWM_TBPHS_TBPHSHR_M 0xFFFFU // Extension Register for HRPWM Phase (8-bits) +#define EPWM_TBPHS_TBPHS_S 16U +#define EPWM_TBPHS_TBPHS_M 0xFFFF0000U // Phase Offset Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPA register +// +//************************************************************************************************* +#define EPWM_CMPA_CMPAHR_S 0U +#define EPWM_CMPA_CMPAHR_M 0xFFFFU // Compare A HRPWM Extension Register +#define EPWM_CMPA_CMPA_S 16U +#define EPWM_CMPA_CMPA_M 0xFFFF0000U // Compare A Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPB register +// +//************************************************************************************************* +#define EPWM_CMPB_CMPBHR_S 0U +#define EPWM_CMPB_CMPBHR_M 0xFFFFU // Compare B High Resolution Bits +#define EPWM_CMPB_CMPB_S 16U +#define EPWM_CMPB_CMPB_M 0xFFFF0000U // Compare B Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL2 register +// +//************************************************************************************************* +#define EPWM_GLDCTL2_OSHTLD 0x1U // Enable reload event in one shot mode +#define EPWM_GLDCTL2_GFRCLD 0x2U // Force reload event in one shot mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZSEL register +// +//************************************************************************************************* +#define EPWM_TZSEL_CBC1 0x1U // TZ1 CBC select +#define EPWM_TZSEL_CBC2 0x2U // TZ2 CBC select +#define EPWM_TZSEL_CBC3 0x4U // TZ3 CBC select +#define EPWM_TZSEL_CBC4 0x8U // TZ4 CBC select +#define EPWM_TZSEL_CBC5 0x10U // TZ5 CBC select +#define EPWM_TZSEL_CBC6 0x20U // TZ6 CBC select +#define EPWM_TZSEL_DCAEVT2 0x40U // DCAEVT2 CBC select +#define EPWM_TZSEL_DCBEVT2 0x80U // DCBEVT2 CBC select +#define EPWM_TZSEL_OSHT1 0x100U // One-shot TZ1 select +#define EPWM_TZSEL_OSHT2 0x200U // One-shot TZ2 select +#define EPWM_TZSEL_OSHT3 0x400U // One-shot TZ3 select +#define EPWM_TZSEL_OSHT4 0x800U // One-shot TZ4 select +#define EPWM_TZSEL_OSHT5 0x1000U // One-shot TZ5 select +#define EPWM_TZSEL_OSHT6 0x2000U // One-shot TZ6 select +#define EPWM_TZSEL_DCAEVT1 0x4000U // One-shot DCAEVT1 select +#define EPWM_TZSEL_DCBEVT1 0x8000U // One-shot DCBEVT1 select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZDCSEL register +// +//************************************************************************************************* +#define EPWM_TZDCSEL_DCAEVT1_S 0U +#define EPWM_TZDCSEL_DCAEVT1_M 0x7U // Digital Compare Output A Event 1 +#define EPWM_TZDCSEL_DCAEVT2_S 3U +#define EPWM_TZDCSEL_DCAEVT2_M 0x38U // Digital Compare Output A Event 2 +#define EPWM_TZDCSEL_DCBEVT1_S 6U +#define EPWM_TZDCSEL_DCBEVT1_M 0x1C0U // Digital Compare Output B Event 1 +#define EPWM_TZDCSEL_DCBEVT2_S 9U +#define EPWM_TZDCSEL_DCBEVT2_M 0xE00U // Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL register +// +//************************************************************************************************* +#define EPWM_TZCTL_TZA_S 0U +#define EPWM_TZCTL_TZA_M 0x3U // TZ1 to TZ6 Trip Action On EPWMxA +#define EPWM_TZCTL_TZB_S 2U +#define EPWM_TZCTL_TZB_M 0xCU // TZ1 to TZ6 Trip Action On EPWMxB +#define EPWM_TZCTL_DCAEVT1_S 4U +#define EPWM_TZCTL_DCAEVT1_M 0x30U // EPWMxA action on DCAEVT1 +#define EPWM_TZCTL_DCAEVT2_S 6U +#define EPWM_TZCTL_DCAEVT2_M 0xC0U // EPWMxA action on DCAEVT2 +#define EPWM_TZCTL_DCBEVT1_S 8U +#define EPWM_TZCTL_DCBEVT1_M 0x300U // EPWMxB action on DCBEVT1 +#define EPWM_TZCTL_DCBEVT2_S 10U +#define EPWM_TZCTL_DCBEVT2_M 0xC00U // EPWMxB action on DCBEVT2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL2 register +// +//************************************************************************************************* +#define EPWM_TZCTL2_TZAU_S 0U +#define EPWM_TZCTL2_TZAU_M 0x7U // Trip Action On EPWMxA while Count direction is UP +#define EPWM_TZCTL2_TZAD_S 3U +#define EPWM_TZCTL2_TZAD_M 0x38U // Trip Action On EPWMxA while Count direction is DOWN +#define EPWM_TZCTL2_TZBU_S 6U +#define EPWM_TZCTL2_TZBU_M 0x1C0U // Trip Action On EPWMxB while Count direction is UP +#define EPWM_TZCTL2_TZBD_S 9U +#define EPWM_TZCTL2_TZBD_M 0xE00U // Trip Action On EPWMxB while Count direction is DOWN +#define EPWM_TZCTL2_ETZE 0x8000U // TZCTL2 Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCA register +// +//************************************************************************************************* +#define EPWM_TZCTLDCA_DCAEVT1U_S 0U +#define EPWM_TZCTLDCA_DCAEVT1U_M 0x7U // DCAEVT1 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCA_DCAEVT1D_S 3U +#define EPWM_TZCTLDCA_DCAEVT1D_M 0x38U // DCAEVT1 Action On EPWMxA while Count direction is + // DOWN +#define EPWM_TZCTLDCA_DCAEVT2U_S 6U +#define EPWM_TZCTLDCA_DCAEVT2U_M 0x1C0U // DCAEVT2 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCA_DCAEVT2D_S 9U +#define EPWM_TZCTLDCA_DCAEVT2D_M 0xE00U // DCAEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCB register +// +//************************************************************************************************* +#define EPWM_TZCTLDCB_DCBEVT1U_S 0U +#define EPWM_TZCTLDCB_DCBEVT1U_M 0x7U // DCBEVT1 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCB_DCBEVT1D_S 3U +#define EPWM_TZCTLDCB_DCBEVT1D_M 0x38U // DCBEVT1 Action On EPWMxA while Count direction is + // DOWN +#define EPWM_TZCTLDCB_DCBEVT2U_S 6U +#define EPWM_TZCTLDCB_DCBEVT2U_M 0x1C0U // DCBEVT2 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCB_DCBEVT2D_S 9U +#define EPWM_TZCTLDCB_DCBEVT2D_M 0xE00U // DCBEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZEINT register +// +//************************************************************************************************* +#define EPWM_TZEINT_CBC 0x2U // Trip Zones Cycle By Cycle Int Enable +#define EPWM_TZEINT_OST 0x4U // Trip Zones One Shot Int Enable +#define EPWM_TZEINT_DCAEVT1 0x8U // Digital Compare A Event 1 Int Enable +#define EPWM_TZEINT_DCAEVT2 0x10U // Digital Compare A Event 2 Int Enable +#define EPWM_TZEINT_DCBEVT1 0x20U // Digital Compare B Event 1 Int Enable +#define EPWM_TZEINT_DCBEVT2 0x40U // Digital Compare B Event 2 Int Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFLG register +// +//************************************************************************************************* +#define EPWM_TZFLG_INT 0x1U // Global Int Status Flag +#define EPWM_TZFLG_CBC 0x2U // Trip Zones Cycle By Cycle Flag +#define EPWM_TZFLG_OST 0x4U // Trip Zones One Shot Flag +#define EPWM_TZFLG_DCAEVT1 0x8U // Digital Compare A Event 1 Flag +#define EPWM_TZFLG_DCAEVT2 0x10U // Digital Compare A Event 2 Flag +#define EPWM_TZFLG_DCBEVT1 0x20U // Digital Compare B Event 1 Flag +#define EPWM_TZFLG_DCBEVT2 0x40U // Digital Compare B Event 2 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCFLG register +// +//************************************************************************************************* +#define EPWM_TZCBCFLG_CBC1 0x1U // Latched Status Flag for CBC1 Trip Latch +#define EPWM_TZCBCFLG_CBC2 0x2U // Latched Status Flag for CBC2 Trip Latch +#define EPWM_TZCBCFLG_CBC3 0x4U // Latched Status Flag for CBC3 Trip Latch +#define EPWM_TZCBCFLG_CBC4 0x8U // Latched Status Flag for CBC4 Trip Latch +#define EPWM_TZCBCFLG_CBC5 0x10U // Latched Status Flag for CBC5 Trip Latch +#define EPWM_TZCBCFLG_CBC6 0x20U // Latched Status Flag for CBC6 Trip Latch +#define EPWM_TZCBCFLG_DCAEVT2 0x40U // Latched Status Flag for Digital Compare Output A Event 2 +#define EPWM_TZCBCFLG_DCBEVT2 0x80U // Latched Status Flag for Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTFLG register +// +//************************************************************************************************* +#define EPWM_TZOSTFLG_OST1 0x1U // Latched Status Flag for OST1 Trip Latch +#define EPWM_TZOSTFLG_OST2 0x2U // Latched Status Flag for OST2 Trip Latch +#define EPWM_TZOSTFLG_OST3 0x4U // Latched Status Flag for OST3 Trip Latch +#define EPWM_TZOSTFLG_OST4 0x8U // Latched Status Flag for OST4 Trip Latch +#define EPWM_TZOSTFLG_OST5 0x10U // Latched Status Flag for OST5 Trip Latch +#define EPWM_TZOSTFLG_OST6 0x20U // Latched Status Flag for OST6 Trip Latch +#define EPWM_TZOSTFLG_DCAEVT1 0x40U // Latched Status Flag for Digital Compare Output A Event 1 +#define EPWM_TZOSTFLG_DCBEVT1 0x80U // Latched Status Flag for Digital Compare Output B Event 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCLR register +// +//************************************************************************************************* +#define EPWM_TZCLR_INT 0x1U // Global Interrupt Clear Flag +#define EPWM_TZCLR_CBC 0x2U // Cycle-By-Cycle Flag Clear +#define EPWM_TZCLR_OST 0x4U // One-Shot Flag Clear +#define EPWM_TZCLR_DCAEVT1 0x8U // DCAVET1 Flag Clear +#define EPWM_TZCLR_DCAEVT2 0x10U // DCAEVT2 Flag Clear +#define EPWM_TZCLR_DCBEVT1 0x20U // DCBEVT1 Flag Clear +#define EPWM_TZCLR_DCBEVT2 0x40U // DCBEVT2 Flag Clear +#define EPWM_TZCLR_CBCPULSE_S 14U +#define EPWM_TZCLR_CBCPULSE_M 0xC000U // Clear Pulse for CBC Trip Latch + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCCLR register +// +//************************************************************************************************* +#define EPWM_TZCBCCLR_CBC1 0x1U // Clear Flag for Cycle-By-Cycle (CBC1) Trip Latch +#define EPWM_TZCBCCLR_CBC2 0x2U // Clear Flag for Cycle-By-Cycle (CBC2) Trip Latch +#define EPWM_TZCBCCLR_CBC3 0x4U // Clear Flag for Cycle-By-Cycle (CBC3) Trip Latch +#define EPWM_TZCBCCLR_CBC4 0x8U // Clear Flag for Cycle-By-Cycle (CBC4) Trip Latch +#define EPWM_TZCBCCLR_CBC5 0x10U // Clear Flag for Cycle-By-Cycle (CBC5) Trip Latch +#define EPWM_TZCBCCLR_CBC6 0x20U // Clear Flag for Cycle-By-Cycle (CBC6) Trip Latch +#define EPWM_TZCBCCLR_DCAEVT2 0x40U // Clear Flag forDCAEVT2 selected for CBC +#define EPWM_TZCBCCLR_DCBEVT2 0x80U // Clear Flag for DCBEVT2 selected for CBC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTCLR register +// +//************************************************************************************************* +#define EPWM_TZOSTCLR_OST1 0x1U // Clear Flag for Oneshot (OST1) Trip Latch +#define EPWM_TZOSTCLR_OST2 0x2U // Clear Flag for Oneshot (OST2) Trip Latch +#define EPWM_TZOSTCLR_OST3 0x4U // Clear Flag for Oneshot (OST3) Trip Latch +#define EPWM_TZOSTCLR_OST4 0x8U // Clear Flag for Oneshot (OST4) Trip Latch +#define EPWM_TZOSTCLR_OST5 0x10U // Clear Flag for Oneshot (OST5) Trip Latch +#define EPWM_TZOSTCLR_OST6 0x20U // Clear Flag for Oneshot (OST6) Trip Latch +#define EPWM_TZOSTCLR_DCAEVT1 0x40U // Clear Flag for DCAEVT1 selected for OST +#define EPWM_TZOSTCLR_DCBEVT1 0x80U // Clear Flag for DCBEVT1 selected for OST + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFRC register +// +//************************************************************************************************* +#define EPWM_TZFRC_CBC 0x2U // Force Trip Zones Cycle By Cycle Event +#define EPWM_TZFRC_OST 0x4U // Force Trip Zones One Shot Event +#define EPWM_TZFRC_DCAEVT1 0x8U // Force Digital Compare A Event 1 +#define EPWM_TZFRC_DCAEVT2 0x10U // Force Digital Compare A Event 2 +#define EPWM_TZFRC_DCBEVT1 0x20U // Force Digital Compare B Event 1 +#define EPWM_TZFRC_DCBEVT2 0x40U // Force Digital Compare B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSEL register +// +//************************************************************************************************* +#define EPWM_ETSEL_INTSEL_S 0U +#define EPWM_ETSEL_INTSEL_M 0x7U // EPWMxINTn Select +#define EPWM_ETSEL_INTEN 0x8U // EPWMxINTn Enable +#define EPWM_ETSEL_SOCASELCMP 0x10U // EPWMxSOCA Compare Select +#define EPWM_ETSEL_SOCBSELCMP 0x20U // EPWMxSOCB Compare Select +#define EPWM_ETSEL_INTSELCMP 0x40U // EPWMxINT Compare Select +#define EPWM_ETSEL_SOCASEL_S 8U +#define EPWM_ETSEL_SOCASEL_M 0x700U // Start of Conversion A Select +#define EPWM_ETSEL_SOCAEN 0x800U // Start of Conversion A Enable +#define EPWM_ETSEL_SOCBSEL_S 12U +#define EPWM_ETSEL_SOCBSEL_M 0x7000U // Start of Conversion B Select +#define EPWM_ETSEL_SOCBEN 0x8000U // Start of Conversion B Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETPS register +// +//************************************************************************************************* +#define EPWM_ETPS_INTPRD_S 0U +#define EPWM_ETPS_INTPRD_M 0x3U // EPWMxINTn Period Select +#define EPWM_ETPS_INTCNT_S 2U +#define EPWM_ETPS_INTCNT_M 0xCU // EPWMxINTn Counter Register +#define EPWM_ETPS_INTPSSEL 0x10U // EPWMxINTn Pre-Scale Selection Bits +#define EPWM_ETPS_SOCPSSEL 0x20U // EPWMxSOC A/B Pre-Scale Selection Bits +#define EPWM_ETPS_SOCAPRD_S 8U +#define EPWM_ETPS_SOCAPRD_M 0x300U // EPWMxSOCA Period Select +#define EPWM_ETPS_SOCACNT_S 10U +#define EPWM_ETPS_SOCACNT_M 0xC00U // EPWMxSOCA Counter Register +#define EPWM_ETPS_SOCBPRD_S 12U +#define EPWM_ETPS_SOCBPRD_M 0x3000U // EPWMxSOCB Period Select +#define EPWM_ETPS_SOCBCNT_S 14U +#define EPWM_ETPS_SOCBCNT_M 0xC000U // EPWMxSOCB Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFLG register +// +//************************************************************************************************* +#define EPWM_ETFLG_INT 0x1U // EPWMxINTn Flag +#define EPWM_ETFLG_SOCA 0x4U // EPWMxSOCA Flag +#define EPWM_ETFLG_SOCB 0x8U // EPWMxSOCB Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCLR register +// +//************************************************************************************************* +#define EPWM_ETCLR_INT 0x1U // EPWMxINTn Clear +#define EPWM_ETCLR_SOCA 0x4U // EPWMxSOCA Clear +#define EPWM_ETCLR_SOCB 0x8U // EPWMxSOCB Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFRC register +// +//************************************************************************************************* +#define EPWM_ETFRC_INT 0x1U // EPWMxINTn Force +#define EPWM_ETFRC_SOCA 0x4U // EPWMxSOCA Force +#define EPWM_ETFRC_SOCB 0x8U // EPWMxSOCB Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETINTPS register +// +//************************************************************************************************* +#define EPWM_ETINTPS_INTPRD2_S 0U +#define EPWM_ETINTPS_INTPRD2_M 0xFU // EPWMxINTn Period Select +#define EPWM_ETINTPS_INTCNT2_S 4U +#define EPWM_ETINTPS_INTCNT2_M 0xF0U // EPWMxINTn Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSOCPS register +// +//************************************************************************************************* +#define EPWM_ETSOCPS_SOCAPRD2_S 0U +#define EPWM_ETSOCPS_SOCAPRD2_M 0xFU // EPWMxSOCA Period Select +#define EPWM_ETSOCPS_SOCACNT2_S 4U +#define EPWM_ETSOCPS_SOCACNT2_M 0xF0U // EPWMxSOCA Counter Register +#define EPWM_ETSOCPS_SOCBPRD2_S 8U +#define EPWM_ETSOCPS_SOCBPRD2_M 0xF00U // EPWMxSOCB Period Select +#define EPWM_ETSOCPS_SOCBCNT2_S 12U +#define EPWM_ETSOCPS_SOCBCNT2_M 0xF000U // EPWMxSOCB Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINITCTL register +// +//************************************************************************************************* +#define EPWM_ETCNTINITCTL_INTINITFRC 0x400U // EPWMxINT Counter Initialization Force +#define EPWM_ETCNTINITCTL_SOCAINITFRC 0x800U // EPWMxSOCA Counter Initialization Force +#define EPWM_ETCNTINITCTL_SOCBINITFRC 0x1000U // EPWMxSOCB Counter Initialization Force +#define EPWM_ETCNTINITCTL_INTINITEN 0x2000U // EPWMxINT Counter Initialization Enable +#define EPWM_ETCNTINITCTL_SOCAINITEN 0x4000U // EPWMxSOCA Counter Initialization Enable +#define EPWM_ETCNTINITCTL_SOCBINITEN 0x8000U // EPWMxSOCB Counter Initialization Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINIT register +// +//************************************************************************************************* +#define EPWM_ETCNTINIT_INTINIT_S 0U +#define EPWM_ETCNTINIT_INTINIT_M 0xFU // EPWMxINT Counter Initialization Bits +#define EPWM_ETCNTINIT_SOCAINIT_S 4U +#define EPWM_ETCNTINIT_SOCAINIT_M 0xF0U // EPWMxSOCA Counter Initialization Bits +#define EPWM_ETCNTINIT_SOCBINIT_S 8U +#define EPWM_ETCNTINIT_SOCBINIT_M 0xF00U // EPWMxSOCB Counter Initialization Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCTRIPSEL_DCAHCOMPSEL_S 0U +#define EPWM_DCTRIPSEL_DCAHCOMPSEL_M 0xFU // Digital Compare A High COMP Input Select +#define EPWM_DCTRIPSEL_DCALCOMPSEL_S 4U +#define EPWM_DCTRIPSEL_DCALCOMPSEL_M 0xF0U // Digital Compare A Low COMP Input Select +#define EPWM_DCTRIPSEL_DCBHCOMPSEL_S 8U +#define EPWM_DCTRIPSEL_DCBHCOMPSEL_M 0xF00U // Digital Compare B High COMP Input Select +#define EPWM_DCTRIPSEL_DCBLCOMPSEL_S 12U +#define EPWM_DCTRIPSEL_DCBLCOMPSEL_M 0xF000U // Digital Compare B Low COMP Input Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCACTL register +// +//************************************************************************************************* +#define EPWM_DCACTL_EVT1SRCSEL 0x1U // DCAEVT1 Source Signal +#define EPWM_DCACTL_EVT1FRCSYNCSEL 0x2U // DCAEVT1 Force Sync Signal +#define EPWM_DCACTL_EVT1SOCE 0x4U // DCAEVT1 SOC Enable +#define EPWM_DCACTL_EVT1SYNCE 0x8U // DCAEVT1 SYNC Enable +#define EPWM_DCACTL_EVT2SRCSEL 0x100U // DCAEVT2 Source Signal +#define EPWM_DCACTL_EVT2FRCSYNCSEL 0x200U // DCAEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBCTL register +// +//************************************************************************************************* +#define EPWM_DCBCTL_EVT1SRCSEL 0x1U // DCBEVT1 Source Signal +#define EPWM_DCBCTL_EVT1FRCSYNCSEL 0x2U // DCBEVT1 Force Sync Signal +#define EPWM_DCBCTL_EVT1SOCE 0x4U // DCBEVT1 SOC Enable +#define EPWM_DCBCTL_EVT1SYNCE 0x8U // DCBEVT1 SYNC Enable +#define EPWM_DCBCTL_EVT2SRCSEL 0x100U // DCBEVT2 Source Signal +#define EPWM_DCBCTL_EVT2FRCSYNCSEL 0x200U // DCBEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCFCTL register +// +//************************************************************************************************* +#define EPWM_DCFCTL_SRCSEL_S 0U +#define EPWM_DCFCTL_SRCSEL_M 0x3U // Filter Block Signal Source Select +#define EPWM_DCFCTL_BLANKE 0x4U // Blanking Enable/Disable +#define EPWM_DCFCTL_BLANKINV 0x8U // Blanking Window Inversion +#define EPWM_DCFCTL_PULSESEL_S 4U +#define EPWM_DCFCTL_PULSESEL_M 0x30U // Pulse Select for Blanking & Capture Alignment +#define EPWM_DCFCTL_EDGEFILTSEL 0x40U // Edge Filter Select +#define EPWM_DCFCTL_EDGEMODE_S 8U +#define EPWM_DCFCTL_EDGEMODE_M 0x300U // Edge Mode +#define EPWM_DCFCTL_EDGECOUNT_S 10U +#define EPWM_DCFCTL_EDGECOUNT_M 0x1C00U // Edge Count +#define EPWM_DCFCTL_EDGESTATUS_S 13U +#define EPWM_DCFCTL_EDGESTATUS_M 0xE000U // Edge Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCCAPCTL register +// +//************************************************************************************************* +#define EPWM_DCCAPCTL_CAPE 0x1U // Counter Capture Enable +#define EPWM_DCCAPCTL_SHDWMODE 0x2U // Counter Capture Mode +#define EPWM_DCCAPCTL_CAPSTS 0x2000U // Latched Status Flag for Capture Event +#define EPWM_DCCAPCTL_CAPCLR 0x4000U // DC Capture Latched Status Clear Flag +#define EPWM_DCCAPCTL_CAPMODE 0x8000U // Counter Capture Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCAHTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCAHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCALTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCALTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAL Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBHTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCBHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBLTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCBLTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBL Mux + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwmxbar.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwmxbar.h new file mode 100644 index 0000000..5fb6058 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_epwmxbar.h @@ -0,0 +1,1192 @@ +//########################################################################### +// +// FILE: hw_epwmxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EPWMXBAR_H +#define HW_EPWMXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_TRIP4MUX0TO15CFG 0x0U // ePWM XBAR Mux Configuration for TRIP4 +#define XBAR_O_TRIP4MUX16TO31CFG 0x2U // ePWM XBAR Mux Configuration for TRIP4 +#define XBAR_O_TRIP5MUX0TO15CFG 0x4U // ePWM XBAR Mux Configuration for TRIP5 +#define XBAR_O_TRIP5MUX16TO31CFG 0x6U // ePWM XBAR Mux Configuration for TRIP5 +#define XBAR_O_TRIP7MUX0TO15CFG 0x8U // ePWM XBAR Mux Configuration for TRIP7 +#define XBAR_O_TRIP7MUX16TO31CFG 0xAU // ePWM XBAR Mux Configuration for TRIP7 +#define XBAR_O_TRIP8MUX0TO15CFG 0xCU // ePWM XBAR Mux Configuration for TRIP8 +#define XBAR_O_TRIP8MUX16TO31CFG 0xEU // ePWM XBAR Mux Configuration for TRIP8 +#define XBAR_O_TRIP9MUX0TO15CFG 0x10U // ePWM XBAR Mux Configuration for TRIP9 +#define XBAR_O_TRIP9MUX16TO31CFG 0x12U // ePWM XBAR Mux Configuration for TRIP9 +#define XBAR_O_TRIP10MUX0TO15CFG 0x14U // ePWM XBAR Mux Configuration for TRIP10 +#define XBAR_O_TRIP10MUX16TO31CFG 0x16U // ePWM XBAR Mux Configuration for TRIP10 +#define XBAR_O_TRIP11MUX0TO15CFG 0x18U // ePWM XBAR Mux Configuration for TRIP11 +#define XBAR_O_TRIP11MUX16TO31CFG 0x1AU // ePWM XBAR Mux Configuration for TRIP11 +#define XBAR_O_TRIP12MUX0TO15CFG 0x1CU // ePWM XBAR Mux Configuration for TRIP12 +#define XBAR_O_TRIP12MUX16TO31CFG 0x1EU // ePWM XBAR Mux Configuration for TRIP12 +#define XBAR_O_TRIP4MUXENABLE 0x20U // ePWM XBAR Mux Enable for TRIP4 +#define XBAR_O_TRIP5MUXENABLE 0x22U // ePWM XBAR Mux Enable for TRIP5 +#define XBAR_O_TRIP7MUXENABLE 0x24U // ePWM XBAR Mux Enable for TRIP7 +#define XBAR_O_TRIP8MUXENABLE 0x26U // ePWM XBAR Mux Enable for TRIP8 +#define XBAR_O_TRIP9MUXENABLE 0x28U // ePWM XBAR Mux Enable for TRIP9 +#define XBAR_O_TRIP10MUXENABLE 0x2AU // ePWM XBAR Mux Enable for TRIP10 +#define XBAR_O_TRIP11MUXENABLE 0x2CU // ePWM XBAR Mux Enable for TRIP11 +#define XBAR_O_TRIP12MUXENABLE 0x2EU // ePWM XBAR Mux Enable for TRIP12 +#define XBAR_O_TRIPOUTINV 0x38U // ePWM XBAR Output Inversion Register +#define XBAR_O_TRIPLOCK 0x3EU // ePWM XBAR Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP4MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP4MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP4MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP4MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP4MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP4MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP4MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP4MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP4MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP4MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP4MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP4MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP4MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP4MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP4MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP4MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP4MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP4 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP4MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP4MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP4MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP4MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP4MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP4MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP4MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP4MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP4MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP4MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP4MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP4MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP4MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP4MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP4MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP4MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP4MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP4 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP5MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP5MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP5MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP5MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP5MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP5MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP5MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP5MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP5MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP5MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP5MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP5MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP5MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP5MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP5MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP5MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP5MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP5 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP5MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP5MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP5MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP5MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP5MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP5MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP5MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP5MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP5MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP5MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP5MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP5MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP5MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP5MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP5MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP5MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP5MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP5 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP7MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP7MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP7MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP7MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP7MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP7MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP7MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP7MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP7MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP7MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP7MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP7MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP7MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP7MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP7MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP7MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP7MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP7 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP7MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP7MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP7MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP7MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP7MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP7MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP7MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP7MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP7MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP7MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP7MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP7MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP7MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP7MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP7MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP7MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP7MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP7 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP8MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP8MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP8MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP8MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP8MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP8MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP8MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP8MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP8MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP8MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP8MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP8MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP8MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP8MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP8MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP8MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP8MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP8 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP8MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP8MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP8MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP8MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP8MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP8MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP8MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP8MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP8MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP8MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP8MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP8MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP8MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP8MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP8MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP8MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP8MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP8 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP9MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP9MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP9MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP9MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP9MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP9MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP9MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP9MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP9MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP9MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP9MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP9MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP9MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP9MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP9MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP9MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP9MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP9 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP9MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP9MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP9MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP9MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP9MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP9MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP9MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP9MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP9MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP9MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP9MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP9MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP9MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP9MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP9MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP9MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP9MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP9 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP10MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP10MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP10MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP10MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP10MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP10MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP10MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP10MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP10MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP10MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP10MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP10MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP10MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP10MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP10MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP10MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP10MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP10 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP10MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP10MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP10MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP10MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP10MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP10MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP10MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP10MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP10MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP10MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP10MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP10MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP10MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP10MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP10MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP10MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP10MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP10 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP11MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP11MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP11MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP11MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP11MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP11MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP11MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP11MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP11MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP11MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP11MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP11MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP11MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP11MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP11MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP11MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP11MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP11 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP11MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP11MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP11MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP11MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP11MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP11MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP11MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP11MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP11MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP11MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP11MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP11MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP11MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP11MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP11MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP11MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP11MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP11 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP12MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP12MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP12MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP12MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP12MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP12MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP12MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP12MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP12MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP12MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP12MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP12MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP12MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP12MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP12MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP12MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP12MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP12 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP12MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP12MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP12MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP12MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP12MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP12MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP12MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP12MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP12MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP12MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP12MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP12MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP12MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP12MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP12MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP12MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP12MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP12 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP4MUXENABLE_MUX0 0x1U // mux0 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP4 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP5MUXENABLE_MUX0 0x1U // mux0 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP5 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP7MUXENABLE_MUX0 0x1U // mux0 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP7 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP8MUXENABLE_MUX0 0x1U // mux0 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP8 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP9MUXENABLE_MUX0 0x1U // mux0 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP9 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP10MUXENABLE_MUX0 0x1U // mux0 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP10 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP11MUXENABLE_MUX0 0x1U // mux0 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP11 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP12MUXENABLE_MUX0 0x1U // mux0 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP12 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIPOUTINV register +// +//************************************************************************************************* +#define XBAR_TRIPOUTINV_TRIP4 0x1U // Selects polarity for TRIP4 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP5 0x2U // Selects polarity for TRIP5 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP7 0x4U // Selects polarity for TRIP7 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP8 0x8U // Selects polarity for TRIP8 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP9 0x10U // Selects polarity for TRIP9 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP10 0x20U // Selects polarity for TRIP10 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP11 0x40U // Selects polarity for TRIP11 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP12 0x80U // Selects polarity for TRIP12 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIPLOCK register +// +//************************************************************************************************* +#define XBAR_TRIPLOCK_LOCK 0x1U // Locks the configuration for EPWM-XBAR +#define XBAR_TRIPLOCK_KEY_S 16U +#define XBAR_TRIPLOCK_KEY_M 0xFFFF0000U // Write protection KEY + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_eqep.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_eqep.h new file mode 100644 index 0000000..7dbb33a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_eqep.h @@ -0,0 +1,225 @@ +//########################################################################### +// +// FILE: hw_eqep.h +// +// TITLE: Definitions for the EQEP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EQEP_H +#define HW_EQEP_H + +//************************************************************************************************* +// +// The following are defines for the EQEP register offsets +// +//************************************************************************************************* +#define EQEP_O_QPOSCNT 0x0U // Position Counter +#define EQEP_O_QPOSINIT 0x2U // Position Counter Init +#define EQEP_O_QPOSMAX 0x4U // Maximum Position Count +#define EQEP_O_QPOSCMP 0x6U // Position Compare +#define EQEP_O_QPOSILAT 0x8U // Index Position Latch +#define EQEP_O_QPOSSLAT 0xAU // Strobe Position Latch +#define EQEP_O_QPOSLAT 0xCU // Position Latch +#define EQEP_O_QUTMR 0xEU // QEP Unit Timer +#define EQEP_O_QUPRD 0x10U // QEP Unit Period +#define EQEP_O_QWDTMR 0x12U // QEP Watchdog Timer +#define EQEP_O_QWDPRD 0x13U // QEP Watchdog Period +#define EQEP_O_QDECCTL 0x14U // Quadrature Decoder Control +#define EQEP_O_QEPCTL 0x15U // QEP Control +#define EQEP_O_QCAPCTL 0x16U // Qaudrature Capture Control +#define EQEP_O_QPOSCTL 0x17U // Position Compare Control +#define EQEP_O_QEINT 0x18U // QEP Interrupt Control +#define EQEP_O_QFLG 0x19U // QEP Interrupt Flag +#define EQEP_O_QCLR 0x1AU // QEP Interrupt Clear +#define EQEP_O_QFRC 0x1BU // QEP Interrupt Force +#define EQEP_O_QEPSTS 0x1CU // QEP Status +#define EQEP_O_QCTMR 0x1DU // QEP Capture Timer +#define EQEP_O_QCPRD 0x1EU // QEP Capture Period +#define EQEP_O_QCTMRLAT 0x1FU // QEP Capture Latch +#define EQEP_O_QCPRDLAT 0x20U // QEP Capture Period Latch + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QDECCTL register +// +//************************************************************************************************* +#define EQEP_QDECCTL_QSP 0x20U // QEPS input polarity +#define EQEP_QDECCTL_QIP 0x40U // QEPI input polarity +#define EQEP_QDECCTL_QBP 0x80U // QEPB input polarity +#define EQEP_QDECCTL_QAP 0x100U // QEPA input polarity +#define EQEP_QDECCTL_IGATE 0x200U // Index pulse gating option +#define EQEP_QDECCTL_SWAP 0x400U // CLK/DIR Signal Source for Position Counter +#define EQEP_QDECCTL_XCR 0x800U // External Clock Rate +#define EQEP_QDECCTL_SPSEL 0x1000U // Sync output pin selection +#define EQEP_QDECCTL_SOEN 0x2000U // Sync output-enable +#define EQEP_QDECCTL_QSRC_S 14U +#define EQEP_QDECCTL_QSRC_M 0xC000U // Position-counter source selection + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEPCTL register +// +//************************************************************************************************* +#define EQEP_QEPCTL_WDE 0x1U // QEP watchdog enable +#define EQEP_QEPCTL_UTE 0x2U // QEP unit timer enable +#define EQEP_QEPCTL_QCLM 0x4U // QEP capture latch mode +#define EQEP_QEPCTL_QPEN 0x8U // Quadrature postotion counter enable +#define EQEP_QEPCTL_IEL_S 4U +#define EQEP_QEPCTL_IEL_M 0x30U // Index event latch +#define EQEP_QEPCTL_SEL 0x40U // Strobe event latch +#define EQEP_QEPCTL_SWI 0x80U // Software init position counter +#define EQEP_QEPCTL_IEI_S 8U +#define EQEP_QEPCTL_IEI_M 0x300U // Index event init of position count +#define EQEP_QEPCTL_SEI_S 10U +#define EQEP_QEPCTL_SEI_M 0xC00U // Strobe event init +#define EQEP_QEPCTL_PCRM_S 12U +#define EQEP_QEPCTL_PCRM_M 0x3000U // Postion counter reset +#define EQEP_QEPCTL_FREE_SOFT_S 14U +#define EQEP_QEPCTL_FREE_SOFT_M 0xC000U // Emulation mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QCAPCTL register +// +//************************************************************************************************* +#define EQEP_QCAPCTL_UPPS_S 0U +#define EQEP_QCAPCTL_UPPS_M 0xFU // Unit position event prescaler +#define EQEP_QCAPCTL_CCPS_S 4U +#define EQEP_QCAPCTL_CCPS_M 0x70U // eQEP capture timer clock prescaler +#define EQEP_QCAPCTL_CEN 0x8000U // Enable eQEP capture + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QPOSCTL register +// +//************************************************************************************************* +#define EQEP_QPOSCTL_PCSPW_S 0U +#define EQEP_QPOSCTL_PCSPW_M 0xFFFU // Position compare sync pulse width +#define EQEP_QPOSCTL_PCE 0x1000U // Position compare enable/disable +#define EQEP_QPOSCTL_PCPOL 0x2000U // Polarity of sync output +#define EQEP_QPOSCTL_PCLOAD 0x4000U // Position compare of shadow load +#define EQEP_QPOSCTL_PCSHDW 0x8000U // Position compare of shadow enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEINT register +// +//************************************************************************************************* +#define EQEP_QEINT_PCE 0x2U // Position counter error interrupt enable +#define EQEP_QEINT_QPE 0x4U // Quadrature phase error interrupt enable +#define EQEP_QEINT_QDC 0x8U // Quadrature direction change interrupt enable +#define EQEP_QEINT_WTO 0x10U // Watchdog time out interrupt enable +#define EQEP_QEINT_PCU 0x20U // Position counter underflow interrupt enable +#define EQEP_QEINT_PCO 0x40U // Position counter overflow interrupt enable +#define EQEP_QEINT_PCR 0x80U // Position-compare ready interrupt enable +#define EQEP_QEINT_PCM 0x100U // Position-compare match interrupt enable +#define EQEP_QEINT_SEL 0x200U // Strobe event latch interrupt enable +#define EQEP_QEINT_IEL 0x400U // Index event latch interrupt enable +#define EQEP_QEINT_UTO 0x800U // Unit time out interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QFLG register +// +//************************************************************************************************* +#define EQEP_QFLG_INT 0x1U // Global interrupt status flag +#define EQEP_QFLG_PCE 0x2U // Position counter error interrupt flag +#define EQEP_QFLG_PHE 0x4U // Quadrature phase error interrupt flag +#define EQEP_QFLG_QDC 0x8U // Quadrature direction change interrupt flag +#define EQEP_QFLG_WTO 0x10U // Watchdog timeout interrupt flag +#define EQEP_QFLG_PCU 0x20U // Position counter underflow interrupt flag +#define EQEP_QFLG_PCO 0x40U // Position counter overflow interrupt flag +#define EQEP_QFLG_PCR 0x80U // Position-compare ready interrupt flag +#define EQEP_QFLG_PCM 0x100U // eQEP compare match event interrupt flag +#define EQEP_QFLG_SEL 0x200U // Strobe event latch interrupt flag +#define EQEP_QFLG_IEL 0x400U // Index event latch interrupt flag +#define EQEP_QFLG_UTO 0x800U // Unit time out interrupt flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QCLR register +// +//************************************************************************************************* +#define EQEP_QCLR_INT 0x1U // Global interrupt clear flag +#define EQEP_QCLR_PCE 0x2U // Clear position counter error interrupt flag +#define EQEP_QCLR_PHE 0x4U // Clear quadrature phase error interrupt flag +#define EQEP_QCLR_QDC 0x8U // Clear quadrature direction change interrupt flag +#define EQEP_QCLR_WTO 0x10U // Clear watchdog timeout interrupt flag +#define EQEP_QCLR_PCU 0x20U // Clear position counter underflow interrupt flag +#define EQEP_QCLR_PCO 0x40U // Clear position counter overflow interrupt flag +#define EQEP_QCLR_PCR 0x80U // Clear position-compare ready interrupt flag +#define EQEP_QCLR_PCM 0x100U // Clear eQEP compare match event interrupt flag +#define EQEP_QCLR_SEL 0x200U // Clear strobe event latch interrupt flag +#define EQEP_QCLR_IEL 0x400U // Clear index event latch interrupt flag +#define EQEP_QCLR_UTO 0x800U // Clear unit time out interrupt flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QFRC register +// +//************************************************************************************************* +#define EQEP_QFRC_PCE 0x2U // Force position counter error interrupt +#define EQEP_QFRC_PHE 0x4U // Force quadrature phase error interrupt +#define EQEP_QFRC_QDC 0x8U // Force quadrature direction change interrupt +#define EQEP_QFRC_WTO 0x10U // Force watchdog time out interrupt +#define EQEP_QFRC_PCU 0x20U // Force position counter underflow interrupt +#define EQEP_QFRC_PCO 0x40U // Force position counter overflow interrupt +#define EQEP_QFRC_PCR 0x80U // Force position-compare ready interrupt +#define EQEP_QFRC_PCM 0x100U // Force position-compare match interrupt +#define EQEP_QFRC_SEL 0x200U // Force strobe event latch interrupt +#define EQEP_QFRC_IEL 0x400U // Force index event latch interrupt +#define EQEP_QFRC_UTO 0x800U // Force unit time out interrupt + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEPSTS register +// +//************************************************************************************************* +#define EQEP_QEPSTS_PCEF 0x1U // Position counter error flag. +#define EQEP_QEPSTS_FIMF 0x2U // First index marker flag +#define EQEP_QEPSTS_CDEF 0x4U // Capture direction error flag +#define EQEP_QEPSTS_COEF 0x8U // Capture overflow error flag +#define EQEP_QEPSTS_QDLF 0x10U // eQEP direction latch flag +#define EQEP_QEPSTS_QDF 0x20U // Quadrature direction flag +#define EQEP_QEPSTS_FIDF 0x40U // The first index marker +#define EQEP_QEPSTS_UPEVNT 0x80U // Unit position event flag + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_flash.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_flash.h new file mode 100644 index 0000000..73319f1 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_flash.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_flash.h +// +// TITLE: Definitions for the FLASH registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_FLASH_H +#define HW_FLASH_H + +//************************************************************************************************* +// +// The following are defines for the FLASH register offsets +// +//************************************************************************************************* +#define FLASH_O_FRDCNTL 0x0U // Flash Read Control Register +#define FLASH_O_FBAC 0x1EU // Flash Bank Access Control Register +#define FLASH_O_FBFALLBACK 0x20U // Flash Bank Fallback Power Register +#define FLASH_O_FBPRDY 0x22U // Flash Bank Pump Ready Register +#define FLASH_O_FPAC1 0x24U // Flash Pump Access Control Register 1 +#define FLASH_O_FMSTAT 0x2AU // Flash Module Status Register +#define FLASH_O_FRD_INTF_CTRL 0x180U // Flash Read Interface Control Register + +#define FLASH_O_ECC_ENABLE 0x0U // ECC Enable +#define FLASH_O_SINGLE_ERR_ADDR_LOW 0x2U // Single Error Address Low +#define FLASH_O_SINGLE_ERR_ADDR_HIGH 0x4U // Single Error Address High +#define FLASH_O_UNC_ERR_ADDR_LOW 0x6U // Uncorrectable Error Address Low +#define FLASH_O_UNC_ERR_ADDR_HIGH 0x8U // Uncorrectable Error Address High +#define FLASH_O_ERR_STATUS 0xAU // Error Status +#define FLASH_O_ERR_POS 0xCU // Error Position +#define FLASH_O_ERR_STATUS_CLR 0xEU // Error Status Clear +#define FLASH_O_ERR_CNT 0x10U // Error Control +#define FLASH_O_ERR_THRESHOLD 0x12U // Error Threshold +#define FLASH_O_ERR_INTFLG 0x14U // Error Interrupt Flag +#define FLASH_O_ERR_INTCLR 0x16U // Error Interrupt Flag Clear +#define FLASH_O_FDATAH_TEST 0x18U // Data High Test +#define FLASH_O_FDATAL_TEST 0x1AU // Data Low Test +#define FLASH_O_FADDR_TEST 0x1CU // ECC Test Address +#define FLASH_O_FECC_TEST 0x1EU // ECC Test Address +#define FLASH_O_FECC_CTRL 0x20U // ECC Control +#define FLASH_O_FOUTH_TEST 0x22U // Test Data Out High +#define FLASH_O_FOUTL_TEST 0x24U // Test Data Out Low +#define FLASH_O_FECC_STATUS 0x26U // ECC Status + +#define FLASH_O_PUMPREQUEST 0x0U // Flash programming semaphore PUMP request register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FRDCNTL register +// +//************************************************************************************************* +#define FLASH_FRDCNTL_RWAIT_S 8U +#define FLASH_FRDCNTL_RWAIT_M 0xF00U // Random Read Waitstate + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBAC register +// +//************************************************************************************************* +#define FLASH_FBAC_VREADST_S 0U +#define FLASH_FBAC_VREADST_M 0xFFU // VREAD Setup Time Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBFALLBACK register +// +//************************************************************************************************* +#define FLASH_FBFALLBACK_BNKPWR0_S 0U +#define FLASH_FBFALLBACK_BNKPWR0_M 0x3U // Bank Power Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBPRDY register +// +//************************************************************************************************* +#define FLASH_FBPRDY_BANKRDY 0x1U // Flash Bank Active Power State +#define FLASH_FBPRDY_PUMPRDY 0x8000U // Flash Pump Active Power Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FPAC1 register +// +//************************************************************************************************* +#define FLASH_FPAC1_PMPPWR 0x1U // Charge Pump Fallback Power Mode +#define FLASH_FPAC1_PSLEEP_S 16U +#define FLASH_FPAC1_PSLEEP_M 0xFFF0000U // Pump Sleep Down Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FMSTAT register +// +//************************************************************************************************* +#define FLASH_FMSTAT_PSUSP 0x2U // Program Suspend. +#define FLASH_FMSTAT_ESUSP 0x4U // Erase Suspend. +#define FLASH_FMSTAT_VOLTSTAT 0x8U // Flash Pump Power Status +#define FLASH_FMSTAT_CSTAT 0x10U // Command Fail Status +#define FLASH_FMSTAT_INVDAT 0x20U // Invalid Data +#define FLASH_FMSTAT_PGM 0x40U // Program Operation Status +#define FLASH_FMSTAT_ERS 0x80U // Erase Operation Status +#define FLASH_FMSTAT_BUSY 0x100U // Busy Bit +#define FLASH_FMSTAT_EV 0x400U // Erase Verify Status +#define FLASH_FMSTAT_PGV 0x1000U // Programming Verify Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FRD_INTF_CTRL register +// +//************************************************************************************************* +#define FLASH_FRD_INTF_CTRL_PREFETCH_EN 0x1U // Prefetch Enable +#define FLASH_FRD_INTF_CTRL_DATA_CACHE_EN 0x2U // Data Cache Enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECC_ENABLE register +// +//************************************************************************************************* +#define FLASH_ECC_ENABLE_ENABLE_S 0U +#define FLASH_ECC_ENABLE_ENABLE_M 0xFU // Enable ECC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_STATUS register +// +//************************************************************************************************* +#define FLASH_ERR_STATUS_FAIL_0_L 0x1U // Lower 64bits Single Bit Error Corrected Value 0 +#define FLASH_ERR_STATUS_FAIL_1_L 0x2U // Lower 64bits Single Bit Error Corrected Value 1 +#define FLASH_ERR_STATUS_UNC_ERR_L 0x4U // Lower 64 bits Uncorrectable error occurred +#define FLASH_ERR_STATUS_FAIL_0_H 0x10000U // Upper 64bits Single Bit Error Corrected Value 0 +#define FLASH_ERR_STATUS_FAIL_1_H 0x20000U // Upper 64bits Single Bit Error Corrected Value 1 +#define FLASH_ERR_STATUS_UNC_ERR_H 0x40000U // Upper 64 bits Uncorrectable error occurred + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_POS register +// +//************************************************************************************************* +#define FLASH_ERR_POS_ERR_POS_L_S 0U +#define FLASH_ERR_POS_ERR_POS_L_M 0x3FU // Bit Position of Single bit Error in lower 64 + // bits +#define FLASH_ERR_POS_ERR_TYPE_L 0x100U // Error Type in lower 64 bits +#define FLASH_ERR_POS_ERR_POS_H_S 16U +#define FLASH_ERR_POS_ERR_POS_H_M 0x3F0000U // Bit Position of Single bit Error in upper 64 + // bits +#define FLASH_ERR_POS_ERR_TYPE_H 0x1000000U // Error Type in upper 64 bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_STATUS_CLR register +// +//************************************************************************************************* +#define FLASH_ERR_STATUS_CLR_FAIL_0_L_CLR 0x1U // Lower 64bits Single Bit Error Corrected + // Value 0 Clear +#define FLASH_ERR_STATUS_CLR_FAIL_1_L_CLR 0x2U // Lower 64bits Single Bit Error Corrected + // Value 1 Clear +#define FLASH_ERR_STATUS_CLR_UNC_ERR_L_CLR 0x4U // Lower 64 bits Uncorrectable error + // occurred Clear +#define FLASH_ERR_STATUS_CLR_FAIL_0_H_CLR 0x10000U // Upper 64bits Single Bit Error Corrected + // Value 0 Clear +#define FLASH_ERR_STATUS_CLR_FAIL_1_H_CLR 0x20000U // Upper 64bits Single Bit Error Corrected + // Value 1 Clear +#define FLASH_ERR_STATUS_CLR_UNC_ERR_H_CLR 0x40000U // Upper 64 bits Uncorrectable error + // occurred Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_CNT register +// +//************************************************************************************************* +#define FLASH_ERR_CNT_ERR_CNT_S 0U +#define FLASH_ERR_CNT_ERR_CNT_M 0xFFFFU // Error counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_THRESHOLD register +// +//************************************************************************************************* +#define FLASH_ERR_THRESHOLD_ERR_THRESHOLD_S 0U +#define FLASH_ERR_THRESHOLD_ERR_THRESHOLD_M 0xFFFFU // Error Threshold + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_INTFLG register +// +//************************************************************************************************* +#define FLASH_ERR_INTFLG_SINGLE_ERR_INTFLG 0x1U // Single Error Interrupt Flag +#define FLASH_ERR_INTFLG_UNC_ERR_INTFLG 0x2U // Uncorrectable Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_INTCLR register +// +//************************************************************************************************* +#define FLASH_ERR_INTCLR_SINGLE_ERR_INTCLR 0x1U // Single Error Interrupt Flag Clear +#define FLASH_ERR_INTCLR_UNC_ERR_INTCLR 0x2U // Uncorrectable Interrupt Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FADDR_TEST register +// +//************************************************************************************************* +#define FLASH_FADDR_TEST_ADDRL_S 3U +#define FLASH_FADDR_TEST_ADDRL_M 0xFFF8U // ECC Address Low +#define FLASH_FADDR_TEST_ADDRH_S 16U +#define FLASH_FADDR_TEST_ADDRH_M 0x3F0000U // ECC Address High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_TEST register +// +//************************************************************************************************* +#define FLASH_FECC_TEST_ECC_S 0U +#define FLASH_FECC_TEST_ECC_M 0xFFU // ECC Control Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_CTRL register +// +//************************************************************************************************* +#define FLASH_FECC_CTRL_ECC_TEST_EN 0x1U // Enable ECC Test Logic +#define FLASH_FECC_CTRL_ECC_SELECT 0x2U // ECC Bit Select +#define FLASH_FECC_CTRL_DO_ECC_CALC 0x4U // Enable ECC Calculation + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_STATUS register +// +//************************************************************************************************* +#define FLASH_FECC_STATUS_SINGLE_ERR 0x1U // Test Result is Single Bit Error +#define FLASH_FECC_STATUS_UNC_ERR 0x2U // Test Result is Uncorrectable Error +#define FLASH_FECC_STATUS_DATA_ERR_POS_S 2U +#define FLASH_FECC_STATUS_DATA_ERR_POS_M 0xFCU // Holds Bit Position of Error +#define FLASH_FECC_STATUS_ERR_TYPE 0x100U // Holds Bit Position of 8 Check Bits of Error + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PUMPREQUEST register +// +//************************************************************************************************* +#define FLASH_PUMPREQUEST_PUMP_OWNERSHIP_S 0U +#define FLASH_PUMPREQUEST_PUMP_OWNERSHIP_M 0x3U // Flash Pump Request Semaphore between + // CPU1 and CPU2 +#define FLASH_PUMPREQUEST_KEY_S 16U +#define FLASH_PUMPREQUEST_KEY_M 0xFFFF0000U // Key Qualifier for writes to this + // register + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_gpio.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_gpio.h new file mode 100644 index 0000000..0be426d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_gpio.h @@ -0,0 +1,4018 @@ +//########################################################################### +// +// FILE: hw_gpio.h +// +// TITLE: Definitions for the GPIO registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_GPIO_H +#define HW_GPIO_H + +//************************************************************************************************* +// +// The following are defines for the GPIO register offsets +// +//************************************************************************************************* +#define GPIO_O_GPACTRL 0x0U // GPIO A Qualification Sampling Period Control (GPIO0 to 31) +#define GPIO_O_GPAQSEL1 0x2U // GPIO A Qualifier Select 1 Register (GPIO0 to 15) +#define GPIO_O_GPAQSEL2 0x4U // GPIO A Qualifier Select 2 Register (GPIO16 to 31) +#define GPIO_O_GPAMUX1 0x6U // GPIO A Mux 1 Register (GPIO0 to 15) +#define GPIO_O_GPAMUX2 0x8U // GPIO A Mux 2 Register (GPIO16 to 31) +#define GPIO_O_GPADIR 0xAU // GPIO A Direction Register (GPIO0 to 31) +#define GPIO_O_GPAPUD 0xCU // GPIO A Pull Up Disable Register (GPIO0 to 31) +#define GPIO_O_GPAINV 0x10U // GPIO A Input Polarity Invert Registers (GPIO0 to 31) +#define GPIO_O_GPAODR 0x12U // GPIO A Open Drain Output Register (GPIO0 to GPIO31) +#define GPIO_O_GPAGMUX1 0x20U // GPIO A Peripheral Group Mux (GPIO0 to 15) +#define GPIO_O_GPAGMUX2 0x22U // GPIO A Peripheral Group Mux (GPIO16 to 31) +#define GPIO_O_GPACSEL1 0x28U // GPIO A Core Select Register (GPIO0 to 7) +#define GPIO_O_GPACSEL2 0x2AU // GPIO A Core Select Register (GPIO8 to 15) +#define GPIO_O_GPACSEL3 0x2CU // GPIO A Core Select Register (GPIO16 to 23) +#define GPIO_O_GPACSEL4 0x2EU // GPIO A Core Select Register (GPIO24 to 31) +#define GPIO_O_GPALOCK 0x3CU // GPIO A Lock Configuration Register (GPIO0 to 31) +#define GPIO_O_GPACR 0x3EU // GPIO A Lock Commit Register (GPIO0 to 31) +#define GPIO_O_GPBCTRL 0x40U // GPIO B Qualification Sampling Period Control (GPIO32 to 63) +#define GPIO_O_GPBQSEL1 0x42U // GPIO B Qualifier Select 1 Register (GPIO32 to 47) +#define GPIO_O_GPBQSEL2 0x44U // GPIO B Qualifier Select 2 Register (GPIO48 to 63) +#define GPIO_O_GPBMUX1 0x46U // GPIO B Mux 1 Register (GPIO32 to 47) +#define GPIO_O_GPBMUX2 0x48U // GPIO B Mux 2 Register (GPIO48 to 63) +#define GPIO_O_GPBDIR 0x4AU // GPIO B Direction Register (GPIO32 to 63) +#define GPIO_O_GPBPUD 0x4CU // GPIO B Pull Up Disable Register (GPIO32 to 63) +#define GPIO_O_GPBINV 0x50U // GPIO B Input Polarity Invert Registers (GPIO32 to 63) +#define GPIO_O_GPBODR 0x52U // GPIO B Open Drain Output Register (GPIO32 to GPIO63) +#define GPIO_O_GPBAMSEL 0x54U // GPIO B Analog Mode Select register (GPIO32 to GPIO63) +#define GPIO_O_GPBGMUX1 0x60U // GPIO B Peripheral Group Mux (GPIO32 to 47) +#define GPIO_O_GPBGMUX2 0x62U // GPIO B Peripheral Group Mux (GPIO48 to 63) +#define GPIO_O_GPBCSEL1 0x68U // GPIO B Core Select Register (GPIO32 to 39) +#define GPIO_O_GPBCSEL2 0x6AU // GPIO B Core Select Register (GPIO40 to 47) +#define GPIO_O_GPBCSEL3 0x6CU // GPIO B Core Select Register (GPIO48 to 55) +#define GPIO_O_GPBCSEL4 0x6EU // GPIO B Core Select Register (GPIO56 to 63) +#define GPIO_O_GPBLOCK 0x7CU // GPIO B Lock Configuration Register (GPIO32 to 63) +#define GPIO_O_GPBCR 0x7EU // GPIO B Lock Commit Register (GPIO32 to 63) +#define GPIO_O_GPCCTRL 0x80U // GPIO C Qualification Sampling Period Control (GPIO64 to 95) +#define GPIO_O_GPCQSEL1 0x82U // GPIO C Qualifier Select 1 Register (GPIO64 to 79) +#define GPIO_O_GPCQSEL2 0x84U // GPIO C Qualifier Select 2 Register (GPIO80 to 95) +#define GPIO_O_GPCMUX1 0x86U // GPIO C Mux 1 Register (GPIO64 to 79) +#define GPIO_O_GPCMUX2 0x88U // GPIO C Mux 2 Register (GPIO80 to 95) +#define GPIO_O_GPCDIR 0x8AU // GPIO C Direction Register (GPIO64 to 95) +#define GPIO_O_GPCPUD 0x8CU // GPIO C Pull Up Disable Register (GPIO64 to 95) +#define GPIO_O_GPCINV 0x90U // GPIO C Input Polarity Invert Registers (GPIO64 to 95) +#define GPIO_O_GPCODR 0x92U // GPIO C Open Drain Output Register (GPIO64 to GPIO95) +#define GPIO_O_GPCGMUX1 0xA0U // GPIO C Peripheral Group Mux (GPIO64 to 79) +#define GPIO_O_GPCGMUX2 0xA2U // GPIO C Peripheral Group Mux (GPIO80 to 95) +#define GPIO_O_GPCCSEL1 0xA8U // GPIO C Core Select Register (GPIO64 to 71) +#define GPIO_O_GPCCSEL2 0xAAU // GPIO C Core Select Register (GPIO72 to 79) +#define GPIO_O_GPCCSEL3 0xACU // GPIO C Core Select Register (GPIO80 to 87) +#define GPIO_O_GPCCSEL4 0xAEU // GPIO C Core Select Register (GPIO88 to 95) +#define GPIO_O_GPCLOCK 0xBCU // GPIO C Lock Configuration Register (GPIO64 to 95) +#define GPIO_O_GPCCR 0xBEU // GPIO C Lock Commit Register (GPIO64 to 95) +#define GPIO_O_GPDCTRL 0xC0U // GPIO D Qualification Sampling Period Control (GPIO96 to 127) +#define GPIO_O_GPDQSEL1 0xC2U // GPIO D Qualifier Select 1 Register (GPIO96 to 111) +#define GPIO_O_GPDQSEL2 0xC4U // GPIO D Qualifier Select 2 Register (GPIO112 to 127) +#define GPIO_O_GPDMUX1 0xC6U // GPIO D Mux 1 Register (GPIO96 to 111) +#define GPIO_O_GPDMUX2 0xC8U // GPIO D Mux 2 Register (GPIO112 to 127) +#define GPIO_O_GPDDIR 0xCAU // GPIO D Direction Register (GPIO96 to 127) +#define GPIO_O_GPDPUD 0xCCU // GPIO D Pull Up Disable Register (GPIO96 to 127) +#define GPIO_O_GPDINV 0xD0U // GPIO D Input Polarity Invert Registers (GPIO96 to 127) +#define GPIO_O_GPDODR 0xD2U // GPIO D Open Drain Output Register (GPIO96 to GPIO127) +#define GPIO_O_GPDGMUX1 0xE0U // GPIO D Peripheral Group Mux (GPIO96 to 111) +#define GPIO_O_GPDGMUX2 0xE2U // GPIO D Peripheral Group Mux (GPIO112 to 127) +#define GPIO_O_GPDCSEL1 0xE8U // GPIO D Core Select Register (GPIO96 to 103) +#define GPIO_O_GPDCSEL2 0xEAU // GPIO D Core Select Register (GPIO104 to 111) +#define GPIO_O_GPDCSEL3 0xECU // GPIO D Core Select Register (GPIO112 to 119) +#define GPIO_O_GPDCSEL4 0xEEU // GPIO D Core Select Register (GPIO120 to 127) +#define GPIO_O_GPDLOCK 0xFCU // GPIO D Lock Configuration Register (GPIO96 to 127) +#define GPIO_O_GPDCR 0xFEU // GPIO D Lock Commit Register (GPIO96 to 127) +#define GPIO_O_GPECTRL 0x100U // GPIO E Qualification Sampling Period Control (GPIO128 to 159) +#define GPIO_O_GPEQSEL1 0x102U // GPIO E Qualifier Select 1 Register (GPIO128 to 143) +#define GPIO_O_GPEQSEL2 0x104U // GPIO E Qualifier Select 2 Register (GPIO144 to 159) +#define GPIO_O_GPEMUX1 0x106U // GPIO E Mux 1 Register (GPIO128 to 143) +#define GPIO_O_GPEMUX2 0x108U // GPIO E Mux 2 Register (GPIO144 to 159) +#define GPIO_O_GPEDIR 0x10AU // GPIO E Direction Register (GPIO128 to 159) +#define GPIO_O_GPEPUD 0x10CU // GPIO E Pull Up Disable Register (GPIO128 to 159) +#define GPIO_O_GPEINV 0x110U // GPIO E Input Polarity Invert Registers (GPIO128 to 159) +#define GPIO_O_GPEODR 0x112U // GPIO E Open Drain Output Register (GPIO128 to GPIO159) +#define GPIO_O_GPEGMUX1 0x120U // GPIO E Peripheral Group Mux (GPIO128 to 143) +#define GPIO_O_GPEGMUX2 0x122U // GPIO E Peripheral Group Mux (GPIO144 to 159) +#define GPIO_O_GPECSEL1 0x128U // GPIO E Core Select Register (GPIO128 to 135) +#define GPIO_O_GPECSEL2 0x12AU // GPIO E Core Select Register (GPIO136 to 143) +#define GPIO_O_GPECSEL3 0x12CU // GPIO E Core Select Register (GPIO144 to 151) +#define GPIO_O_GPECSEL4 0x12EU // GPIO E Core Select Register (GPIO152 to 159) +#define GPIO_O_GPELOCK 0x13CU // GPIO E Lock Configuration Register (GPIO128 to 159) +#define GPIO_O_GPECR 0x13EU // GPIO E Lock Commit Register (GPIO128 to 159) +#define GPIO_O_GPFCTRL 0x140U // GPIO F Qualification Sampling Period Control (GPIO160 to 168) +#define GPIO_O_GPFQSEL1 0x142U // GPIO F Qualifier Select 1 Register (GPIO160 to 168) +#define GPIO_O_GPFMUX1 0x146U // GPIO F Mux 1 Register (GPIO160 to 168) +#define GPIO_O_GPFDIR 0x14AU // GPIO F Direction Register (GPIO160 to 168) +#define GPIO_O_GPFPUD 0x14CU // GPIO F Pull Up Disable Register (GPIO160 to 168) +#define GPIO_O_GPFINV 0x150U // GPIO F Input Polarity Invert Registers (GPIO160 to 168) +#define GPIO_O_GPFODR 0x152U // GPIO F Open Drain Output Register (GPIO160 to GPIO168) +#define GPIO_O_GPFGMUX1 0x160U // GPIO F Peripheral Group Mux (GPIO160 to 168) +#define GPIO_O_GPFCSEL1 0x168U // GPIO F Core Select Register (GPIO160 to 167) +#define GPIO_O_GPFCSEL2 0x16AU // GPIO F Core Select Register (GPIO168) +#define GPIO_O_GPFLOCK 0x17CU // GPIO F Lock Configuration Register (GPIO160 to 168) +#define GPIO_O_GPFCR 0x17EU // GPIO F Lock Commit Register (GPIO160 to 168) + +#define GPIO_O_GPADAT 0x0U // GPIO A Data Register (GPIO0 to 31) +#define GPIO_O_GPASET 0x2U // GPIO A Data Set Register (GPIO0 to 31) +#define GPIO_O_GPACLEAR 0x4U // GPIO A Data Clear Register (GPIO0 to 31) +#define GPIO_O_GPATOGGLE 0x6U // GPIO A Data Toggle Register (GPIO0 to 31) +#define GPIO_O_GPBDAT 0x8U // GPIO B Data Register (GPIO32 to 63) +#define GPIO_O_GPBSET 0xAU // GPIO B Data Set Register (GPIO32 to 63) +#define GPIO_O_GPBCLEAR 0xCU // GPIO B Data Clear Register (GPIO32 to 63) +#define GPIO_O_GPBTOGGLE 0xEU // GPIO B Data Toggle Register (GPIO32 to 63) +#define GPIO_O_GPCDAT 0x10U // GPIO C Data Register (GPIO64 to 95) +#define GPIO_O_GPCSET 0x12U // GPIO C Data Set Register (GPIO64 to 95) +#define GPIO_O_GPCCLEAR 0x14U // GPIO C Data Clear Register (GPIO64 to 95) +#define GPIO_O_GPCTOGGLE 0x16U // GPIO C Data Toggle Register (GPIO64 to 95) +#define GPIO_O_GPDDAT 0x18U // GPIO D Data Register (GPIO96 to 127) +#define GPIO_O_GPDSET 0x1AU // GPIO D Data Set Register (GPIO96 to 127) +#define GPIO_O_GPDCLEAR 0x1CU // GPIO D Data Clear Register (GPIO96 to 127) +#define GPIO_O_GPDTOGGLE 0x1EU // GPIO D Data Toggle Register (GPIO96 to 127) +#define GPIO_O_GPEDAT 0x20U // GPIO E Data Register (GPIO128 to 159) +#define GPIO_O_GPESET 0x22U // GPIO E Data Set Register (GPIO128 to 159) +#define GPIO_O_GPECLEAR 0x24U // GPIO E Data Clear Register (GPIO128 to 159) +#define GPIO_O_GPETOGGLE 0x26U // GPIO E Data Toggle Register (GPIO128 to 159) +#define GPIO_O_GPFDAT 0x28U // GPIO F Data Register (GPIO160 to 168) +#define GPIO_O_GPFSET 0x2AU // GPIO F Data Set Register (GPIO160 to 168) +#define GPIO_O_GPFCLEAR 0x2CU // GPIO F Data Clear Register (GPIO160 to 168) +#define GPIO_O_GPFTOGGLE 0x2EU // GPIO F Data Toggle Register (GPIO160 to 168) + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACTRL register +// +//************************************************************************************************* +#define GPIO_GPACTRL_QUALPRD0_S 0U +#define GPIO_GPACTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO0 to GPIO7 +#define GPIO_GPACTRL_QUALPRD1_S 8U +#define GPIO_GPACTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO8 to + // GPIO15 +#define GPIO_GPACTRL_QUALPRD2_S 16U +#define GPIO_GPACTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO16 to + // GPIO23 +#define GPIO_GPACTRL_QUALPRD3_S 24U +#define GPIO_GPACTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO24 to + // GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPAQSEL1_GPIO0_S 0U +#define GPIO_GPAQSEL1_GPIO0_M 0x3U // Select input qualification type for GPIO0 +#define GPIO_GPAQSEL1_GPIO1_S 2U +#define GPIO_GPAQSEL1_GPIO1_M 0xCU // Select input qualification type for GPIO1 +#define GPIO_GPAQSEL1_GPIO2_S 4U +#define GPIO_GPAQSEL1_GPIO2_M 0x30U // Select input qualification type for GPIO2 +#define GPIO_GPAQSEL1_GPIO3_S 6U +#define GPIO_GPAQSEL1_GPIO3_M 0xC0U // Select input qualification type for GPIO3 +#define GPIO_GPAQSEL1_GPIO4_S 8U +#define GPIO_GPAQSEL1_GPIO4_M 0x300U // Select input qualification type for GPIO4 +#define GPIO_GPAQSEL1_GPIO5_S 10U +#define GPIO_GPAQSEL1_GPIO5_M 0xC00U // Select input qualification type for GPIO5 +#define GPIO_GPAQSEL1_GPIO6_S 12U +#define GPIO_GPAQSEL1_GPIO6_M 0x3000U // Select input qualification type for GPIO6 +#define GPIO_GPAQSEL1_GPIO7_S 14U +#define GPIO_GPAQSEL1_GPIO7_M 0xC000U // Select input qualification type for GPIO7 +#define GPIO_GPAQSEL1_GPIO8_S 16U +#define GPIO_GPAQSEL1_GPIO8_M 0x30000U // Select input qualification type for GPIO8 +#define GPIO_GPAQSEL1_GPIO9_S 18U +#define GPIO_GPAQSEL1_GPIO9_M 0xC0000U // Select input qualification type for GPIO9 +#define GPIO_GPAQSEL1_GPIO10_S 20U +#define GPIO_GPAQSEL1_GPIO10_M 0x300000U // Select input qualification type for GPIO10 +#define GPIO_GPAQSEL1_GPIO11_S 22U +#define GPIO_GPAQSEL1_GPIO11_M 0xC00000U // Select input qualification type for GPIO11 +#define GPIO_GPAQSEL1_GPIO12_S 24U +#define GPIO_GPAQSEL1_GPIO12_M 0x3000000U // Select input qualification type for GPIO12 +#define GPIO_GPAQSEL1_GPIO13_S 26U +#define GPIO_GPAQSEL1_GPIO13_M 0xC000000U // Select input qualification type for GPIO13 +#define GPIO_GPAQSEL1_GPIO14_S 28U +#define GPIO_GPAQSEL1_GPIO14_M 0x30000000U // Select input qualification type for GPIO14 +#define GPIO_GPAQSEL1_GPIO15_S 30U +#define GPIO_GPAQSEL1_GPIO15_M 0xC0000000U // Select input qualification type for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPAQSEL2_GPIO16_S 0U +#define GPIO_GPAQSEL2_GPIO16_M 0x3U // Select input qualification type for GPIO16 +#define GPIO_GPAQSEL2_GPIO17_S 2U +#define GPIO_GPAQSEL2_GPIO17_M 0xCU // Select input qualification type for GPIO17 +#define GPIO_GPAQSEL2_GPIO18_S 4U +#define GPIO_GPAQSEL2_GPIO18_M 0x30U // Select input qualification type for GPIO18 +#define GPIO_GPAQSEL2_GPIO19_S 6U +#define GPIO_GPAQSEL2_GPIO19_M 0xC0U // Select input qualification type for GPIO19 +#define GPIO_GPAQSEL2_GPIO20_S 8U +#define GPIO_GPAQSEL2_GPIO20_M 0x300U // Select input qualification type for GPIO20 +#define GPIO_GPAQSEL2_GPIO21_S 10U +#define GPIO_GPAQSEL2_GPIO21_M 0xC00U // Select input qualification type for GPIO21 +#define GPIO_GPAQSEL2_GPIO22_S 12U +#define GPIO_GPAQSEL2_GPIO22_M 0x3000U // Select input qualification type for GPIO22 +#define GPIO_GPAQSEL2_GPIO23_S 14U +#define GPIO_GPAQSEL2_GPIO23_M 0xC000U // Select input qualification type for GPIO23 +#define GPIO_GPAQSEL2_GPIO24_S 16U +#define GPIO_GPAQSEL2_GPIO24_M 0x30000U // Select input qualification type for GPIO24 +#define GPIO_GPAQSEL2_GPIO25_S 18U +#define GPIO_GPAQSEL2_GPIO25_M 0xC0000U // Select input qualification type for GPIO25 +#define GPIO_GPAQSEL2_GPIO26_S 20U +#define GPIO_GPAQSEL2_GPIO26_M 0x300000U // Select input qualification type for GPIO26 +#define GPIO_GPAQSEL2_GPIO27_S 22U +#define GPIO_GPAQSEL2_GPIO27_M 0xC00000U // Select input qualification type for GPIO27 +#define GPIO_GPAQSEL2_GPIO28_S 24U +#define GPIO_GPAQSEL2_GPIO28_M 0x3000000U // Select input qualification type for GPIO28 +#define GPIO_GPAQSEL2_GPIO29_S 26U +#define GPIO_GPAQSEL2_GPIO29_M 0xC000000U // Select input qualification type for GPIO29 +#define GPIO_GPAQSEL2_GPIO30_S 28U +#define GPIO_GPAQSEL2_GPIO30_M 0x30000000U // Select input qualification type for GPIO30 +#define GPIO_GPAQSEL2_GPIO31_S 30U +#define GPIO_GPAQSEL2_GPIO31_M 0xC0000000U // Select input qualification type for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAMUX1 register +// +//************************************************************************************************* +#define GPIO_GPAMUX1_GPIO0_S 0U +#define GPIO_GPAMUX1_GPIO0_M 0x3U // Defines pin-muxing selection for GPIO0 +#define GPIO_GPAMUX1_GPIO1_S 2U +#define GPIO_GPAMUX1_GPIO1_M 0xCU // Defines pin-muxing selection for GPIO1 +#define GPIO_GPAMUX1_GPIO2_S 4U +#define GPIO_GPAMUX1_GPIO2_M 0x30U // Defines pin-muxing selection for GPIO2 +#define GPIO_GPAMUX1_GPIO3_S 6U +#define GPIO_GPAMUX1_GPIO3_M 0xC0U // Defines pin-muxing selection for GPIO3 +#define GPIO_GPAMUX1_GPIO4_S 8U +#define GPIO_GPAMUX1_GPIO4_M 0x300U // Defines pin-muxing selection for GPIO4 +#define GPIO_GPAMUX1_GPIO5_S 10U +#define GPIO_GPAMUX1_GPIO5_M 0xC00U // Defines pin-muxing selection for GPIO5 +#define GPIO_GPAMUX1_GPIO6_S 12U +#define GPIO_GPAMUX1_GPIO6_M 0x3000U // Defines pin-muxing selection for GPIO6 +#define GPIO_GPAMUX1_GPIO7_S 14U +#define GPIO_GPAMUX1_GPIO7_M 0xC000U // Defines pin-muxing selection for GPIO7 +#define GPIO_GPAMUX1_GPIO8_S 16U +#define GPIO_GPAMUX1_GPIO8_M 0x30000U // Defines pin-muxing selection for GPIO8 +#define GPIO_GPAMUX1_GPIO9_S 18U +#define GPIO_GPAMUX1_GPIO9_M 0xC0000U // Defines pin-muxing selection for GPIO9 +#define GPIO_GPAMUX1_GPIO10_S 20U +#define GPIO_GPAMUX1_GPIO10_M 0x300000U // Defines pin-muxing selection for GPIO10 +#define GPIO_GPAMUX1_GPIO11_S 22U +#define GPIO_GPAMUX1_GPIO11_M 0xC00000U // Defines pin-muxing selection for GPIO11 +#define GPIO_GPAMUX1_GPIO12_S 24U +#define GPIO_GPAMUX1_GPIO12_M 0x3000000U // Defines pin-muxing selection for GPIO12 +#define GPIO_GPAMUX1_GPIO13_S 26U +#define GPIO_GPAMUX1_GPIO13_M 0xC000000U // Defines pin-muxing selection for GPIO13 +#define GPIO_GPAMUX1_GPIO14_S 28U +#define GPIO_GPAMUX1_GPIO14_M 0x30000000U // Defines pin-muxing selection for GPIO14 +#define GPIO_GPAMUX1_GPIO15_S 30U +#define GPIO_GPAMUX1_GPIO15_M 0xC0000000U // Defines pin-muxing selection for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAMUX2 register +// +//************************************************************************************************* +#define GPIO_GPAMUX2_GPIO16_S 0U +#define GPIO_GPAMUX2_GPIO16_M 0x3U // Defines pin-muxing selection for GPIO16 +#define GPIO_GPAMUX2_GPIO17_S 2U +#define GPIO_GPAMUX2_GPIO17_M 0xCU // Defines pin-muxing selection for GPIO17 +#define GPIO_GPAMUX2_GPIO18_S 4U +#define GPIO_GPAMUX2_GPIO18_M 0x30U // Defines pin-muxing selection for GPIO18 +#define GPIO_GPAMUX2_GPIO19_S 6U +#define GPIO_GPAMUX2_GPIO19_M 0xC0U // Defines pin-muxing selection for GPIO19 +#define GPIO_GPAMUX2_GPIO20_S 8U +#define GPIO_GPAMUX2_GPIO20_M 0x300U // Defines pin-muxing selection for GPIO20 +#define GPIO_GPAMUX2_GPIO21_S 10U +#define GPIO_GPAMUX2_GPIO21_M 0xC00U // Defines pin-muxing selection for GPIO21 +#define GPIO_GPAMUX2_GPIO22_S 12U +#define GPIO_GPAMUX2_GPIO22_M 0x3000U // Defines pin-muxing selection for GPIO22 +#define GPIO_GPAMUX2_GPIO23_S 14U +#define GPIO_GPAMUX2_GPIO23_M 0xC000U // Defines pin-muxing selection for GPIO23 +#define GPIO_GPAMUX2_GPIO24_S 16U +#define GPIO_GPAMUX2_GPIO24_M 0x30000U // Defines pin-muxing selection for GPIO24 +#define GPIO_GPAMUX2_GPIO25_S 18U +#define GPIO_GPAMUX2_GPIO25_M 0xC0000U // Defines pin-muxing selection for GPIO25 +#define GPIO_GPAMUX2_GPIO26_S 20U +#define GPIO_GPAMUX2_GPIO26_M 0x300000U // Defines pin-muxing selection for GPIO26 +#define GPIO_GPAMUX2_GPIO27_S 22U +#define GPIO_GPAMUX2_GPIO27_M 0xC00000U // Defines pin-muxing selection for GPIO27 +#define GPIO_GPAMUX2_GPIO28_S 24U +#define GPIO_GPAMUX2_GPIO28_M 0x3000000U // Defines pin-muxing selection for GPIO28 +#define GPIO_GPAMUX2_GPIO29_S 26U +#define GPIO_GPAMUX2_GPIO29_M 0xC000000U // Defines pin-muxing selection for GPIO29 +#define GPIO_GPAMUX2_GPIO30_S 28U +#define GPIO_GPAMUX2_GPIO30_M 0x30000000U // Defines pin-muxing selection for GPIO30 +#define GPIO_GPAMUX2_GPIO31_S 30U +#define GPIO_GPAMUX2_GPIO31_M 0xC0000000U // Defines pin-muxing selection for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPADIR register +// +//************************************************************************************************* +#define GPIO_GPADIR_GPIO0 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO1 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO2 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO3 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO4 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO5 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO6 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO7 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO8 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO9 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO10 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO11 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO12 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO13 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO14 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO15 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO16 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO17 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO18 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO19 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO20 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO21 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO22 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO23 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO24 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO25 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO26 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO27 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO28 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO29 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO30 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO31 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAPUD register +// +//************************************************************************************************* +#define GPIO_GPAPUD_GPIO0 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO1 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO2 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO3 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO4 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO5 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO6 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO7 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO8 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO9 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO10 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO11 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO12 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO13 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO14 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO15 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO16 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO17 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO18 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO19 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO20 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO21 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO22 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO23 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO24 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO25 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO26 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO27 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO28 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO29 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO30 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO31 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAINV register +// +//************************************************************************************************* +#define GPIO_GPAINV_GPIO0 0x1U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO1 0x2U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO2 0x4U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO3 0x8U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO4 0x10U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO5 0x20U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO6 0x40U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO7 0x80U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO8 0x100U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO9 0x200U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO10 0x400U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO11 0x800U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO12 0x1000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO13 0x2000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO14 0x4000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO15 0x8000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO16 0x10000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO17 0x20000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO18 0x40000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO19 0x80000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO20 0x100000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO21 0x200000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO22 0x400000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO23 0x800000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO24 0x1000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO25 0x2000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO26 0x4000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO27 0x8000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO28 0x10000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO29 0x20000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO30 0x40000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO31 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAODR register +// +//************************************************************************************************* +#define GPIO_GPAODR_GPIO0 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO1 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO2 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO3 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO4 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO5 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO6 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO7 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO8 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO9 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO10 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO11 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO12 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO13 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO14 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO15 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO16 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO17 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO18 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO19 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO20 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO21 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO22 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO23 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO24 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO25 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO26 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO27 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO28 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO29 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO30 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO31 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPAGMUX1_GPIO0_S 0U +#define GPIO_GPAGMUX1_GPIO0_M 0x3U // Defines pin-muxing selection for GPIO0 +#define GPIO_GPAGMUX1_GPIO1_S 2U +#define GPIO_GPAGMUX1_GPIO1_M 0xCU // Defines pin-muxing selection for GPIO1 +#define GPIO_GPAGMUX1_GPIO2_S 4U +#define GPIO_GPAGMUX1_GPIO2_M 0x30U // Defines pin-muxing selection for GPIO2 +#define GPIO_GPAGMUX1_GPIO3_S 6U +#define GPIO_GPAGMUX1_GPIO3_M 0xC0U // Defines pin-muxing selection for GPIO3 +#define GPIO_GPAGMUX1_GPIO4_S 8U +#define GPIO_GPAGMUX1_GPIO4_M 0x300U // Defines pin-muxing selection for GPIO4 +#define GPIO_GPAGMUX1_GPIO5_S 10U +#define GPIO_GPAGMUX1_GPIO5_M 0xC00U // Defines pin-muxing selection for GPIO5 +#define GPIO_GPAGMUX1_GPIO6_S 12U +#define GPIO_GPAGMUX1_GPIO6_M 0x3000U // Defines pin-muxing selection for GPIO6 +#define GPIO_GPAGMUX1_GPIO7_S 14U +#define GPIO_GPAGMUX1_GPIO7_M 0xC000U // Defines pin-muxing selection for GPIO7 +#define GPIO_GPAGMUX1_GPIO8_S 16U +#define GPIO_GPAGMUX1_GPIO8_M 0x30000U // Defines pin-muxing selection for GPIO8 +#define GPIO_GPAGMUX1_GPIO9_S 18U +#define GPIO_GPAGMUX1_GPIO9_M 0xC0000U // Defines pin-muxing selection for GPIO9 +#define GPIO_GPAGMUX1_GPIO10_S 20U +#define GPIO_GPAGMUX1_GPIO10_M 0x300000U // Defines pin-muxing selection for GPIO10 +#define GPIO_GPAGMUX1_GPIO11_S 22U +#define GPIO_GPAGMUX1_GPIO11_M 0xC00000U // Defines pin-muxing selection for GPIO11 +#define GPIO_GPAGMUX1_GPIO12_S 24U +#define GPIO_GPAGMUX1_GPIO12_M 0x3000000U // Defines pin-muxing selection for GPIO12 +#define GPIO_GPAGMUX1_GPIO13_S 26U +#define GPIO_GPAGMUX1_GPIO13_M 0xC000000U // Defines pin-muxing selection for GPIO13 +#define GPIO_GPAGMUX1_GPIO14_S 28U +#define GPIO_GPAGMUX1_GPIO14_M 0x30000000U // Defines pin-muxing selection for GPIO14 +#define GPIO_GPAGMUX1_GPIO15_S 30U +#define GPIO_GPAGMUX1_GPIO15_M 0xC0000000U // Defines pin-muxing selection for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPAGMUX2_GPIO16_S 0U +#define GPIO_GPAGMUX2_GPIO16_M 0x3U // Defines pin-muxing selection for GPIO16 +#define GPIO_GPAGMUX2_GPIO17_S 2U +#define GPIO_GPAGMUX2_GPIO17_M 0xCU // Defines pin-muxing selection for GPIO17 +#define GPIO_GPAGMUX2_GPIO18_S 4U +#define GPIO_GPAGMUX2_GPIO18_M 0x30U // Defines pin-muxing selection for GPIO18 +#define GPIO_GPAGMUX2_GPIO19_S 6U +#define GPIO_GPAGMUX2_GPIO19_M 0xC0U // Defines pin-muxing selection for GPIO19 +#define GPIO_GPAGMUX2_GPIO20_S 8U +#define GPIO_GPAGMUX2_GPIO20_M 0x300U // Defines pin-muxing selection for GPIO20 +#define GPIO_GPAGMUX2_GPIO21_S 10U +#define GPIO_GPAGMUX2_GPIO21_M 0xC00U // Defines pin-muxing selection for GPIO21 +#define GPIO_GPAGMUX2_GPIO22_S 12U +#define GPIO_GPAGMUX2_GPIO22_M 0x3000U // Defines pin-muxing selection for GPIO22 +#define GPIO_GPAGMUX2_GPIO23_S 14U +#define GPIO_GPAGMUX2_GPIO23_M 0xC000U // Defines pin-muxing selection for GPIO23 +#define GPIO_GPAGMUX2_GPIO24_S 16U +#define GPIO_GPAGMUX2_GPIO24_M 0x30000U // Defines pin-muxing selection for GPIO24 +#define GPIO_GPAGMUX2_GPIO25_S 18U +#define GPIO_GPAGMUX2_GPIO25_M 0xC0000U // Defines pin-muxing selection for GPIO25 +#define GPIO_GPAGMUX2_GPIO26_S 20U +#define GPIO_GPAGMUX2_GPIO26_M 0x300000U // Defines pin-muxing selection for GPIO26 +#define GPIO_GPAGMUX2_GPIO27_S 22U +#define GPIO_GPAGMUX2_GPIO27_M 0xC00000U // Defines pin-muxing selection for GPIO27 +#define GPIO_GPAGMUX2_GPIO28_S 24U +#define GPIO_GPAGMUX2_GPIO28_M 0x3000000U // Defines pin-muxing selection for GPIO28 +#define GPIO_GPAGMUX2_GPIO29_S 26U +#define GPIO_GPAGMUX2_GPIO29_M 0xC000000U // Defines pin-muxing selection for GPIO29 +#define GPIO_GPAGMUX2_GPIO30_S 28U +#define GPIO_GPAGMUX2_GPIO30_M 0x30000000U // Defines pin-muxing selection for GPIO30 +#define GPIO_GPAGMUX2_GPIO31_S 30U +#define GPIO_GPAGMUX2_GPIO31_M 0xC0000000U // Defines pin-muxing selection for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL1 register +// +//************************************************************************************************* +#define GPIO_GPACSEL1_GPIO0_S 0U +#define GPIO_GPACSEL1_GPIO0_M 0xFU // GPIO0 Master CPU Select +#define GPIO_GPACSEL1_GPIO1_S 4U +#define GPIO_GPACSEL1_GPIO1_M 0xF0U // GPIO1 Master CPU Select +#define GPIO_GPACSEL1_GPIO2_S 8U +#define GPIO_GPACSEL1_GPIO2_M 0xF00U // GPIO2 Master CPU Select +#define GPIO_GPACSEL1_GPIO3_S 12U +#define GPIO_GPACSEL1_GPIO3_M 0xF000U // GPIO3 Master CPU Select +#define GPIO_GPACSEL1_GPIO4_S 16U +#define GPIO_GPACSEL1_GPIO4_M 0xF0000U // GPIO4 Master CPU Select +#define GPIO_GPACSEL1_GPIO5_S 20U +#define GPIO_GPACSEL1_GPIO5_M 0xF00000U // GPIO5 Master CPU Select +#define GPIO_GPACSEL1_GPIO6_S 24U +#define GPIO_GPACSEL1_GPIO6_M 0xF000000U // GPIO6 Master CPU Select +#define GPIO_GPACSEL1_GPIO7_S 28U +#define GPIO_GPACSEL1_GPIO7_M 0xF0000000U // GPIO7 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL2 register +// +//************************************************************************************************* +#define GPIO_GPACSEL2_GPIO8_S 0U +#define GPIO_GPACSEL2_GPIO8_M 0xFU // GPIO8 Master CPU Select +#define GPIO_GPACSEL2_GPIO9_S 4U +#define GPIO_GPACSEL2_GPIO9_M 0xF0U // GPIO9 Master CPU Select +#define GPIO_GPACSEL2_GPIO10_S 8U +#define GPIO_GPACSEL2_GPIO10_M 0xF00U // GPIO10 Master CPU Select +#define GPIO_GPACSEL2_GPIO11_S 12U +#define GPIO_GPACSEL2_GPIO11_M 0xF000U // GPIO11 Master CPU Select +#define GPIO_GPACSEL2_GPIO12_S 16U +#define GPIO_GPACSEL2_GPIO12_M 0xF0000U // GPIO12 Master CPU Select +#define GPIO_GPACSEL2_GPIO13_S 20U +#define GPIO_GPACSEL2_GPIO13_M 0xF00000U // GPIO13 Master CPU Select +#define GPIO_GPACSEL2_GPIO14_S 24U +#define GPIO_GPACSEL2_GPIO14_M 0xF000000U // GPIO14 Master CPU Select +#define GPIO_GPACSEL2_GPIO15_S 28U +#define GPIO_GPACSEL2_GPIO15_M 0xF0000000U // GPIO15 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL3 register +// +//************************************************************************************************* +#define GPIO_GPACSEL3_GPIO16_S 0U +#define GPIO_GPACSEL3_GPIO16_M 0xFU // GPIO16 Master CPU Select +#define GPIO_GPACSEL3_GPIO17_S 4U +#define GPIO_GPACSEL3_GPIO17_M 0xF0U // GPIO17 Master CPU Select +#define GPIO_GPACSEL3_GPIO18_S 8U +#define GPIO_GPACSEL3_GPIO18_M 0xF00U // GPIO18 Master CPU Select +#define GPIO_GPACSEL3_GPIO19_S 12U +#define GPIO_GPACSEL3_GPIO19_M 0xF000U // GPIO19 Master CPU Select +#define GPIO_GPACSEL3_GPIO20_S 16U +#define GPIO_GPACSEL3_GPIO20_M 0xF0000U // GPIO20 Master CPU Select +#define GPIO_GPACSEL3_GPIO21_S 20U +#define GPIO_GPACSEL3_GPIO21_M 0xF00000U // GPIO21 Master CPU Select +#define GPIO_GPACSEL3_GPIO22_S 24U +#define GPIO_GPACSEL3_GPIO22_M 0xF000000U // GPIO22 Master CPU Select +#define GPIO_GPACSEL3_GPIO23_S 28U +#define GPIO_GPACSEL3_GPIO23_M 0xF0000000U // GPIO23 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL4 register +// +//************************************************************************************************* +#define GPIO_GPACSEL4_GPIO24_S 0U +#define GPIO_GPACSEL4_GPIO24_M 0xFU // GPIO24 Master CPU Select +#define GPIO_GPACSEL4_GPIO25_S 4U +#define GPIO_GPACSEL4_GPIO25_M 0xF0U // GPIO25 Master CPU Select +#define GPIO_GPACSEL4_GPIO26_S 8U +#define GPIO_GPACSEL4_GPIO26_M 0xF00U // GPIO26 Master CPU Select +#define GPIO_GPACSEL4_GPIO27_S 12U +#define GPIO_GPACSEL4_GPIO27_M 0xF000U // GPIO27 Master CPU Select +#define GPIO_GPACSEL4_GPIO28_S 16U +#define GPIO_GPACSEL4_GPIO28_M 0xF0000U // GPIO28 Master CPU Select +#define GPIO_GPACSEL4_GPIO29_S 20U +#define GPIO_GPACSEL4_GPIO29_M 0xF00000U // GPIO29 Master CPU Select +#define GPIO_GPACSEL4_GPIO30_S 24U +#define GPIO_GPACSEL4_GPIO30_M 0xF000000U // GPIO30 Master CPU Select +#define GPIO_GPACSEL4_GPIO31_S 28U +#define GPIO_GPACSEL4_GPIO31_M 0xF0000000U // GPIO31 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPALOCK register +// +//************************************************************************************************* +#define GPIO_GPALOCK_GPIO0 0x1U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO1 0x2U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO2 0x4U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO3 0x8U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO4 0x10U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO5 0x20U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO6 0x40U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO7 0x80U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO8 0x100U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO9 0x200U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO10 0x400U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO11 0x800U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO12 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO13 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO14 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO15 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO16 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO17 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO18 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO19 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO20 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO21 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO22 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO23 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO24 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO25 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO26 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO27 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO28 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO29 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO30 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO31 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACR register +// +//************************************************************************************************* +#define GPIO_GPACR_GPIO0 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO1 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO2 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO3 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO4 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO5 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO6 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO7 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO8 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO9 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO10 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO11 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO12 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO13 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO14 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO15 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO16 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO17 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO18 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO19 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO20 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO21 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO22 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO23 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO24 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO25 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO26 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO27 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO28 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO29 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO30 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO31 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCTRL register +// +//************************************************************************************************* +#define GPIO_GPBCTRL_QUALPRD0_S 0U +#define GPIO_GPBCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO32 to + // GPIO39 +#define GPIO_GPBCTRL_QUALPRD1_S 8U +#define GPIO_GPBCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO40 to + // GPIO47 +#define GPIO_GPBCTRL_QUALPRD2_S 16U +#define GPIO_GPBCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO48 to + // GPIO55 +#define GPIO_GPBCTRL_QUALPRD3_S 24U +#define GPIO_GPBCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO56 to + // GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPBQSEL1_GPIO32_S 0U +#define GPIO_GPBQSEL1_GPIO32_M 0x3U // Select input qualification type for GPIO32 +#define GPIO_GPBQSEL1_GPIO33_S 2U +#define GPIO_GPBQSEL1_GPIO33_M 0xCU // Select input qualification type for GPIO33 +#define GPIO_GPBQSEL1_GPIO34_S 4U +#define GPIO_GPBQSEL1_GPIO34_M 0x30U // Select input qualification type for GPIO34 +#define GPIO_GPBQSEL1_GPIO35_S 6U +#define GPIO_GPBQSEL1_GPIO35_M 0xC0U // Select input qualification type for GPIO35 +#define GPIO_GPBQSEL1_GPIO36_S 8U +#define GPIO_GPBQSEL1_GPIO36_M 0x300U // Select input qualification type for GPIO36 +#define GPIO_GPBQSEL1_GPIO37_S 10U +#define GPIO_GPBQSEL1_GPIO37_M 0xC00U // Select input qualification type for GPIO37 +#define GPIO_GPBQSEL1_GPIO38_S 12U +#define GPIO_GPBQSEL1_GPIO38_M 0x3000U // Select input qualification type for GPIO38 +#define GPIO_GPBQSEL1_GPIO39_S 14U +#define GPIO_GPBQSEL1_GPIO39_M 0xC000U // Select input qualification type for GPIO39 +#define GPIO_GPBQSEL1_GPIO40_S 16U +#define GPIO_GPBQSEL1_GPIO40_M 0x30000U // Select input qualification type for GPIO40 +#define GPIO_GPBQSEL1_GPIO41_S 18U +#define GPIO_GPBQSEL1_GPIO41_M 0xC0000U // Select input qualification type for GPIO41 +#define GPIO_GPBQSEL1_GPIO42_S 20U +#define GPIO_GPBQSEL1_GPIO42_M 0x300000U // Select input qualification type for GPIO42 +#define GPIO_GPBQSEL1_GPIO43_S 22U +#define GPIO_GPBQSEL1_GPIO43_M 0xC00000U // Select input qualification type for GPIO43 +#define GPIO_GPBQSEL1_GPIO44_S 24U +#define GPIO_GPBQSEL1_GPIO44_M 0x3000000U // Select input qualification type for GPIO44 +#define GPIO_GPBQSEL1_GPIO45_S 26U +#define GPIO_GPBQSEL1_GPIO45_M 0xC000000U // Select input qualification type for GPIO45 +#define GPIO_GPBQSEL1_GPIO46_S 28U +#define GPIO_GPBQSEL1_GPIO46_M 0x30000000U // Select input qualification type for GPIO46 +#define GPIO_GPBQSEL1_GPIO47_S 30U +#define GPIO_GPBQSEL1_GPIO47_M 0xC0000000U // Select input qualification type for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPBQSEL2_GPIO48_S 0U +#define GPIO_GPBQSEL2_GPIO48_M 0x3U // Select input qualification type for GPIO48 +#define GPIO_GPBQSEL2_GPIO49_S 2U +#define GPIO_GPBQSEL2_GPIO49_M 0xCU // Select input qualification type for GPIO49 +#define GPIO_GPBQSEL2_GPIO50_S 4U +#define GPIO_GPBQSEL2_GPIO50_M 0x30U // Select input qualification type for GPIO50 +#define GPIO_GPBQSEL2_GPIO51_S 6U +#define GPIO_GPBQSEL2_GPIO51_M 0xC0U // Select input qualification type for GPIO51 +#define GPIO_GPBQSEL2_GPIO52_S 8U +#define GPIO_GPBQSEL2_GPIO52_M 0x300U // Select input qualification type for GPIO52 +#define GPIO_GPBQSEL2_GPIO53_S 10U +#define GPIO_GPBQSEL2_GPIO53_M 0xC00U // Select input qualification type for GPIO53 +#define GPIO_GPBQSEL2_GPIO54_S 12U +#define GPIO_GPBQSEL2_GPIO54_M 0x3000U // Select input qualification type for GPIO54 +#define GPIO_GPBQSEL2_GPIO55_S 14U +#define GPIO_GPBQSEL2_GPIO55_M 0xC000U // Select input qualification type for GPIO55 +#define GPIO_GPBQSEL2_GPIO56_S 16U +#define GPIO_GPBQSEL2_GPIO56_M 0x30000U // Select input qualification type for GPIO56 +#define GPIO_GPBQSEL2_GPIO57_S 18U +#define GPIO_GPBQSEL2_GPIO57_M 0xC0000U // Select input qualification type for GPIO57 +#define GPIO_GPBQSEL2_GPIO58_S 20U +#define GPIO_GPBQSEL2_GPIO58_M 0x300000U // Select input qualification type for GPIO58 +#define GPIO_GPBQSEL2_GPIO59_S 22U +#define GPIO_GPBQSEL2_GPIO59_M 0xC00000U // Select input qualification type for GPIO59 +#define GPIO_GPBQSEL2_GPIO60_S 24U +#define GPIO_GPBQSEL2_GPIO60_M 0x3000000U // Select input qualification type for GPIO60 +#define GPIO_GPBQSEL2_GPIO61_S 26U +#define GPIO_GPBQSEL2_GPIO61_M 0xC000000U // Select input qualification type for GPIO61 +#define GPIO_GPBQSEL2_GPIO62_S 28U +#define GPIO_GPBQSEL2_GPIO62_M 0x30000000U // Select input qualification type for GPIO62 +#define GPIO_GPBQSEL2_GPIO63_S 30U +#define GPIO_GPBQSEL2_GPIO63_M 0xC0000000U // Select input qualification type for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBMUX1 register +// +//************************************************************************************************* +#define GPIO_GPBMUX1_GPIO32_S 0U +#define GPIO_GPBMUX1_GPIO32_M 0x3U // Defines pin-muxing selection for GPIO32 +#define GPIO_GPBMUX1_GPIO33_S 2U +#define GPIO_GPBMUX1_GPIO33_M 0xCU // Defines pin-muxing selection for GPIO33 +#define GPIO_GPBMUX1_GPIO34_S 4U +#define GPIO_GPBMUX1_GPIO34_M 0x30U // Defines pin-muxing selection for GPIO34 +#define GPIO_GPBMUX1_GPIO35_S 6U +#define GPIO_GPBMUX1_GPIO35_M 0xC0U // Defines pin-muxing selection for GPIO35 +#define GPIO_GPBMUX1_GPIO36_S 8U +#define GPIO_GPBMUX1_GPIO36_M 0x300U // Defines pin-muxing selection for GPIO36 +#define GPIO_GPBMUX1_GPIO37_S 10U +#define GPIO_GPBMUX1_GPIO37_M 0xC00U // Defines pin-muxing selection for GPIO37 +#define GPIO_GPBMUX1_GPIO38_S 12U +#define GPIO_GPBMUX1_GPIO38_M 0x3000U // Defines pin-muxing selection for GPIO38 +#define GPIO_GPBMUX1_GPIO39_S 14U +#define GPIO_GPBMUX1_GPIO39_M 0xC000U // Defines pin-muxing selection for GPIO39 +#define GPIO_GPBMUX1_GPIO40_S 16U +#define GPIO_GPBMUX1_GPIO40_M 0x30000U // Defines pin-muxing selection for GPIO40 +#define GPIO_GPBMUX1_GPIO41_S 18U +#define GPIO_GPBMUX1_GPIO41_M 0xC0000U // Defines pin-muxing selection for GPIO41 +#define GPIO_GPBMUX1_GPIO42_S 20U +#define GPIO_GPBMUX1_GPIO42_M 0x300000U // Defines pin-muxing selection for GPIO42 +#define GPIO_GPBMUX1_GPIO43_S 22U +#define GPIO_GPBMUX1_GPIO43_M 0xC00000U // Defines pin-muxing selection for GPIO43 +#define GPIO_GPBMUX1_GPIO44_S 24U +#define GPIO_GPBMUX1_GPIO44_M 0x3000000U // Defines pin-muxing selection for GPIO44 +#define GPIO_GPBMUX1_GPIO45_S 26U +#define GPIO_GPBMUX1_GPIO45_M 0xC000000U // Defines pin-muxing selection for GPIO45 +#define GPIO_GPBMUX1_GPIO46_S 28U +#define GPIO_GPBMUX1_GPIO46_M 0x30000000U // Defines pin-muxing selection for GPIO46 +#define GPIO_GPBMUX1_GPIO47_S 30U +#define GPIO_GPBMUX1_GPIO47_M 0xC0000000U // Defines pin-muxing selection for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBMUX2 register +// +//************************************************************************************************* +#define GPIO_GPBMUX2_GPIO48_S 0U +#define GPIO_GPBMUX2_GPIO48_M 0x3U // Defines pin-muxing selection for GPIO48 +#define GPIO_GPBMUX2_GPIO49_S 2U +#define GPIO_GPBMUX2_GPIO49_M 0xCU // Defines pin-muxing selection for GPIO49 +#define GPIO_GPBMUX2_GPIO50_S 4U +#define GPIO_GPBMUX2_GPIO50_M 0x30U // Defines pin-muxing selection for GPIO50 +#define GPIO_GPBMUX2_GPIO51_S 6U +#define GPIO_GPBMUX2_GPIO51_M 0xC0U // Defines pin-muxing selection for GPIO51 +#define GPIO_GPBMUX2_GPIO52_S 8U +#define GPIO_GPBMUX2_GPIO52_M 0x300U // Defines pin-muxing selection for GPIO52 +#define GPIO_GPBMUX2_GPIO53_S 10U +#define GPIO_GPBMUX2_GPIO53_M 0xC00U // Defines pin-muxing selection for GPIO53 +#define GPIO_GPBMUX2_GPIO54_S 12U +#define GPIO_GPBMUX2_GPIO54_M 0x3000U // Defines pin-muxing selection for GPIO54 +#define GPIO_GPBMUX2_GPIO55_S 14U +#define GPIO_GPBMUX2_GPIO55_M 0xC000U // Defines pin-muxing selection for GPIO55 +#define GPIO_GPBMUX2_GPIO56_S 16U +#define GPIO_GPBMUX2_GPIO56_M 0x30000U // Defines pin-muxing selection for GPIO56 +#define GPIO_GPBMUX2_GPIO57_S 18U +#define GPIO_GPBMUX2_GPIO57_M 0xC0000U // Defines pin-muxing selection for GPIO57 +#define GPIO_GPBMUX2_GPIO58_S 20U +#define GPIO_GPBMUX2_GPIO58_M 0x300000U // Defines pin-muxing selection for GPIO58 +#define GPIO_GPBMUX2_GPIO59_S 22U +#define GPIO_GPBMUX2_GPIO59_M 0xC00000U // Defines pin-muxing selection for GPIO59 +#define GPIO_GPBMUX2_GPIO60_S 24U +#define GPIO_GPBMUX2_GPIO60_M 0x3000000U // Defines pin-muxing selection for GPIO60 +#define GPIO_GPBMUX2_GPIO61_S 26U +#define GPIO_GPBMUX2_GPIO61_M 0xC000000U // Defines pin-muxing selection for GPIO61 +#define GPIO_GPBMUX2_GPIO62_S 28U +#define GPIO_GPBMUX2_GPIO62_M 0x30000000U // Defines pin-muxing selection for GPIO62 +#define GPIO_GPBMUX2_GPIO63_S 30U +#define GPIO_GPBMUX2_GPIO63_M 0xC0000000U // Defines pin-muxing selection for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBDIR register +// +//************************************************************************************************* +#define GPIO_GPBDIR_GPIO32 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO33 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO34 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO35 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO36 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO37 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO38 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO39 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO40 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO41 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO42 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO43 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO44 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO45 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO46 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO47 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO48 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO49 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO50 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO51 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO52 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO53 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO54 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO55 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO56 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO57 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO58 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO59 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO60 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO61 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO62 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO63 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBPUD register +// +//************************************************************************************************* +#define GPIO_GPBPUD_GPIO32 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO33 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO34 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO35 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO36 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO37 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO38 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO39 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO40 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO41 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO42 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO43 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO44 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO45 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO46 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO47 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO48 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO49 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO50 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO51 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO52 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO53 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO54 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO55 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO56 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO57 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO58 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO59 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO60 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO61 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO62 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO63 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBINV register +// +//************************************************************************************************* +#define GPIO_GPBINV_GPIO32 0x1U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO33 0x2U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO34 0x4U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO35 0x8U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO36 0x10U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO37 0x20U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO38 0x40U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO39 0x80U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO40 0x100U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO41 0x200U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO42 0x400U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO43 0x800U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO44 0x1000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO45 0x2000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO46 0x4000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO47 0x8000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO48 0x10000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO49 0x20000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO50 0x40000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO51 0x80000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO52 0x100000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO53 0x200000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO54 0x400000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO55 0x800000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO56 0x1000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO57 0x2000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO58 0x4000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO59 0x8000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO60 0x10000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO61 0x20000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO62 0x40000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO63 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBODR register +// +//************************************************************************************************* +#define GPIO_GPBODR_GPIO32 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO33 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO34 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO35 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO36 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO37 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO38 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO39 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO40 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO41 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO42 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO43 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO44 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO45 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO46 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO47 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO48 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO49 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO50 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO51 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO52 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO53 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO54 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO55 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO56 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO57 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO58 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO59 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO60 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO61 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO62 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO63 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBAMSEL register +// +//************************************************************************************************* +#define GPIO_GPBAMSEL_GPIO42 0x400U // Analog Mode select for this pin +#define GPIO_GPBAMSEL_GPIO43 0x800U // Analog Mode select for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPBGMUX1_GPIO32_S 0U +#define GPIO_GPBGMUX1_GPIO32_M 0x3U // Defines pin-muxing selection for GPIO32 +#define GPIO_GPBGMUX1_GPIO33_S 2U +#define GPIO_GPBGMUX1_GPIO33_M 0xCU // Defines pin-muxing selection for GPIO33 +#define GPIO_GPBGMUX1_GPIO34_S 4U +#define GPIO_GPBGMUX1_GPIO34_M 0x30U // Defines pin-muxing selection for GPIO34 +#define GPIO_GPBGMUX1_GPIO35_S 6U +#define GPIO_GPBGMUX1_GPIO35_M 0xC0U // Defines pin-muxing selection for GPIO35 +#define GPIO_GPBGMUX1_GPIO36_S 8U +#define GPIO_GPBGMUX1_GPIO36_M 0x300U // Defines pin-muxing selection for GPIO36 +#define GPIO_GPBGMUX1_GPIO37_S 10U +#define GPIO_GPBGMUX1_GPIO37_M 0xC00U // Defines pin-muxing selection for GPIO37 +#define GPIO_GPBGMUX1_GPIO38_S 12U +#define GPIO_GPBGMUX1_GPIO38_M 0x3000U // Defines pin-muxing selection for GPIO38 +#define GPIO_GPBGMUX1_GPIO39_S 14U +#define GPIO_GPBGMUX1_GPIO39_M 0xC000U // Defines pin-muxing selection for GPIO39 +#define GPIO_GPBGMUX1_GPIO40_S 16U +#define GPIO_GPBGMUX1_GPIO40_M 0x30000U // Defines pin-muxing selection for GPIO40 +#define GPIO_GPBGMUX1_GPIO41_S 18U +#define GPIO_GPBGMUX1_GPIO41_M 0xC0000U // Defines pin-muxing selection for GPIO41 +#define GPIO_GPBGMUX1_GPIO42_S 20U +#define GPIO_GPBGMUX1_GPIO42_M 0x300000U // Defines pin-muxing selection for GPIO42 +#define GPIO_GPBGMUX1_GPIO43_S 22U +#define GPIO_GPBGMUX1_GPIO43_M 0xC00000U // Defines pin-muxing selection for GPIO43 +#define GPIO_GPBGMUX1_GPIO44_S 24U +#define GPIO_GPBGMUX1_GPIO44_M 0x3000000U // Defines pin-muxing selection for GPIO44 +#define GPIO_GPBGMUX1_GPIO45_S 26U +#define GPIO_GPBGMUX1_GPIO45_M 0xC000000U // Defines pin-muxing selection for GPIO45 +#define GPIO_GPBGMUX1_GPIO46_S 28U +#define GPIO_GPBGMUX1_GPIO46_M 0x30000000U // Defines pin-muxing selection for GPIO46 +#define GPIO_GPBGMUX1_GPIO47_S 30U +#define GPIO_GPBGMUX1_GPIO47_M 0xC0000000U // Defines pin-muxing selection for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPBGMUX2_GPIO48_S 0U +#define GPIO_GPBGMUX2_GPIO48_M 0x3U // Defines pin-muxing selection for GPIO48 +#define GPIO_GPBGMUX2_GPIO49_S 2U +#define GPIO_GPBGMUX2_GPIO49_M 0xCU // Defines pin-muxing selection for GPIO49 +#define GPIO_GPBGMUX2_GPIO50_S 4U +#define GPIO_GPBGMUX2_GPIO50_M 0x30U // Defines pin-muxing selection for GPIO50 +#define GPIO_GPBGMUX2_GPIO51_S 6U +#define GPIO_GPBGMUX2_GPIO51_M 0xC0U // Defines pin-muxing selection for GPIO51 +#define GPIO_GPBGMUX2_GPIO52_S 8U +#define GPIO_GPBGMUX2_GPIO52_M 0x300U // Defines pin-muxing selection for GPIO52 +#define GPIO_GPBGMUX2_GPIO53_S 10U +#define GPIO_GPBGMUX2_GPIO53_M 0xC00U // Defines pin-muxing selection for GPIO53 +#define GPIO_GPBGMUX2_GPIO54_S 12U +#define GPIO_GPBGMUX2_GPIO54_M 0x3000U // Defines pin-muxing selection for GPIO54 +#define GPIO_GPBGMUX2_GPIO55_S 14U +#define GPIO_GPBGMUX2_GPIO55_M 0xC000U // Defines pin-muxing selection for GPIO55 +#define GPIO_GPBGMUX2_GPIO56_S 16U +#define GPIO_GPBGMUX2_GPIO56_M 0x30000U // Defines pin-muxing selection for GPIO56 +#define GPIO_GPBGMUX2_GPIO57_S 18U +#define GPIO_GPBGMUX2_GPIO57_M 0xC0000U // Defines pin-muxing selection for GPIO57 +#define GPIO_GPBGMUX2_GPIO58_S 20U +#define GPIO_GPBGMUX2_GPIO58_M 0x300000U // Defines pin-muxing selection for GPIO58 +#define GPIO_GPBGMUX2_GPIO59_S 22U +#define GPIO_GPBGMUX2_GPIO59_M 0xC00000U // Defines pin-muxing selection for GPIO59 +#define GPIO_GPBGMUX2_GPIO60_S 24U +#define GPIO_GPBGMUX2_GPIO60_M 0x3000000U // Defines pin-muxing selection for GPIO60 +#define GPIO_GPBGMUX2_GPIO61_S 26U +#define GPIO_GPBGMUX2_GPIO61_M 0xC000000U // Defines pin-muxing selection for GPIO61 +#define GPIO_GPBGMUX2_GPIO62_S 28U +#define GPIO_GPBGMUX2_GPIO62_M 0x30000000U // Defines pin-muxing selection for GPIO62 +#define GPIO_GPBGMUX2_GPIO63_S 30U +#define GPIO_GPBGMUX2_GPIO63_M 0xC0000000U // Defines pin-muxing selection for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL1_GPIO32_S 0U +#define GPIO_GPBCSEL1_GPIO32_M 0xFU // GPIO32 Master CPU Select +#define GPIO_GPBCSEL1_GPIO33_S 4U +#define GPIO_GPBCSEL1_GPIO33_M 0xF0U // GPIO33 Master CPU Select +#define GPIO_GPBCSEL1_GPIO34_S 8U +#define GPIO_GPBCSEL1_GPIO34_M 0xF00U // GPIO34 Master CPU Select +#define GPIO_GPBCSEL1_GPIO35_S 12U +#define GPIO_GPBCSEL1_GPIO35_M 0xF000U // GPIO35 Master CPU Select +#define GPIO_GPBCSEL1_GPIO36_S 16U +#define GPIO_GPBCSEL1_GPIO36_M 0xF0000U // GPIO36 Master CPU Select +#define GPIO_GPBCSEL1_GPIO37_S 20U +#define GPIO_GPBCSEL1_GPIO37_M 0xF00000U // GPIO37 Master CPU Select +#define GPIO_GPBCSEL1_GPIO38_S 24U +#define GPIO_GPBCSEL1_GPIO38_M 0xF000000U // GPIO38 Master CPU Select +#define GPIO_GPBCSEL1_GPIO39_S 28U +#define GPIO_GPBCSEL1_GPIO39_M 0xF0000000U // GPIO39 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL2_GPIO40_S 0U +#define GPIO_GPBCSEL2_GPIO40_M 0xFU // GPIO40 Master CPU Select +#define GPIO_GPBCSEL2_GPIO41_S 4U +#define GPIO_GPBCSEL2_GPIO41_M 0xF0U // GPIO41 Master CPU Select +#define GPIO_GPBCSEL2_GPIO42_S 8U +#define GPIO_GPBCSEL2_GPIO42_M 0xF00U // GPIO42 Master CPU Select +#define GPIO_GPBCSEL2_GPIO43_S 12U +#define GPIO_GPBCSEL2_GPIO43_M 0xF000U // GPIO43 Master CPU Select +#define GPIO_GPBCSEL2_GPIO44_S 16U +#define GPIO_GPBCSEL2_GPIO44_M 0xF0000U // GPIO44 Master CPU Select +#define GPIO_GPBCSEL2_GPIO45_S 20U +#define GPIO_GPBCSEL2_GPIO45_M 0xF00000U // GPIO45 Master CPU Select +#define GPIO_GPBCSEL2_GPIO46_S 24U +#define GPIO_GPBCSEL2_GPIO46_M 0xF000000U // GPIO46 Master CPU Select +#define GPIO_GPBCSEL2_GPIO47_S 28U +#define GPIO_GPBCSEL2_GPIO47_M 0xF0000000U // GPIO47 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL3_GPIO48_S 0U +#define GPIO_GPBCSEL3_GPIO48_M 0xFU // GPIO48 Master CPU Select +#define GPIO_GPBCSEL3_GPIO49_S 4U +#define GPIO_GPBCSEL3_GPIO49_M 0xF0U // GPIO49 Master CPU Select +#define GPIO_GPBCSEL3_GPIO50_S 8U +#define GPIO_GPBCSEL3_GPIO50_M 0xF00U // GPIO50 Master CPU Select +#define GPIO_GPBCSEL3_GPIO51_S 12U +#define GPIO_GPBCSEL3_GPIO51_M 0xF000U // GPIO51 Master CPU Select +#define GPIO_GPBCSEL3_GPIO52_S 16U +#define GPIO_GPBCSEL3_GPIO52_M 0xF0000U // GPIO52 Master CPU Select +#define GPIO_GPBCSEL3_GPIO53_S 20U +#define GPIO_GPBCSEL3_GPIO53_M 0xF00000U // GPIO53 Master CPU Select +#define GPIO_GPBCSEL3_GPIO54_S 24U +#define GPIO_GPBCSEL3_GPIO54_M 0xF000000U // GPIO54 Master CPU Select +#define GPIO_GPBCSEL3_GPIO55_S 28U +#define GPIO_GPBCSEL3_GPIO55_M 0xF0000000U // GPIO55 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL4_GPIO56_S 0U +#define GPIO_GPBCSEL4_GPIO56_M 0xFU // GPIO56 Master CPU Select +#define GPIO_GPBCSEL4_GPIO57_S 4U +#define GPIO_GPBCSEL4_GPIO57_M 0xF0U // GPIO57 Master CPU Select +#define GPIO_GPBCSEL4_GPIO58_S 8U +#define GPIO_GPBCSEL4_GPIO58_M 0xF00U // GPIO58 Master CPU Select +#define GPIO_GPBCSEL4_GPIO59_S 12U +#define GPIO_GPBCSEL4_GPIO59_M 0xF000U // GPIO59 Master CPU Select +#define GPIO_GPBCSEL4_GPIO60_S 16U +#define GPIO_GPBCSEL4_GPIO60_M 0xF0000U // GPIO60 Master CPU Select +#define GPIO_GPBCSEL4_GPIO61_S 20U +#define GPIO_GPBCSEL4_GPIO61_M 0xF00000U // GPIO61 Master CPU Select +#define GPIO_GPBCSEL4_GPIO62_S 24U +#define GPIO_GPBCSEL4_GPIO62_M 0xF000000U // GPIO62 Master CPU Select +#define GPIO_GPBCSEL4_GPIO63_S 28U +#define GPIO_GPBCSEL4_GPIO63_M 0xF0000000U // GPIO63 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBLOCK register +// +//************************************************************************************************* +#define GPIO_GPBLOCK_GPIO32 0x1U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO33 0x2U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO34 0x4U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO35 0x8U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO36 0x10U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO37 0x20U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO38 0x40U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO39 0x80U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO40 0x100U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO41 0x200U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO42 0x400U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO43 0x800U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO44 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO45 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO46 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO47 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO48 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO49 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO50 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO51 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO52 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO53 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO54 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO55 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO56 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO57 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO58 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO59 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO60 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO61 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO62 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO63 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCR register +// +//************************************************************************************************* +#define GPIO_GPBCR_GPIO32 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO33 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO34 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO35 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO36 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO37 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO38 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO39 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO40 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO41 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO42 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO43 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO44 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO45 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO46 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO47 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO48 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO49 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO50 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO51 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO52 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO53 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO54 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO55 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO56 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO57 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO58 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO59 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO60 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO61 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO62 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO63 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCTRL register +// +//************************************************************************************************* +#define GPIO_GPCCTRL_QUALPRD0_S 0U +#define GPIO_GPCCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO64 to + // GPIO71 +#define GPIO_GPCCTRL_QUALPRD1_S 8U +#define GPIO_GPCCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO72 to + // GPIO79 +#define GPIO_GPCCTRL_QUALPRD2_S 16U +#define GPIO_GPCCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO80 to + // GPIO87 +#define GPIO_GPCCTRL_QUALPRD3_S 24U +#define GPIO_GPCCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO88 to + // GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPCQSEL1_GPIO64_S 0U +#define GPIO_GPCQSEL1_GPIO64_M 0x3U // Select input qualification type for GPIO64 +#define GPIO_GPCQSEL1_GPIO65_S 2U +#define GPIO_GPCQSEL1_GPIO65_M 0xCU // Select input qualification type for GPIO65 +#define GPIO_GPCQSEL1_GPIO66_S 4U +#define GPIO_GPCQSEL1_GPIO66_M 0x30U // Select input qualification type for GPIO66 +#define GPIO_GPCQSEL1_GPIO67_S 6U +#define GPIO_GPCQSEL1_GPIO67_M 0xC0U // Select input qualification type for GPIO67 +#define GPIO_GPCQSEL1_GPIO68_S 8U +#define GPIO_GPCQSEL1_GPIO68_M 0x300U // Select input qualification type for GPIO68 +#define GPIO_GPCQSEL1_GPIO69_S 10U +#define GPIO_GPCQSEL1_GPIO69_M 0xC00U // Select input qualification type for GPIO69 +#define GPIO_GPCQSEL1_GPIO70_S 12U +#define GPIO_GPCQSEL1_GPIO70_M 0x3000U // Select input qualification type for GPIO70 +#define GPIO_GPCQSEL1_GPIO71_S 14U +#define GPIO_GPCQSEL1_GPIO71_M 0xC000U // Select input qualification type for GPIO71 +#define GPIO_GPCQSEL1_GPIO72_S 16U +#define GPIO_GPCQSEL1_GPIO72_M 0x30000U // Select input qualification type for GPIO72 +#define GPIO_GPCQSEL1_GPIO73_S 18U +#define GPIO_GPCQSEL1_GPIO73_M 0xC0000U // Select input qualification type for GPIO73 +#define GPIO_GPCQSEL1_GPIO74_S 20U +#define GPIO_GPCQSEL1_GPIO74_M 0x300000U // Select input qualification type for GPIO74 +#define GPIO_GPCQSEL1_GPIO75_S 22U +#define GPIO_GPCQSEL1_GPIO75_M 0xC00000U // Select input qualification type for GPIO75 +#define GPIO_GPCQSEL1_GPIO76_S 24U +#define GPIO_GPCQSEL1_GPIO76_M 0x3000000U // Select input qualification type for GPIO76 +#define GPIO_GPCQSEL1_GPIO77_S 26U +#define GPIO_GPCQSEL1_GPIO77_M 0xC000000U // Select input qualification type for GPIO77 +#define GPIO_GPCQSEL1_GPIO78_S 28U +#define GPIO_GPCQSEL1_GPIO78_M 0x30000000U // Select input qualification type for GPIO78 +#define GPIO_GPCQSEL1_GPIO79_S 30U +#define GPIO_GPCQSEL1_GPIO79_M 0xC0000000U // Select input qualification type for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPCQSEL2_GPIO80_S 0U +#define GPIO_GPCQSEL2_GPIO80_M 0x3U // Select input qualification type for GPIO80 +#define GPIO_GPCQSEL2_GPIO81_S 2U +#define GPIO_GPCQSEL2_GPIO81_M 0xCU // Select input qualification type for GPIO81 +#define GPIO_GPCQSEL2_GPIO82_S 4U +#define GPIO_GPCQSEL2_GPIO82_M 0x30U // Select input qualification type for GPIO82 +#define GPIO_GPCQSEL2_GPIO83_S 6U +#define GPIO_GPCQSEL2_GPIO83_M 0xC0U // Select input qualification type for GPIO83 +#define GPIO_GPCQSEL2_GPIO84_S 8U +#define GPIO_GPCQSEL2_GPIO84_M 0x300U // Select input qualification type for GPIO84 +#define GPIO_GPCQSEL2_GPIO85_S 10U +#define GPIO_GPCQSEL2_GPIO85_M 0xC00U // Select input qualification type for GPIO85 +#define GPIO_GPCQSEL2_GPIO86_S 12U +#define GPIO_GPCQSEL2_GPIO86_M 0x3000U // Select input qualification type for GPIO86 +#define GPIO_GPCQSEL2_GPIO87_S 14U +#define GPIO_GPCQSEL2_GPIO87_M 0xC000U // Select input qualification type for GPIO87 +#define GPIO_GPCQSEL2_GPIO88_S 16U +#define GPIO_GPCQSEL2_GPIO88_M 0x30000U // Select input qualification type for GPIO88 +#define GPIO_GPCQSEL2_GPIO89_S 18U +#define GPIO_GPCQSEL2_GPIO89_M 0xC0000U // Select input qualification type for GPIO89 +#define GPIO_GPCQSEL2_GPIO90_S 20U +#define GPIO_GPCQSEL2_GPIO90_M 0x300000U // Select input qualification type for GPIO90 +#define GPIO_GPCQSEL2_GPIO91_S 22U +#define GPIO_GPCQSEL2_GPIO91_M 0xC00000U // Select input qualification type for GPIO91 +#define GPIO_GPCQSEL2_GPIO92_S 24U +#define GPIO_GPCQSEL2_GPIO92_M 0x3000000U // Select input qualification type for GPIO92 +#define GPIO_GPCQSEL2_GPIO93_S 26U +#define GPIO_GPCQSEL2_GPIO93_M 0xC000000U // Select input qualification type for GPIO93 +#define GPIO_GPCQSEL2_GPIO94_S 28U +#define GPIO_GPCQSEL2_GPIO94_M 0x30000000U // Select input qualification type for GPIO94 +#define GPIO_GPCQSEL2_GPIO95_S 30U +#define GPIO_GPCQSEL2_GPIO95_M 0xC0000000U // Select input qualification type for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCMUX1 register +// +//************************************************************************************************* +#define GPIO_GPCMUX1_GPIO64_S 0U +#define GPIO_GPCMUX1_GPIO64_M 0x3U // Defines pin-muxing selection for GPIO64 +#define GPIO_GPCMUX1_GPIO65_S 2U +#define GPIO_GPCMUX1_GPIO65_M 0xCU // Defines pin-muxing selection for GPIO65 +#define GPIO_GPCMUX1_GPIO66_S 4U +#define GPIO_GPCMUX1_GPIO66_M 0x30U // Defines pin-muxing selection for GPIO66 +#define GPIO_GPCMUX1_GPIO67_S 6U +#define GPIO_GPCMUX1_GPIO67_M 0xC0U // Defines pin-muxing selection for GPIO67 +#define GPIO_GPCMUX1_GPIO68_S 8U +#define GPIO_GPCMUX1_GPIO68_M 0x300U // Defines pin-muxing selection for GPIO68 +#define GPIO_GPCMUX1_GPIO69_S 10U +#define GPIO_GPCMUX1_GPIO69_M 0xC00U // Defines pin-muxing selection for GPIO69 +#define GPIO_GPCMUX1_GPIO70_S 12U +#define GPIO_GPCMUX1_GPIO70_M 0x3000U // Defines pin-muxing selection for GPIO70 +#define GPIO_GPCMUX1_GPIO71_S 14U +#define GPIO_GPCMUX1_GPIO71_M 0xC000U // Defines pin-muxing selection for GPIO71 +#define GPIO_GPCMUX1_GPIO72_S 16U +#define GPIO_GPCMUX1_GPIO72_M 0x30000U // Defines pin-muxing selection for GPIO72 +#define GPIO_GPCMUX1_GPIO73_S 18U +#define GPIO_GPCMUX1_GPIO73_M 0xC0000U // Defines pin-muxing selection for GPIO73 +#define GPIO_GPCMUX1_GPIO74_S 20U +#define GPIO_GPCMUX1_GPIO74_M 0x300000U // Defines pin-muxing selection for GPIO74 +#define GPIO_GPCMUX1_GPIO75_S 22U +#define GPIO_GPCMUX1_GPIO75_M 0xC00000U // Defines pin-muxing selection for GPIO75 +#define GPIO_GPCMUX1_GPIO76_S 24U +#define GPIO_GPCMUX1_GPIO76_M 0x3000000U // Defines pin-muxing selection for GPIO76 +#define GPIO_GPCMUX1_GPIO77_S 26U +#define GPIO_GPCMUX1_GPIO77_M 0xC000000U // Defines pin-muxing selection for GPIO77 +#define GPIO_GPCMUX1_GPIO78_S 28U +#define GPIO_GPCMUX1_GPIO78_M 0x30000000U // Defines pin-muxing selection for GPIO78 +#define GPIO_GPCMUX1_GPIO79_S 30U +#define GPIO_GPCMUX1_GPIO79_M 0xC0000000U // Defines pin-muxing selection for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCMUX2 register +// +//************************************************************************************************* +#define GPIO_GPCMUX2_GPIO80_S 0U +#define GPIO_GPCMUX2_GPIO80_M 0x3U // Defines pin-muxing selection for GPIO80 +#define GPIO_GPCMUX2_GPIO81_S 2U +#define GPIO_GPCMUX2_GPIO81_M 0xCU // Defines pin-muxing selection for GPIO81 +#define GPIO_GPCMUX2_GPIO82_S 4U +#define GPIO_GPCMUX2_GPIO82_M 0x30U // Defines pin-muxing selection for GPIO82 +#define GPIO_GPCMUX2_GPIO83_S 6U +#define GPIO_GPCMUX2_GPIO83_M 0xC0U // Defines pin-muxing selection for GPIO83 +#define GPIO_GPCMUX2_GPIO84_S 8U +#define GPIO_GPCMUX2_GPIO84_M 0x300U // Defines pin-muxing selection for GPIO84 +#define GPIO_GPCMUX2_GPIO85_S 10U +#define GPIO_GPCMUX2_GPIO85_M 0xC00U // Defines pin-muxing selection for GPIO85 +#define GPIO_GPCMUX2_GPIO86_S 12U +#define GPIO_GPCMUX2_GPIO86_M 0x3000U // Defines pin-muxing selection for GPIO86 +#define GPIO_GPCMUX2_GPIO87_S 14U +#define GPIO_GPCMUX2_GPIO87_M 0xC000U // Defines pin-muxing selection for GPIO87 +#define GPIO_GPCMUX2_GPIO88_S 16U +#define GPIO_GPCMUX2_GPIO88_M 0x30000U // Defines pin-muxing selection for GPIO88 +#define GPIO_GPCMUX2_GPIO89_S 18U +#define GPIO_GPCMUX2_GPIO89_M 0xC0000U // Defines pin-muxing selection for GPIO89 +#define GPIO_GPCMUX2_GPIO90_S 20U +#define GPIO_GPCMUX2_GPIO90_M 0x300000U // Defines pin-muxing selection for GPIO90 +#define GPIO_GPCMUX2_GPIO91_S 22U +#define GPIO_GPCMUX2_GPIO91_M 0xC00000U // Defines pin-muxing selection for GPIO91 +#define GPIO_GPCMUX2_GPIO92_S 24U +#define GPIO_GPCMUX2_GPIO92_M 0x3000000U // Defines pin-muxing selection for GPIO92 +#define GPIO_GPCMUX2_GPIO93_S 26U +#define GPIO_GPCMUX2_GPIO93_M 0xC000000U // Defines pin-muxing selection for GPIO93 +#define GPIO_GPCMUX2_GPIO94_S 28U +#define GPIO_GPCMUX2_GPIO94_M 0x30000000U // Defines pin-muxing selection for GPIO94 +#define GPIO_GPCMUX2_GPIO95_S 30U +#define GPIO_GPCMUX2_GPIO95_M 0xC0000000U // Defines pin-muxing selection for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCDIR register +// +//************************************************************************************************* +#define GPIO_GPCDIR_GPIO64 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO65 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO66 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO67 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO68 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO69 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO70 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO71 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO72 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO73 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO74 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO75 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO76 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO77 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO78 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO79 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO80 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO81 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO82 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO83 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO84 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO85 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO86 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO87 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO88 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO89 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO90 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO91 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO92 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO93 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO94 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO95 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCPUD register +// +//************************************************************************************************* +#define GPIO_GPCPUD_GPIO64 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO65 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO66 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO67 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO68 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO69 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO70 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO71 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO72 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO73 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO74 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO75 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO76 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO77 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO78 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO79 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO80 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO81 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO82 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO83 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO84 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO85 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO86 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO87 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO88 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO89 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO90 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO91 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO92 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO93 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO94 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO95 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCINV register +// +//************************************************************************************************* +#define GPIO_GPCINV_GPIO64 0x1U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO65 0x2U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO66 0x4U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO67 0x8U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO68 0x10U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO69 0x20U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO70 0x40U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO71 0x80U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO72 0x100U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO73 0x200U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO74 0x400U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO75 0x800U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO76 0x1000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO77 0x2000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO78 0x4000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO79 0x8000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO80 0x10000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO81 0x20000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO82 0x40000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO83 0x80000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO84 0x100000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO85 0x200000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO86 0x400000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO87 0x800000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO88 0x1000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO89 0x2000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO90 0x4000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO91 0x8000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO92 0x10000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO93 0x20000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO94 0x40000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO95 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCODR register +// +//************************************************************************************************* +#define GPIO_GPCODR_GPIO64 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO65 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO66 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO67 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO68 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO69 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO70 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO71 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO72 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO73 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO74 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO75 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO76 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO77 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO78 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO79 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO80 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO81 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO82 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO83 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO84 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO85 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO86 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO87 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO88 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO89 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO90 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO91 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO92 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO93 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO94 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO95 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPCGMUX1_GPIO64_S 0U +#define GPIO_GPCGMUX1_GPIO64_M 0x3U // Defines pin-muxing selection for GPIO64 +#define GPIO_GPCGMUX1_GPIO65_S 2U +#define GPIO_GPCGMUX1_GPIO65_M 0xCU // Defines pin-muxing selection for GPIO65 +#define GPIO_GPCGMUX1_GPIO66_S 4U +#define GPIO_GPCGMUX1_GPIO66_M 0x30U // Defines pin-muxing selection for GPIO66 +#define GPIO_GPCGMUX1_GPIO67_S 6U +#define GPIO_GPCGMUX1_GPIO67_M 0xC0U // Defines pin-muxing selection for GPIO67 +#define GPIO_GPCGMUX1_GPIO68_S 8U +#define GPIO_GPCGMUX1_GPIO68_M 0x300U // Defines pin-muxing selection for GPIO68 +#define GPIO_GPCGMUX1_GPIO69_S 10U +#define GPIO_GPCGMUX1_GPIO69_M 0xC00U // Defines pin-muxing selection for GPIO69 +#define GPIO_GPCGMUX1_GPIO70_S 12U +#define GPIO_GPCGMUX1_GPIO70_M 0x3000U // Defines pin-muxing selection for GPIO70 +#define GPIO_GPCGMUX1_GPIO71_S 14U +#define GPIO_GPCGMUX1_GPIO71_M 0xC000U // Defines pin-muxing selection for GPIO71 +#define GPIO_GPCGMUX1_GPIO72_S 16U +#define GPIO_GPCGMUX1_GPIO72_M 0x30000U // Defines pin-muxing selection for GPIO72 +#define GPIO_GPCGMUX1_GPIO73_S 18U +#define GPIO_GPCGMUX1_GPIO73_M 0xC0000U // Defines pin-muxing selection for GPIO73 +#define GPIO_GPCGMUX1_GPIO74_S 20U +#define GPIO_GPCGMUX1_GPIO74_M 0x300000U // Defines pin-muxing selection for GPIO74 +#define GPIO_GPCGMUX1_GPIO75_S 22U +#define GPIO_GPCGMUX1_GPIO75_M 0xC00000U // Defines pin-muxing selection for GPIO75 +#define GPIO_GPCGMUX1_GPIO76_S 24U +#define GPIO_GPCGMUX1_GPIO76_M 0x3000000U // Defines pin-muxing selection for GPIO76 +#define GPIO_GPCGMUX1_GPIO77_S 26U +#define GPIO_GPCGMUX1_GPIO77_M 0xC000000U // Defines pin-muxing selection for GPIO77 +#define GPIO_GPCGMUX1_GPIO78_S 28U +#define GPIO_GPCGMUX1_GPIO78_M 0x30000000U // Defines pin-muxing selection for GPIO78 +#define GPIO_GPCGMUX1_GPIO79_S 30U +#define GPIO_GPCGMUX1_GPIO79_M 0xC0000000U // Defines pin-muxing selection for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPCGMUX2_GPIO80_S 0U +#define GPIO_GPCGMUX2_GPIO80_M 0x3U // Defines pin-muxing selection for GPIO80 +#define GPIO_GPCGMUX2_GPIO81_S 2U +#define GPIO_GPCGMUX2_GPIO81_M 0xCU // Defines pin-muxing selection for GPIO81 +#define GPIO_GPCGMUX2_GPIO82_S 4U +#define GPIO_GPCGMUX2_GPIO82_M 0x30U // Defines pin-muxing selection for GPIO82 +#define GPIO_GPCGMUX2_GPIO83_S 6U +#define GPIO_GPCGMUX2_GPIO83_M 0xC0U // Defines pin-muxing selection for GPIO83 +#define GPIO_GPCGMUX2_GPIO84_S 8U +#define GPIO_GPCGMUX2_GPIO84_M 0x300U // Defines pin-muxing selection for GPIO84 +#define GPIO_GPCGMUX2_GPIO85_S 10U +#define GPIO_GPCGMUX2_GPIO85_M 0xC00U // Defines pin-muxing selection for GPIO85 +#define GPIO_GPCGMUX2_GPIO86_S 12U +#define GPIO_GPCGMUX2_GPIO86_M 0x3000U // Defines pin-muxing selection for GPIO86 +#define GPIO_GPCGMUX2_GPIO87_S 14U +#define GPIO_GPCGMUX2_GPIO87_M 0xC000U // Defines pin-muxing selection for GPIO87 +#define GPIO_GPCGMUX2_GPIO88_S 16U +#define GPIO_GPCGMUX2_GPIO88_M 0x30000U // Defines pin-muxing selection for GPIO88 +#define GPIO_GPCGMUX2_GPIO89_S 18U +#define GPIO_GPCGMUX2_GPIO89_M 0xC0000U // Defines pin-muxing selection for GPIO89 +#define GPIO_GPCGMUX2_GPIO90_S 20U +#define GPIO_GPCGMUX2_GPIO90_M 0x300000U // Defines pin-muxing selection for GPIO90 +#define GPIO_GPCGMUX2_GPIO91_S 22U +#define GPIO_GPCGMUX2_GPIO91_M 0xC00000U // Defines pin-muxing selection for GPIO91 +#define GPIO_GPCGMUX2_GPIO92_S 24U +#define GPIO_GPCGMUX2_GPIO92_M 0x3000000U // Defines pin-muxing selection for GPIO92 +#define GPIO_GPCGMUX2_GPIO93_S 26U +#define GPIO_GPCGMUX2_GPIO93_M 0xC000000U // Defines pin-muxing selection for GPIO93 +#define GPIO_GPCGMUX2_GPIO94_S 28U +#define GPIO_GPCGMUX2_GPIO94_M 0x30000000U // Defines pin-muxing selection for GPIO94 +#define GPIO_GPCGMUX2_GPIO95_S 30U +#define GPIO_GPCGMUX2_GPIO95_M 0xC0000000U // Defines pin-muxing selection for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL1_GPIO64_S 0U +#define GPIO_GPCCSEL1_GPIO64_M 0xFU // GPIO64 Master CPU Select +#define GPIO_GPCCSEL1_GPIO65_S 4U +#define GPIO_GPCCSEL1_GPIO65_M 0xF0U // GPIO65 Master CPU Select +#define GPIO_GPCCSEL1_GPIO66_S 8U +#define GPIO_GPCCSEL1_GPIO66_M 0xF00U // GPIO66 Master CPU Select +#define GPIO_GPCCSEL1_GPIO67_S 12U +#define GPIO_GPCCSEL1_GPIO67_M 0xF000U // GPIO67 Master CPU Select +#define GPIO_GPCCSEL1_GPIO68_S 16U +#define GPIO_GPCCSEL1_GPIO68_M 0xF0000U // GPIO68 Master CPU Select +#define GPIO_GPCCSEL1_GPIO69_S 20U +#define GPIO_GPCCSEL1_GPIO69_M 0xF00000U // GPIO69 Master CPU Select +#define GPIO_GPCCSEL1_GPIO70_S 24U +#define GPIO_GPCCSEL1_GPIO70_M 0xF000000U // GPIO70 Master CPU Select +#define GPIO_GPCCSEL1_GPIO71_S 28U +#define GPIO_GPCCSEL1_GPIO71_M 0xF0000000U // GPIO71 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL2_GPIO72_S 0U +#define GPIO_GPCCSEL2_GPIO72_M 0xFU // GPIO72 Master CPU Select +#define GPIO_GPCCSEL2_GPIO73_S 4U +#define GPIO_GPCCSEL2_GPIO73_M 0xF0U // GPIO73 Master CPU Select +#define GPIO_GPCCSEL2_GPIO74_S 8U +#define GPIO_GPCCSEL2_GPIO74_M 0xF00U // GPIO74 Master CPU Select +#define GPIO_GPCCSEL2_GPIO75_S 12U +#define GPIO_GPCCSEL2_GPIO75_M 0xF000U // GPIO75 Master CPU Select +#define GPIO_GPCCSEL2_GPIO76_S 16U +#define GPIO_GPCCSEL2_GPIO76_M 0xF0000U // GPIO76 Master CPU Select +#define GPIO_GPCCSEL2_GPIO77_S 20U +#define GPIO_GPCCSEL2_GPIO77_M 0xF00000U // GPIO77 Master CPU Select +#define GPIO_GPCCSEL2_GPIO78_S 24U +#define GPIO_GPCCSEL2_GPIO78_M 0xF000000U // GPIO78 Master CPU Select +#define GPIO_GPCCSEL2_GPIO79_S 28U +#define GPIO_GPCCSEL2_GPIO79_M 0xF0000000U // GPIO79 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL3_GPIO80_S 0U +#define GPIO_GPCCSEL3_GPIO80_M 0xFU // GPIO80 Master CPU Select +#define GPIO_GPCCSEL3_GPIO81_S 4U +#define GPIO_GPCCSEL3_GPIO81_M 0xF0U // GPIO81 Master CPU Select +#define GPIO_GPCCSEL3_GPIO82_S 8U +#define GPIO_GPCCSEL3_GPIO82_M 0xF00U // GPIO82 Master CPU Select +#define GPIO_GPCCSEL3_GPIO83_S 12U +#define GPIO_GPCCSEL3_GPIO83_M 0xF000U // GPIO83 Master CPU Select +#define GPIO_GPCCSEL3_GPIO84_S 16U +#define GPIO_GPCCSEL3_GPIO84_M 0xF0000U // GPIO84 Master CPU Select +#define GPIO_GPCCSEL3_GPIO85_S 20U +#define GPIO_GPCCSEL3_GPIO85_M 0xF00000U // GPIO85 Master CPU Select +#define GPIO_GPCCSEL3_GPIO86_S 24U +#define GPIO_GPCCSEL3_GPIO86_M 0xF000000U // GPIO86 Master CPU Select +#define GPIO_GPCCSEL3_GPIO87_S 28U +#define GPIO_GPCCSEL3_GPIO87_M 0xF0000000U // GPIO87 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL4_GPIO88_S 0U +#define GPIO_GPCCSEL4_GPIO88_M 0xFU // GPIO88 Master CPU Select +#define GPIO_GPCCSEL4_GPIO89_S 4U +#define GPIO_GPCCSEL4_GPIO89_M 0xF0U // GPIO89 Master CPU Select +#define GPIO_GPCCSEL4_GPIO90_S 8U +#define GPIO_GPCCSEL4_GPIO90_M 0xF00U // GPIO90 Master CPU Select +#define GPIO_GPCCSEL4_GPIO91_S 12U +#define GPIO_GPCCSEL4_GPIO91_M 0xF000U // GPIO91 Master CPU Select +#define GPIO_GPCCSEL4_GPIO92_S 16U +#define GPIO_GPCCSEL4_GPIO92_M 0xF0000U // GPIO92 Master CPU Select +#define GPIO_GPCCSEL4_GPIO93_S 20U +#define GPIO_GPCCSEL4_GPIO93_M 0xF00000U // GPIO93 Master CPU Select +#define GPIO_GPCCSEL4_GPIO94_S 24U +#define GPIO_GPCCSEL4_GPIO94_M 0xF000000U // GPIO94 Master CPU Select +#define GPIO_GPCCSEL4_GPIO95_S 28U +#define GPIO_GPCCSEL4_GPIO95_M 0xF0000000U // GPIO95 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCLOCK register +// +//************************************************************************************************* +#define GPIO_GPCLOCK_GPIO64 0x1U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO65 0x2U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO66 0x4U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO67 0x8U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO68 0x10U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO69 0x20U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO70 0x40U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO71 0x80U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO72 0x100U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO73 0x200U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO74 0x400U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO75 0x800U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO76 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO77 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO78 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO79 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO80 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO81 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO82 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO83 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO84 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO85 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO86 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO87 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO88 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO89 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO90 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO91 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO92 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO93 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO94 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO95 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCR register +// +//************************************************************************************************* +#define GPIO_GPCCR_GPIO64 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO65 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO66 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO67 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO68 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO69 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO70 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO71 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO72 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO73 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO74 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO75 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO76 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO77 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO78 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO79 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO80 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO81 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO82 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO83 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO84 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO85 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO86 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO87 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO88 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO89 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO90 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO91 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO92 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO93 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO94 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO95 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCTRL register +// +//************************************************************************************************* +#define GPIO_GPDCTRL_QUALPRD0_S 0U +#define GPIO_GPDCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO96 to + // GPIO103 +#define GPIO_GPDCTRL_QUALPRD1_S 8U +#define GPIO_GPDCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO104 to + // GPIO111 +#define GPIO_GPDCTRL_QUALPRD2_S 16U +#define GPIO_GPDCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO112 to + // GPIO119 +#define GPIO_GPDCTRL_QUALPRD3_S 24U +#define GPIO_GPDCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO120 to + // GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPDQSEL1_GPIO96_S 0U +#define GPIO_GPDQSEL1_GPIO96_M 0x3U // Select input qualification type for GPIO96 +#define GPIO_GPDQSEL1_GPIO97_S 2U +#define GPIO_GPDQSEL1_GPIO97_M 0xCU // Select input qualification type for GPIO97 +#define GPIO_GPDQSEL1_GPIO98_S 4U +#define GPIO_GPDQSEL1_GPIO98_M 0x30U // Select input qualification type for GPIO98 +#define GPIO_GPDQSEL1_GPIO99_S 6U +#define GPIO_GPDQSEL1_GPIO99_M 0xC0U // Select input qualification type for GPIO99 +#define GPIO_GPDQSEL1_GPIO100_S 8U +#define GPIO_GPDQSEL1_GPIO100_M 0x300U // Select input qualification type for GPIO100 +#define GPIO_GPDQSEL1_GPIO101_S 10U +#define GPIO_GPDQSEL1_GPIO101_M 0xC00U // Select input qualification type for GPIO101 +#define GPIO_GPDQSEL1_GPIO102_S 12U +#define GPIO_GPDQSEL1_GPIO102_M 0x3000U // Select input qualification type for GPIO102 +#define GPIO_GPDQSEL1_GPIO103_S 14U +#define GPIO_GPDQSEL1_GPIO103_M 0xC000U // Select input qualification type for GPIO103 +#define GPIO_GPDQSEL1_GPIO104_S 16U +#define GPIO_GPDQSEL1_GPIO104_M 0x30000U // Select input qualification type for GPIO104 +#define GPIO_GPDQSEL1_GPIO105_S 18U +#define GPIO_GPDQSEL1_GPIO105_M 0xC0000U // Select input qualification type for GPIO105 +#define GPIO_GPDQSEL1_GPIO106_S 20U +#define GPIO_GPDQSEL1_GPIO106_M 0x300000U // Select input qualification type for GPIO106 +#define GPIO_GPDQSEL1_GPIO107_S 22U +#define GPIO_GPDQSEL1_GPIO107_M 0xC00000U // Select input qualification type for GPIO107 +#define GPIO_GPDQSEL1_GPIO108_S 24U +#define GPIO_GPDQSEL1_GPIO108_M 0x3000000U // Select input qualification type for GPIO108 +#define GPIO_GPDQSEL1_GPIO109_S 26U +#define GPIO_GPDQSEL1_GPIO109_M 0xC000000U // Select input qualification type for GPIO109 +#define GPIO_GPDQSEL1_GPIO110_S 28U +#define GPIO_GPDQSEL1_GPIO110_M 0x30000000U // Select input qualification type for GPIO110 +#define GPIO_GPDQSEL1_GPIO111_S 30U +#define GPIO_GPDQSEL1_GPIO111_M 0xC0000000U // Select input qualification type for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPDQSEL2_GPIO112_S 0U +#define GPIO_GPDQSEL2_GPIO112_M 0x3U // Select input qualification type for GPIO112 +#define GPIO_GPDQSEL2_GPIO113_S 2U +#define GPIO_GPDQSEL2_GPIO113_M 0xCU // Select input qualification type for GPIO113 +#define GPIO_GPDQSEL2_GPIO114_S 4U +#define GPIO_GPDQSEL2_GPIO114_M 0x30U // Select input qualification type for GPIO114 +#define GPIO_GPDQSEL2_GPIO115_S 6U +#define GPIO_GPDQSEL2_GPIO115_M 0xC0U // Select input qualification type for GPIO115 +#define GPIO_GPDQSEL2_GPIO116_S 8U +#define GPIO_GPDQSEL2_GPIO116_M 0x300U // Select input qualification type for GPIO116 +#define GPIO_GPDQSEL2_GPIO117_S 10U +#define GPIO_GPDQSEL2_GPIO117_M 0xC00U // Select input qualification type for GPIO117 +#define GPIO_GPDQSEL2_GPIO118_S 12U +#define GPIO_GPDQSEL2_GPIO118_M 0x3000U // Select input qualification type for GPIO118 +#define GPIO_GPDQSEL2_GPIO119_S 14U +#define GPIO_GPDQSEL2_GPIO119_M 0xC000U // Select input qualification type for GPIO119 +#define GPIO_GPDQSEL2_GPIO120_S 16U +#define GPIO_GPDQSEL2_GPIO120_M 0x30000U // Select input qualification type for GPIO120 +#define GPIO_GPDQSEL2_GPIO121_S 18U +#define GPIO_GPDQSEL2_GPIO121_M 0xC0000U // Select input qualification type for GPIO121 +#define GPIO_GPDQSEL2_GPIO122_S 20U +#define GPIO_GPDQSEL2_GPIO122_M 0x300000U // Select input qualification type for GPIO122 +#define GPIO_GPDQSEL2_GPIO123_S 22U +#define GPIO_GPDQSEL2_GPIO123_M 0xC00000U // Select input qualification type for GPIO123 +#define GPIO_GPDQSEL2_GPIO124_S 24U +#define GPIO_GPDQSEL2_GPIO124_M 0x3000000U // Select input qualification type for GPIO124 +#define GPIO_GPDQSEL2_GPIO125_S 26U +#define GPIO_GPDQSEL2_GPIO125_M 0xC000000U // Select input qualification type for GPIO125 +#define GPIO_GPDQSEL2_GPIO126_S 28U +#define GPIO_GPDQSEL2_GPIO126_M 0x30000000U // Select input qualification type for GPIO126 +#define GPIO_GPDQSEL2_GPIO127_S 30U +#define GPIO_GPDQSEL2_GPIO127_M 0xC0000000U // Select input qualification type for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDMUX1 register +// +//************************************************************************************************* +#define GPIO_GPDMUX1_GPIO96_S 0U +#define GPIO_GPDMUX1_GPIO96_M 0x3U // Defines pin-muxing selection for GPIO96 +#define GPIO_GPDMUX1_GPIO97_S 2U +#define GPIO_GPDMUX1_GPIO97_M 0xCU // Defines pin-muxing selection for GPIO97 +#define GPIO_GPDMUX1_GPIO98_S 4U +#define GPIO_GPDMUX1_GPIO98_M 0x30U // Defines pin-muxing selection for GPIO98 +#define GPIO_GPDMUX1_GPIO99_S 6U +#define GPIO_GPDMUX1_GPIO99_M 0xC0U // Defines pin-muxing selection for GPIO99 +#define GPIO_GPDMUX1_GPIO100_S 8U +#define GPIO_GPDMUX1_GPIO100_M 0x300U // Defines pin-muxing selection for GPIO100 +#define GPIO_GPDMUX1_GPIO101_S 10U +#define GPIO_GPDMUX1_GPIO101_M 0xC00U // Defines pin-muxing selection for GPIO101 +#define GPIO_GPDMUX1_GPIO102_S 12U +#define GPIO_GPDMUX1_GPIO102_M 0x3000U // Defines pin-muxing selection for GPIO102 +#define GPIO_GPDMUX1_GPIO103_S 14U +#define GPIO_GPDMUX1_GPIO103_M 0xC000U // Defines pin-muxing selection for GPIO103 +#define GPIO_GPDMUX1_GPIO104_S 16U +#define GPIO_GPDMUX1_GPIO104_M 0x30000U // Defines pin-muxing selection for GPIO104 +#define GPIO_GPDMUX1_GPIO105_S 18U +#define GPIO_GPDMUX1_GPIO105_M 0xC0000U // Defines pin-muxing selection for GPIO105 +#define GPIO_GPDMUX1_GPIO106_S 20U +#define GPIO_GPDMUX1_GPIO106_M 0x300000U // Defines pin-muxing selection for GPIO106 +#define GPIO_GPDMUX1_GPIO107_S 22U +#define GPIO_GPDMUX1_GPIO107_M 0xC00000U // Defines pin-muxing selection for GPIO107 +#define GPIO_GPDMUX1_GPIO108_S 24U +#define GPIO_GPDMUX1_GPIO108_M 0x3000000U // Defines pin-muxing selection for GPIO108 +#define GPIO_GPDMUX1_GPIO109_S 26U +#define GPIO_GPDMUX1_GPIO109_M 0xC000000U // Defines pin-muxing selection for GPIO109 +#define GPIO_GPDMUX1_GPIO110_S 28U +#define GPIO_GPDMUX1_GPIO110_M 0x30000000U // Defines pin-muxing selection for GPIO110 +#define GPIO_GPDMUX1_GPIO111_S 30U +#define GPIO_GPDMUX1_GPIO111_M 0xC0000000U // Defines pin-muxing selection for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDMUX2 register +// +//************************************************************************************************* +#define GPIO_GPDMUX2_GPIO112_S 0U +#define GPIO_GPDMUX2_GPIO112_M 0x3U // Defines pin-muxing selection for GPIO112 +#define GPIO_GPDMUX2_GPIO113_S 2U +#define GPIO_GPDMUX2_GPIO113_M 0xCU // Defines pin-muxing selection for GPIO113 +#define GPIO_GPDMUX2_GPIO114_S 4U +#define GPIO_GPDMUX2_GPIO114_M 0x30U // Defines pin-muxing selection for GPIO114 +#define GPIO_GPDMUX2_GPIO115_S 6U +#define GPIO_GPDMUX2_GPIO115_M 0xC0U // Defines pin-muxing selection for GPIO115 +#define GPIO_GPDMUX2_GPIO116_S 8U +#define GPIO_GPDMUX2_GPIO116_M 0x300U // Defines pin-muxing selection for GPIO116 +#define GPIO_GPDMUX2_GPIO117_S 10U +#define GPIO_GPDMUX2_GPIO117_M 0xC00U // Defines pin-muxing selection for GPIO117 +#define GPIO_GPDMUX2_GPIO118_S 12U +#define GPIO_GPDMUX2_GPIO118_M 0x3000U // Defines pin-muxing selection for GPIO118 +#define GPIO_GPDMUX2_GPIO119_S 14U +#define GPIO_GPDMUX2_GPIO119_M 0xC000U // Defines pin-muxing selection for GPIO119 +#define GPIO_GPDMUX2_GPIO120_S 16U +#define GPIO_GPDMUX2_GPIO120_M 0x30000U // Defines pin-muxing selection for GPIO120 +#define GPIO_GPDMUX2_GPIO121_S 18U +#define GPIO_GPDMUX2_GPIO121_M 0xC0000U // Defines pin-muxing selection for GPIO121 +#define GPIO_GPDMUX2_GPIO122_S 20U +#define GPIO_GPDMUX2_GPIO122_M 0x300000U // Defines pin-muxing selection for GPIO122 +#define GPIO_GPDMUX2_GPIO123_S 22U +#define GPIO_GPDMUX2_GPIO123_M 0xC00000U // Defines pin-muxing selection for GPIO123 +#define GPIO_GPDMUX2_GPIO124_S 24U +#define GPIO_GPDMUX2_GPIO124_M 0x3000000U // Defines pin-muxing selection for GPIO124 +#define GPIO_GPDMUX2_GPIO125_S 26U +#define GPIO_GPDMUX2_GPIO125_M 0xC000000U // Defines pin-muxing selection for GPIO125 +#define GPIO_GPDMUX2_GPIO126_S 28U +#define GPIO_GPDMUX2_GPIO126_M 0x30000000U // Defines pin-muxing selection for GPIO126 +#define GPIO_GPDMUX2_GPIO127_S 30U +#define GPIO_GPDMUX2_GPIO127_M 0xC0000000U // Defines pin-muxing selection for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDDIR register +// +//************************************************************************************************* +#define GPIO_GPDDIR_GPIO96 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO97 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO98 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO99 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO100 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO101 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO102 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO103 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO104 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO105 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO106 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO107 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO108 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO109 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO110 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO111 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO112 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO113 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO114 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO115 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO116 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO117 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO118 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO119 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO120 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO121 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO122 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO123 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO124 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO125 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO126 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO127 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDPUD register +// +//************************************************************************************************* +#define GPIO_GPDPUD_GPIO96 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO97 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO98 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO99 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO100 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO101 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO102 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO103 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO104 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO105 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO106 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO107 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO108 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO109 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO110 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO111 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO112 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO113 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO114 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO115 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO116 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO117 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO118 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO119 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO120 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO121 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO122 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO123 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO124 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO125 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO126 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO127 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDINV register +// +//************************************************************************************************* +#define GPIO_GPDINV_GPIO96 0x1U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO97 0x2U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO98 0x4U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO99 0x8U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO100 0x10U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO101 0x20U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO102 0x40U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO103 0x80U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO104 0x100U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO105 0x200U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO106 0x400U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO107 0x800U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO108 0x1000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO109 0x2000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO110 0x4000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO111 0x8000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO112 0x10000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO113 0x20000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO114 0x40000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO115 0x80000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO116 0x100000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO117 0x200000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO118 0x400000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO119 0x800000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO120 0x1000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO121 0x2000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO122 0x4000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO123 0x8000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO124 0x10000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO125 0x20000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO126 0x40000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO127 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDODR register +// +//************************************************************************************************* +#define GPIO_GPDODR_GPIO96 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO97 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO98 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO99 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO100 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO101 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO102 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO103 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO104 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO105 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO106 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO107 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO108 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO109 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO110 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO111 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO112 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO113 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO114 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO115 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO116 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO117 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO118 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO119 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO120 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO121 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO122 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO123 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO124 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO125 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO126 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO127 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPDGMUX1_GPIO96_S 0U +#define GPIO_GPDGMUX1_GPIO96_M 0x3U // Defines pin-muxing selection for GPIO96 +#define GPIO_GPDGMUX1_GPIO97_S 2U +#define GPIO_GPDGMUX1_GPIO97_M 0xCU // Defines pin-muxing selection for GPIO97 +#define GPIO_GPDGMUX1_GPIO98_S 4U +#define GPIO_GPDGMUX1_GPIO98_M 0x30U // Defines pin-muxing selection for GPIO98 +#define GPIO_GPDGMUX1_GPIO99_S 6U +#define GPIO_GPDGMUX1_GPIO99_M 0xC0U // Defines pin-muxing selection for GPIO99 +#define GPIO_GPDGMUX1_GPIO100_S 8U +#define GPIO_GPDGMUX1_GPIO100_M 0x300U // Defines pin-muxing selection for GPIO100 +#define GPIO_GPDGMUX1_GPIO101_S 10U +#define GPIO_GPDGMUX1_GPIO101_M 0xC00U // Defines pin-muxing selection for GPIO101 +#define GPIO_GPDGMUX1_GPIO102_S 12U +#define GPIO_GPDGMUX1_GPIO102_M 0x3000U // Defines pin-muxing selection for GPIO102 +#define GPIO_GPDGMUX1_GPIO103_S 14U +#define GPIO_GPDGMUX1_GPIO103_M 0xC000U // Defines pin-muxing selection for GPIO103 +#define GPIO_GPDGMUX1_GPIO104_S 16U +#define GPIO_GPDGMUX1_GPIO104_M 0x30000U // Defines pin-muxing selection for GPIO104 +#define GPIO_GPDGMUX1_GPIO105_S 18U +#define GPIO_GPDGMUX1_GPIO105_M 0xC0000U // Defines pin-muxing selection for GPIO105 +#define GPIO_GPDGMUX1_GPIO106_S 20U +#define GPIO_GPDGMUX1_GPIO106_M 0x300000U // Defines pin-muxing selection for GPIO106 +#define GPIO_GPDGMUX1_GPIO107_S 22U +#define GPIO_GPDGMUX1_GPIO107_M 0xC00000U // Defines pin-muxing selection for GPIO107 +#define GPIO_GPDGMUX1_GPIO108_S 24U +#define GPIO_GPDGMUX1_GPIO108_M 0x3000000U // Defines pin-muxing selection for GPIO108 +#define GPIO_GPDGMUX1_GPIO109_S 26U +#define GPIO_GPDGMUX1_GPIO109_M 0xC000000U // Defines pin-muxing selection for GPIO109 +#define GPIO_GPDGMUX1_GPIO110_S 28U +#define GPIO_GPDGMUX1_GPIO110_M 0x30000000U // Defines pin-muxing selection for GPIO110 +#define GPIO_GPDGMUX1_GPIO111_S 30U +#define GPIO_GPDGMUX1_GPIO111_M 0xC0000000U // Defines pin-muxing selection for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPDGMUX2_GPIO112_S 0U +#define GPIO_GPDGMUX2_GPIO112_M 0x3U // Defines pin-muxing selection for GPIO112 +#define GPIO_GPDGMUX2_GPIO113_S 2U +#define GPIO_GPDGMUX2_GPIO113_M 0xCU // Defines pin-muxing selection for GPIO113 +#define GPIO_GPDGMUX2_GPIO114_S 4U +#define GPIO_GPDGMUX2_GPIO114_M 0x30U // Defines pin-muxing selection for GPIO114 +#define GPIO_GPDGMUX2_GPIO115_S 6U +#define GPIO_GPDGMUX2_GPIO115_M 0xC0U // Defines pin-muxing selection for GPIO115 +#define GPIO_GPDGMUX2_GPIO116_S 8U +#define GPIO_GPDGMUX2_GPIO116_M 0x300U // Defines pin-muxing selection for GPIO116 +#define GPIO_GPDGMUX2_GPIO117_S 10U +#define GPIO_GPDGMUX2_GPIO117_M 0xC00U // Defines pin-muxing selection for GPIO117 +#define GPIO_GPDGMUX2_GPIO118_S 12U +#define GPIO_GPDGMUX2_GPIO118_M 0x3000U // Defines pin-muxing selection for GPIO118 +#define GPIO_GPDGMUX2_GPIO119_S 14U +#define GPIO_GPDGMUX2_GPIO119_M 0xC000U // Defines pin-muxing selection for GPIO119 +#define GPIO_GPDGMUX2_GPIO120_S 16U +#define GPIO_GPDGMUX2_GPIO120_M 0x30000U // Defines pin-muxing selection for GPIO120 +#define GPIO_GPDGMUX2_GPIO121_S 18U +#define GPIO_GPDGMUX2_GPIO121_M 0xC0000U // Defines pin-muxing selection for GPIO121 +#define GPIO_GPDGMUX2_GPIO122_S 20U +#define GPIO_GPDGMUX2_GPIO122_M 0x300000U // Defines pin-muxing selection for GPIO122 +#define GPIO_GPDGMUX2_GPIO123_S 22U +#define GPIO_GPDGMUX2_GPIO123_M 0xC00000U // Defines pin-muxing selection for GPIO123 +#define GPIO_GPDGMUX2_GPIO124_S 24U +#define GPIO_GPDGMUX2_GPIO124_M 0x3000000U // Defines pin-muxing selection for GPIO124 +#define GPIO_GPDGMUX2_GPIO125_S 26U +#define GPIO_GPDGMUX2_GPIO125_M 0xC000000U // Defines pin-muxing selection for GPIO125 +#define GPIO_GPDGMUX2_GPIO126_S 28U +#define GPIO_GPDGMUX2_GPIO126_M 0x30000000U // Defines pin-muxing selection for GPIO126 +#define GPIO_GPDGMUX2_GPIO127_S 30U +#define GPIO_GPDGMUX2_GPIO127_M 0xC0000000U // Defines pin-muxing selection for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL1_GPIO96_S 0U +#define GPIO_GPDCSEL1_GPIO96_M 0xFU // GPIO96 Master CPU Select +#define GPIO_GPDCSEL1_GPIO97_S 4U +#define GPIO_GPDCSEL1_GPIO97_M 0xF0U // GPIO97 Master CPU Select +#define GPIO_GPDCSEL1_GPIO98_S 8U +#define GPIO_GPDCSEL1_GPIO98_M 0xF00U // GPIO98 Master CPU Select +#define GPIO_GPDCSEL1_GPIO99_S 12U +#define GPIO_GPDCSEL1_GPIO99_M 0xF000U // GPIO99 Master CPU Select +#define GPIO_GPDCSEL1_GPIO100_S 16U +#define GPIO_GPDCSEL1_GPIO100_M 0xF0000U // GPIO100 Master CPU Select +#define GPIO_GPDCSEL1_GPIO101_S 20U +#define GPIO_GPDCSEL1_GPIO101_M 0xF00000U // GPIO101 Master CPU Select +#define GPIO_GPDCSEL1_GPIO102_S 24U +#define GPIO_GPDCSEL1_GPIO102_M 0xF000000U // GPIO102 Master CPU Select +#define GPIO_GPDCSEL1_GPIO103_S 28U +#define GPIO_GPDCSEL1_GPIO103_M 0xF0000000U // GPIO103 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL2_GPIO104_S 0U +#define GPIO_GPDCSEL2_GPIO104_M 0xFU // GPIO104 Master CPU Select +#define GPIO_GPDCSEL2_GPIO105_S 4U +#define GPIO_GPDCSEL2_GPIO105_M 0xF0U // GPIO105 Master CPU Select +#define GPIO_GPDCSEL2_GPIO106_S 8U +#define GPIO_GPDCSEL2_GPIO106_M 0xF00U // GPIO106 Master CPU Select +#define GPIO_GPDCSEL2_GPIO107_S 12U +#define GPIO_GPDCSEL2_GPIO107_M 0xF000U // GPIO107 Master CPU Select +#define GPIO_GPDCSEL2_GPIO108_S 16U +#define GPIO_GPDCSEL2_GPIO108_M 0xF0000U // GPIO108 Master CPU Select +#define GPIO_GPDCSEL2_GPIO109_S 20U +#define GPIO_GPDCSEL2_GPIO109_M 0xF00000U // GPIO109 Master CPU Select +#define GPIO_GPDCSEL2_GPIO110_S 24U +#define GPIO_GPDCSEL2_GPIO110_M 0xF000000U // GPIO110 Master CPU Select +#define GPIO_GPDCSEL2_GPIO111_S 28U +#define GPIO_GPDCSEL2_GPIO111_M 0xF0000000U // GPIO111 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL3_GPIO112_S 0U +#define GPIO_GPDCSEL3_GPIO112_M 0xFU // GPIO112 Master CPU Select +#define GPIO_GPDCSEL3_GPIO113_S 4U +#define GPIO_GPDCSEL3_GPIO113_M 0xF0U // GPIO113 Master CPU Select +#define GPIO_GPDCSEL3_GPIO114_S 8U +#define GPIO_GPDCSEL3_GPIO114_M 0xF00U // GPIO114 Master CPU Select +#define GPIO_GPDCSEL3_GPIO115_S 12U +#define GPIO_GPDCSEL3_GPIO115_M 0xF000U // GPIO115 Master CPU Select +#define GPIO_GPDCSEL3_GPIO116_S 16U +#define GPIO_GPDCSEL3_GPIO116_M 0xF0000U // GPIO116 Master CPU Select +#define GPIO_GPDCSEL3_GPIO117_S 20U +#define GPIO_GPDCSEL3_GPIO117_M 0xF00000U // GPIO117 Master CPU Select +#define GPIO_GPDCSEL3_GPIO118_S 24U +#define GPIO_GPDCSEL3_GPIO118_M 0xF000000U // GPIO118 Master CPU Select +#define GPIO_GPDCSEL3_GPIO119_S 28U +#define GPIO_GPDCSEL3_GPIO119_M 0xF0000000U // GPIO119 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL4_GPIO120_S 0U +#define GPIO_GPDCSEL4_GPIO120_M 0xFU // GPIO120 Master CPU Select +#define GPIO_GPDCSEL4_GPIO121_S 4U +#define GPIO_GPDCSEL4_GPIO121_M 0xF0U // GPIO121 Master CPU Select +#define GPIO_GPDCSEL4_GPIO122_S 8U +#define GPIO_GPDCSEL4_GPIO122_M 0xF00U // GPIO122 Master CPU Select +#define GPIO_GPDCSEL4_GPIO123_S 12U +#define GPIO_GPDCSEL4_GPIO123_M 0xF000U // GPIO123 Master CPU Select +#define GPIO_GPDCSEL4_GPIO124_S 16U +#define GPIO_GPDCSEL4_GPIO124_M 0xF0000U // GPIO124 Master CPU Select +#define GPIO_GPDCSEL4_GPIO125_S 20U +#define GPIO_GPDCSEL4_GPIO125_M 0xF00000U // GPIO125 Master CPU Select +#define GPIO_GPDCSEL4_GPIO126_S 24U +#define GPIO_GPDCSEL4_GPIO126_M 0xF000000U // GPIO126 Master CPU Select +#define GPIO_GPDCSEL4_GPIO127_S 28U +#define GPIO_GPDCSEL4_GPIO127_M 0xF0000000U // GPIO127 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDLOCK register +// +//************************************************************************************************* +#define GPIO_GPDLOCK_GPIO96 0x1U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO97 0x2U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO98 0x4U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO99 0x8U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO100 0x10U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO101 0x20U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO102 0x40U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO103 0x80U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO104 0x100U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO105 0x200U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO106 0x400U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO107 0x800U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO108 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO109 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO110 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO111 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO112 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO113 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO114 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO115 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO116 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO117 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO118 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO119 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO120 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO121 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO122 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO123 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO124 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO125 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO126 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO127 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCR register +// +//************************************************************************************************* +#define GPIO_GPDCR_GPIO96 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO97 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO98 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO99 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO100 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO101 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO102 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO103 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO104 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO105 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO106 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO107 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO108 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO109 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO110 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO111 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO112 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO113 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO114 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO115 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO116 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO117 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO118 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO119 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO120 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO121 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO122 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO123 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO124 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO125 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO126 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO127 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECTRL register +// +//************************************************************************************************* +#define GPIO_GPECTRL_QUALPRD0_S 0U +#define GPIO_GPECTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO128 to + // GPIO135 +#define GPIO_GPECTRL_QUALPRD1_S 8U +#define GPIO_GPECTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO136 to + // GPIO143 +#define GPIO_GPECTRL_QUALPRD2_S 16U +#define GPIO_GPECTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO144 to + // GPIO151 +#define GPIO_GPECTRL_QUALPRD3_S 24U +#define GPIO_GPECTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO152 to + // GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPEQSEL1_GPIO128_S 0U +#define GPIO_GPEQSEL1_GPIO128_M 0x3U // Select input qualification type for GPIO128 +#define GPIO_GPEQSEL1_GPIO129_S 2U +#define GPIO_GPEQSEL1_GPIO129_M 0xCU // Select input qualification type for GPIO129 +#define GPIO_GPEQSEL1_GPIO130_S 4U +#define GPIO_GPEQSEL1_GPIO130_M 0x30U // Select input qualification type for GPIO130 +#define GPIO_GPEQSEL1_GPIO131_S 6U +#define GPIO_GPEQSEL1_GPIO131_M 0xC0U // Select input qualification type for GPIO131 +#define GPIO_GPEQSEL1_GPIO132_S 8U +#define GPIO_GPEQSEL1_GPIO132_M 0x300U // Select input qualification type for GPIO132 +#define GPIO_GPEQSEL1_GPIO133_S 10U +#define GPIO_GPEQSEL1_GPIO133_M 0xC00U // Select input qualification type for GPIO133 +#define GPIO_GPEQSEL1_GPIO134_S 12U +#define GPIO_GPEQSEL1_GPIO134_M 0x3000U // Select input qualification type for GPIO134 +#define GPIO_GPEQSEL1_GPIO135_S 14U +#define GPIO_GPEQSEL1_GPIO135_M 0xC000U // Select input qualification type for GPIO135 +#define GPIO_GPEQSEL1_GPIO136_S 16U +#define GPIO_GPEQSEL1_GPIO136_M 0x30000U // Select input qualification type for GPIO136 +#define GPIO_GPEQSEL1_GPIO137_S 18U +#define GPIO_GPEQSEL1_GPIO137_M 0xC0000U // Select input qualification type for GPIO137 +#define GPIO_GPEQSEL1_GPIO138_S 20U +#define GPIO_GPEQSEL1_GPIO138_M 0x300000U // Select input qualification type for GPIO138 +#define GPIO_GPEQSEL1_GPIO139_S 22U +#define GPIO_GPEQSEL1_GPIO139_M 0xC00000U // Select input qualification type for GPIO139 +#define GPIO_GPEQSEL1_GPIO140_S 24U +#define GPIO_GPEQSEL1_GPIO140_M 0x3000000U // Select input qualification type for GPIO140 +#define GPIO_GPEQSEL1_GPIO141_S 26U +#define GPIO_GPEQSEL1_GPIO141_M 0xC000000U // Select input qualification type for GPIO141 +#define GPIO_GPEQSEL1_GPIO142_S 28U +#define GPIO_GPEQSEL1_GPIO142_M 0x30000000U // Select input qualification type for GPIO142 +#define GPIO_GPEQSEL1_GPIO143_S 30U +#define GPIO_GPEQSEL1_GPIO143_M 0xC0000000U // Select input qualification type for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPEQSEL2_GPIO144_S 0U +#define GPIO_GPEQSEL2_GPIO144_M 0x3U // Select input qualification type for GPIO144 +#define GPIO_GPEQSEL2_GPIO145_S 2U +#define GPIO_GPEQSEL2_GPIO145_M 0xCU // Select input qualification type for GPIO145 +#define GPIO_GPEQSEL2_GPIO146_S 4U +#define GPIO_GPEQSEL2_GPIO146_M 0x30U // Select input qualification type for GPIO146 +#define GPIO_GPEQSEL2_GPIO147_S 6U +#define GPIO_GPEQSEL2_GPIO147_M 0xC0U // Select input qualification type for GPIO147 +#define GPIO_GPEQSEL2_GPIO148_S 8U +#define GPIO_GPEQSEL2_GPIO148_M 0x300U // Select input qualification type for GPIO148 +#define GPIO_GPEQSEL2_GPIO149_S 10U +#define GPIO_GPEQSEL2_GPIO149_M 0xC00U // Select input qualification type for GPIO149 +#define GPIO_GPEQSEL2_GPIO150_S 12U +#define GPIO_GPEQSEL2_GPIO150_M 0x3000U // Select input qualification type for GPIO150 +#define GPIO_GPEQSEL2_GPIO151_S 14U +#define GPIO_GPEQSEL2_GPIO151_M 0xC000U // Select input qualification type for GPIO151 +#define GPIO_GPEQSEL2_GPIO152_S 16U +#define GPIO_GPEQSEL2_GPIO152_M 0x30000U // Select input qualification type for GPIO152 +#define GPIO_GPEQSEL2_GPIO153_S 18U +#define GPIO_GPEQSEL2_GPIO153_M 0xC0000U // Select input qualification type for GPIO153 +#define GPIO_GPEQSEL2_GPIO154_S 20U +#define GPIO_GPEQSEL2_GPIO154_M 0x300000U // Select input qualification type for GPIO154 +#define GPIO_GPEQSEL2_GPIO155_S 22U +#define GPIO_GPEQSEL2_GPIO155_M 0xC00000U // Select input qualification type for GPIO155 +#define GPIO_GPEQSEL2_GPIO156_S 24U +#define GPIO_GPEQSEL2_GPIO156_M 0x3000000U // Select input qualification type for GPIO156 +#define GPIO_GPEQSEL2_GPIO157_S 26U +#define GPIO_GPEQSEL2_GPIO157_M 0xC000000U // Select input qualification type for GPIO157 +#define GPIO_GPEQSEL2_GPIO158_S 28U +#define GPIO_GPEQSEL2_GPIO158_M 0x30000000U // Select input qualification type for GPIO158 +#define GPIO_GPEQSEL2_GPIO159_S 30U +#define GPIO_GPEQSEL2_GPIO159_M 0xC0000000U // Select input qualification type for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEMUX1 register +// +//************************************************************************************************* +#define GPIO_GPEMUX1_GPIO128_S 0U +#define GPIO_GPEMUX1_GPIO128_M 0x3U // Defines pin-muxing selection for GPIO128 +#define GPIO_GPEMUX1_GPIO129_S 2U +#define GPIO_GPEMUX1_GPIO129_M 0xCU // Defines pin-muxing selection for GPIO129 +#define GPIO_GPEMUX1_GPIO130_S 4U +#define GPIO_GPEMUX1_GPIO130_M 0x30U // Defines pin-muxing selection for GPIO130 +#define GPIO_GPEMUX1_GPIO131_S 6U +#define GPIO_GPEMUX1_GPIO131_M 0xC0U // Defines pin-muxing selection for GPIO131 +#define GPIO_GPEMUX1_GPIO132_S 8U +#define GPIO_GPEMUX1_GPIO132_M 0x300U // Defines pin-muxing selection for GPIO132 +#define GPIO_GPEMUX1_GPIO133_S 10U +#define GPIO_GPEMUX1_GPIO133_M 0xC00U // Defines pin-muxing selection for GPIO133 +#define GPIO_GPEMUX1_GPIO134_S 12U +#define GPIO_GPEMUX1_GPIO134_M 0x3000U // Defines pin-muxing selection for GPIO134 +#define GPIO_GPEMUX1_GPIO135_S 14U +#define GPIO_GPEMUX1_GPIO135_M 0xC000U // Defines pin-muxing selection for GPIO135 +#define GPIO_GPEMUX1_GPIO136_S 16U +#define GPIO_GPEMUX1_GPIO136_M 0x30000U // Defines pin-muxing selection for GPIO136 +#define GPIO_GPEMUX1_GPIO137_S 18U +#define GPIO_GPEMUX1_GPIO137_M 0xC0000U // Defines pin-muxing selection for GPIO137 +#define GPIO_GPEMUX1_GPIO138_S 20U +#define GPIO_GPEMUX1_GPIO138_M 0x300000U // Defines pin-muxing selection for GPIO138 +#define GPIO_GPEMUX1_GPIO139_S 22U +#define GPIO_GPEMUX1_GPIO139_M 0xC00000U // Defines pin-muxing selection for GPIO139 +#define GPIO_GPEMUX1_GPIO140_S 24U +#define GPIO_GPEMUX1_GPIO140_M 0x3000000U // Defines pin-muxing selection for GPIO140 +#define GPIO_GPEMUX1_GPIO141_S 26U +#define GPIO_GPEMUX1_GPIO141_M 0xC000000U // Defines pin-muxing selection for GPIO141 +#define GPIO_GPEMUX1_GPIO142_S 28U +#define GPIO_GPEMUX1_GPIO142_M 0x30000000U // Defines pin-muxing selection for GPIO142 +#define GPIO_GPEMUX1_GPIO143_S 30U +#define GPIO_GPEMUX1_GPIO143_M 0xC0000000U // Defines pin-muxing selection for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEMUX2 register +// +//************************************************************************************************* +#define GPIO_GPEMUX2_GPIO144_S 0U +#define GPIO_GPEMUX2_GPIO144_M 0x3U // Defines pin-muxing selection for GPIO144 +#define GPIO_GPEMUX2_GPIO145_S 2U +#define GPIO_GPEMUX2_GPIO145_M 0xCU // Defines pin-muxing selection for GPIO145 +#define GPIO_GPEMUX2_GPIO146_S 4U +#define GPIO_GPEMUX2_GPIO146_M 0x30U // Defines pin-muxing selection for GPIO146 +#define GPIO_GPEMUX2_GPIO147_S 6U +#define GPIO_GPEMUX2_GPIO147_M 0xC0U // Defines pin-muxing selection for GPIO147 +#define GPIO_GPEMUX2_GPIO148_S 8U +#define GPIO_GPEMUX2_GPIO148_M 0x300U // Defines pin-muxing selection for GPIO148 +#define GPIO_GPEMUX2_GPIO149_S 10U +#define GPIO_GPEMUX2_GPIO149_M 0xC00U // Defines pin-muxing selection for GPIO149 +#define GPIO_GPEMUX2_GPIO150_S 12U +#define GPIO_GPEMUX2_GPIO150_M 0x3000U // Defines pin-muxing selection for GPIO150 +#define GPIO_GPEMUX2_GPIO151_S 14U +#define GPIO_GPEMUX2_GPIO151_M 0xC000U // Defines pin-muxing selection for GPIO151 +#define GPIO_GPEMUX2_GPIO152_S 16U +#define GPIO_GPEMUX2_GPIO152_M 0x30000U // Defines pin-muxing selection for GPIO152 +#define GPIO_GPEMUX2_GPIO153_S 18U +#define GPIO_GPEMUX2_GPIO153_M 0xC0000U // Defines pin-muxing selection for GPIO153 +#define GPIO_GPEMUX2_GPIO154_S 20U +#define GPIO_GPEMUX2_GPIO154_M 0x300000U // Defines pin-muxing selection for GPIO154 +#define GPIO_GPEMUX2_GPIO155_S 22U +#define GPIO_GPEMUX2_GPIO155_M 0xC00000U // Defines pin-muxing selection for GPIO155 +#define GPIO_GPEMUX2_GPIO156_S 24U +#define GPIO_GPEMUX2_GPIO156_M 0x3000000U // Defines pin-muxing selection for GPIO156 +#define GPIO_GPEMUX2_GPIO157_S 26U +#define GPIO_GPEMUX2_GPIO157_M 0xC000000U // Defines pin-muxing selection for GPIO157 +#define GPIO_GPEMUX2_GPIO158_S 28U +#define GPIO_GPEMUX2_GPIO158_M 0x30000000U // Defines pin-muxing selection for GPIO158 +#define GPIO_GPEMUX2_GPIO159_S 30U +#define GPIO_GPEMUX2_GPIO159_M 0xC0000000U // Defines pin-muxing selection for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEDIR register +// +//************************************************************************************************* +#define GPIO_GPEDIR_GPIO128 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO129 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO130 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO131 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO132 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO133 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO134 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO135 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO136 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO137 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO138 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO139 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO140 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO141 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO142 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO143 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO144 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO145 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO146 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO147 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO148 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO149 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO150 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO151 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO152 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO153 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO154 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO155 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO156 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO157 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO158 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO159 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEPUD register +// +//************************************************************************************************* +#define GPIO_GPEPUD_GPIO128 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO129 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO130 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO131 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO132 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO133 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO134 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO135 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO136 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO137 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO138 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO139 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO140 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO141 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO142 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO143 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO144 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO145 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO146 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO147 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO148 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO149 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO150 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO151 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO152 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO153 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO154 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO155 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO156 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO157 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO158 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO159 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEINV register +// +//************************************************************************************************* +#define GPIO_GPEINV_GPIO128 0x1U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO129 0x2U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO130 0x4U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO131 0x8U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO132 0x10U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO133 0x20U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO134 0x40U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO135 0x80U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO136 0x100U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO137 0x200U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO138 0x400U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO139 0x800U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO140 0x1000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO141 0x2000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO142 0x4000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO143 0x8000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO144 0x10000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO145 0x20000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO146 0x40000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO147 0x80000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO148 0x100000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO149 0x200000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO150 0x400000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO151 0x800000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO152 0x1000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO153 0x2000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO154 0x4000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO155 0x8000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO156 0x10000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO157 0x20000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO158 0x40000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO159 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEODR register +// +//************************************************************************************************* +#define GPIO_GPEODR_GPIO128 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO129 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO130 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO131 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO132 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO133 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO134 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO135 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO136 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO137 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO138 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO139 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO140 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO141 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO142 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO143 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO144 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO145 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO146 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO147 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO148 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO149 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO150 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO151 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO152 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO153 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO154 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO155 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO156 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO157 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO158 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO159 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPEGMUX1_GPIO128_S 0U +#define GPIO_GPEGMUX1_GPIO128_M 0x3U // Defines pin-muxing selection for GPIO128 +#define GPIO_GPEGMUX1_GPIO129_S 2U +#define GPIO_GPEGMUX1_GPIO129_M 0xCU // Defines pin-muxing selection for GPIO129 +#define GPIO_GPEGMUX1_GPIO130_S 4U +#define GPIO_GPEGMUX1_GPIO130_M 0x30U // Defines pin-muxing selection for GPIO130 +#define GPIO_GPEGMUX1_GPIO131_S 6U +#define GPIO_GPEGMUX1_GPIO131_M 0xC0U // Defines pin-muxing selection for GPIO131 +#define GPIO_GPEGMUX1_GPIO132_S 8U +#define GPIO_GPEGMUX1_GPIO132_M 0x300U // Defines pin-muxing selection for GPIO132 +#define GPIO_GPEGMUX1_GPIO133_S 10U +#define GPIO_GPEGMUX1_GPIO133_M 0xC00U // Defines pin-muxing selection for GPIO133 +#define GPIO_GPEGMUX1_GPIO134_S 12U +#define GPIO_GPEGMUX1_GPIO134_M 0x3000U // Defines pin-muxing selection for GPIO134 +#define GPIO_GPEGMUX1_GPIO135_S 14U +#define GPIO_GPEGMUX1_GPIO135_M 0xC000U // Defines pin-muxing selection for GPIO135 +#define GPIO_GPEGMUX1_GPIO136_S 16U +#define GPIO_GPEGMUX1_GPIO136_M 0x30000U // Defines pin-muxing selection for GPIO136 +#define GPIO_GPEGMUX1_GPIO137_S 18U +#define GPIO_GPEGMUX1_GPIO137_M 0xC0000U // Defines pin-muxing selection for GPIO137 +#define GPIO_GPEGMUX1_GPIO138_S 20U +#define GPIO_GPEGMUX1_GPIO138_M 0x300000U // Defines pin-muxing selection for GPIO138 +#define GPIO_GPEGMUX1_GPIO139_S 22U +#define GPIO_GPEGMUX1_GPIO139_M 0xC00000U // Defines pin-muxing selection for GPIO139 +#define GPIO_GPEGMUX1_GPIO140_S 24U +#define GPIO_GPEGMUX1_GPIO140_M 0x3000000U // Defines pin-muxing selection for GPIO140 +#define GPIO_GPEGMUX1_GPIO141_S 26U +#define GPIO_GPEGMUX1_GPIO141_M 0xC000000U // Defines pin-muxing selection for GPIO141 +#define GPIO_GPEGMUX1_GPIO142_S 28U +#define GPIO_GPEGMUX1_GPIO142_M 0x30000000U // Defines pin-muxing selection for GPIO142 +#define GPIO_GPEGMUX1_GPIO143_S 30U +#define GPIO_GPEGMUX1_GPIO143_M 0xC0000000U // Defines pin-muxing selection for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPEGMUX2_GPIO144_S 0U +#define GPIO_GPEGMUX2_GPIO144_M 0x3U // Defines pin-muxing selection for GPIO144 +#define GPIO_GPEGMUX2_GPIO145_S 2U +#define GPIO_GPEGMUX2_GPIO145_M 0xCU // Defines pin-muxing selection for GPIO145 +#define GPIO_GPEGMUX2_GPIO146_S 4U +#define GPIO_GPEGMUX2_GPIO146_M 0x30U // Defines pin-muxing selection for GPIO146 +#define GPIO_GPEGMUX2_GPIO147_S 6U +#define GPIO_GPEGMUX2_GPIO147_M 0xC0U // Defines pin-muxing selection for GPIO147 +#define GPIO_GPEGMUX2_GPIO148_S 8U +#define GPIO_GPEGMUX2_GPIO148_M 0x300U // Defines pin-muxing selection for GPIO148 +#define GPIO_GPEGMUX2_GPIO149_S 10U +#define GPIO_GPEGMUX2_GPIO149_M 0xC00U // Defines pin-muxing selection for GPIO149 +#define GPIO_GPEGMUX2_GPIO150_S 12U +#define GPIO_GPEGMUX2_GPIO150_M 0x3000U // Defines pin-muxing selection for GPIO150 +#define GPIO_GPEGMUX2_GPIO151_S 14U +#define GPIO_GPEGMUX2_GPIO151_M 0xC000U // Defines pin-muxing selection for GPIO151 +#define GPIO_GPEGMUX2_GPIO152_S 16U +#define GPIO_GPEGMUX2_GPIO152_M 0x30000U // Defines pin-muxing selection for GPIO152 +#define GPIO_GPEGMUX2_GPIO153_S 18U +#define GPIO_GPEGMUX2_GPIO153_M 0xC0000U // Defines pin-muxing selection for GPIO153 +#define GPIO_GPEGMUX2_GPIO154_S 20U +#define GPIO_GPEGMUX2_GPIO154_M 0x300000U // Defines pin-muxing selection for GPIO154 +#define GPIO_GPEGMUX2_GPIO155_S 22U +#define GPIO_GPEGMUX2_GPIO155_M 0xC00000U // Defines pin-muxing selection for GPIO155 +#define GPIO_GPEGMUX2_GPIO156_S 24U +#define GPIO_GPEGMUX2_GPIO156_M 0x3000000U // Defines pin-muxing selection for GPIO156 +#define GPIO_GPEGMUX2_GPIO157_S 26U +#define GPIO_GPEGMUX2_GPIO157_M 0xC000000U // Defines pin-muxing selection for GPIO157 +#define GPIO_GPEGMUX2_GPIO158_S 28U +#define GPIO_GPEGMUX2_GPIO158_M 0x30000000U // Defines pin-muxing selection for GPIO158 +#define GPIO_GPEGMUX2_GPIO159_S 30U +#define GPIO_GPEGMUX2_GPIO159_M 0xC0000000U // Defines pin-muxing selection for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL1 register +// +//************************************************************************************************* +#define GPIO_GPECSEL1_GPIO128_S 0U +#define GPIO_GPECSEL1_GPIO128_M 0xFU // GPIO128 Master CPU Select +#define GPIO_GPECSEL1_GPIO129_S 4U +#define GPIO_GPECSEL1_GPIO129_M 0xF0U // GPIO129 Master CPU Select +#define GPIO_GPECSEL1_GPIO130_S 8U +#define GPIO_GPECSEL1_GPIO130_M 0xF00U // GPIO130 Master CPU Select +#define GPIO_GPECSEL1_GPIO131_S 12U +#define GPIO_GPECSEL1_GPIO131_M 0xF000U // GPIO131 Master CPU Select +#define GPIO_GPECSEL1_GPIO132_S 16U +#define GPIO_GPECSEL1_GPIO132_M 0xF0000U // GPIO132 Master CPU Select +#define GPIO_GPECSEL1_GPIO133_S 20U +#define GPIO_GPECSEL1_GPIO133_M 0xF00000U // GPIO133 Master CPU Select +#define GPIO_GPECSEL1_GPIO134_S 24U +#define GPIO_GPECSEL1_GPIO134_M 0xF000000U // GPIO134 Master CPU Select +#define GPIO_GPECSEL1_GPIO135_S 28U +#define GPIO_GPECSEL1_GPIO135_M 0xF0000000U // GPIO135 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL2 register +// +//************************************************************************************************* +#define GPIO_GPECSEL2_GPIO136_S 0U +#define GPIO_GPECSEL2_GPIO136_M 0xFU // GPIO136 Master CPU Select +#define GPIO_GPECSEL2_GPIO137_S 4U +#define GPIO_GPECSEL2_GPIO137_M 0xF0U // GPIO137 Master CPU Select +#define GPIO_GPECSEL2_GPIO138_S 8U +#define GPIO_GPECSEL2_GPIO138_M 0xF00U // GPIO138 Master CPU Select +#define GPIO_GPECSEL2_GPIO139_S 12U +#define GPIO_GPECSEL2_GPIO139_M 0xF000U // GPIO139 Master CPU Select +#define GPIO_GPECSEL2_GPIO140_S 16U +#define GPIO_GPECSEL2_GPIO140_M 0xF0000U // GPIO140 Master CPU Select +#define GPIO_GPECSEL2_GPIO141_S 20U +#define GPIO_GPECSEL2_GPIO141_M 0xF00000U // GPIO141 Master CPU Select +#define GPIO_GPECSEL2_GPIO142_S 24U +#define GPIO_GPECSEL2_GPIO142_M 0xF000000U // GPIO142 Master CPU Select +#define GPIO_GPECSEL2_GPIO143_S 28U +#define GPIO_GPECSEL2_GPIO143_M 0xF0000000U // GPIO143 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL3 register +// +//************************************************************************************************* +#define GPIO_GPECSEL3_GPIO144_S 0U +#define GPIO_GPECSEL3_GPIO144_M 0xFU // GPIO144 Master CPU Select +#define GPIO_GPECSEL3_GPIO145_S 4U +#define GPIO_GPECSEL3_GPIO145_M 0xF0U // GPIO145 Master CPU Select +#define GPIO_GPECSEL3_GPIO146_S 8U +#define GPIO_GPECSEL3_GPIO146_M 0xF00U // GPIO146 Master CPU Select +#define GPIO_GPECSEL3_GPIO147_S 12U +#define GPIO_GPECSEL3_GPIO147_M 0xF000U // GPIO147 Master CPU Select +#define GPIO_GPECSEL3_GPIO148_S 16U +#define GPIO_GPECSEL3_GPIO148_M 0xF0000U // GPIO148 Master CPU Select +#define GPIO_GPECSEL3_GPIO149_S 20U +#define GPIO_GPECSEL3_GPIO149_M 0xF00000U // GPIO149 Master CPU Select +#define GPIO_GPECSEL3_GPIO150_S 24U +#define GPIO_GPECSEL3_GPIO150_M 0xF000000U // GPIO150 Master CPU Select +#define GPIO_GPECSEL3_GPIO151_S 28U +#define GPIO_GPECSEL3_GPIO151_M 0xF0000000U // GPIO151 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL4 register +// +//************************************************************************************************* +#define GPIO_GPECSEL4_GPIO152_S 0U +#define GPIO_GPECSEL4_GPIO152_M 0xFU // GPIO152 Master CPU Select +#define GPIO_GPECSEL4_GPIO153_S 4U +#define GPIO_GPECSEL4_GPIO153_M 0xF0U // GPIO153 Master CPU Select +#define GPIO_GPECSEL4_GPIO154_S 8U +#define GPIO_GPECSEL4_GPIO154_M 0xF00U // GPIO154 Master CPU Select +#define GPIO_GPECSEL4_GPIO155_S 12U +#define GPIO_GPECSEL4_GPIO155_M 0xF000U // GPIO155 Master CPU Select +#define GPIO_GPECSEL4_GPIO156_S 16U +#define GPIO_GPECSEL4_GPIO156_M 0xF0000U // GPIO156 Master CPU Select +#define GPIO_GPECSEL4_GPIO157_S 20U +#define GPIO_GPECSEL4_GPIO157_M 0xF00000U // GPIO157 Master CPU Select +#define GPIO_GPECSEL4_GPIO158_S 24U +#define GPIO_GPECSEL4_GPIO158_M 0xF000000U // GPIO158 Master CPU Select +#define GPIO_GPECSEL4_GPIO159_S 28U +#define GPIO_GPECSEL4_GPIO159_M 0xF0000000U // GPIO159 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPELOCK register +// +//************************************************************************************************* +#define GPIO_GPELOCK_GPIO128 0x1U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO129 0x2U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO130 0x4U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO131 0x8U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO132 0x10U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO133 0x20U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO134 0x40U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO135 0x80U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO136 0x100U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO137 0x200U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO138 0x400U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO139 0x800U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO140 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO141 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO142 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO143 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO144 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO145 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO146 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO147 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO148 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO149 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO150 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO151 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO152 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO153 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO154 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO155 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO156 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO157 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO158 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO159 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECR register +// +//************************************************************************************************* +#define GPIO_GPECR_GPIO128 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO129 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO130 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO131 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO132 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO133 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO134 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO135 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO136 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO137 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO138 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO139 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO140 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO141 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO142 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO143 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO144 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO145 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO146 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO147 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO148 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO149 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO150 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO151 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO152 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO153 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO154 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO155 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO156 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO157 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO158 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO159 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCTRL register +// +//************************************************************************************************* +#define GPIO_GPFCTRL_QUALPRD0_S 0U +#define GPIO_GPFCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO160 to GPIO167 +#define GPIO_GPFCTRL_QUALPRD1_S 8U +#define GPIO_GPFCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPFQSEL1_GPIO160_S 0U +#define GPIO_GPFQSEL1_GPIO160_M 0x3U // Select input qualification type for GPIO160 +#define GPIO_GPFQSEL1_GPIO161_S 2U +#define GPIO_GPFQSEL1_GPIO161_M 0xCU // Select input qualification type for GPIO161 +#define GPIO_GPFQSEL1_GPIO162_S 4U +#define GPIO_GPFQSEL1_GPIO162_M 0x30U // Select input qualification type for GPIO162 +#define GPIO_GPFQSEL1_GPIO163_S 6U +#define GPIO_GPFQSEL1_GPIO163_M 0xC0U // Select input qualification type for GPIO163 +#define GPIO_GPFQSEL1_GPIO164_S 8U +#define GPIO_GPFQSEL1_GPIO164_M 0x300U // Select input qualification type for GPIO164 +#define GPIO_GPFQSEL1_GPIO165_S 10U +#define GPIO_GPFQSEL1_GPIO165_M 0xC00U // Select input qualification type for GPIO165 +#define GPIO_GPFQSEL1_GPIO166_S 12U +#define GPIO_GPFQSEL1_GPIO166_M 0x3000U // Select input qualification type for GPIO166 +#define GPIO_GPFQSEL1_GPIO167_S 14U +#define GPIO_GPFQSEL1_GPIO167_M 0xC000U // Select input qualification type for GPIO167 +#define GPIO_GPFQSEL1_GPIO168_S 16U +#define GPIO_GPFQSEL1_GPIO168_M 0x30000U // Select input qualification type for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFMUX1 register +// +//************************************************************************************************* +#define GPIO_GPFMUX1_GPIO160_S 0U +#define GPIO_GPFMUX1_GPIO160_M 0x3U // Defines pin-muxing selection for GPIO160 +#define GPIO_GPFMUX1_GPIO161_S 2U +#define GPIO_GPFMUX1_GPIO161_M 0xCU // Defines pin-muxing selection for GPIO161 +#define GPIO_GPFMUX1_GPIO162_S 4U +#define GPIO_GPFMUX1_GPIO162_M 0x30U // Defines pin-muxing selection for GPIO162 +#define GPIO_GPFMUX1_GPIO163_S 6U +#define GPIO_GPFMUX1_GPIO163_M 0xC0U // Defines pin-muxing selection for GPIO163 +#define GPIO_GPFMUX1_GPIO164_S 8U +#define GPIO_GPFMUX1_GPIO164_M 0x300U // Defines pin-muxing selection for GPIO164 +#define GPIO_GPFMUX1_GPIO165_S 10U +#define GPIO_GPFMUX1_GPIO165_M 0xC00U // Defines pin-muxing selection for GPIO165 +#define GPIO_GPFMUX1_GPIO166_S 12U +#define GPIO_GPFMUX1_GPIO166_M 0x3000U // Defines pin-muxing selection for GPIO166 +#define GPIO_GPFMUX1_GPIO167_S 14U +#define GPIO_GPFMUX1_GPIO167_M 0xC000U // Defines pin-muxing selection for GPIO167 +#define GPIO_GPFMUX1_GPIO168_S 16U +#define GPIO_GPFMUX1_GPIO168_M 0x30000U // Defines pin-muxing selection for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFDIR register +// +//************************************************************************************************* +#define GPIO_GPFDIR_GPIO160 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO161 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO162 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO163 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO164 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO165 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO166 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO167 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO168 0x100U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFPUD register +// +//************************************************************************************************* +#define GPIO_GPFPUD_GPIO160 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO161 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO162 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO163 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO164 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO165 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO166 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO167 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO168 0x100U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFINV register +// +//************************************************************************************************* +#define GPIO_GPFINV_GPIO160 0x1U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO161 0x2U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO162 0x4U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO163 0x8U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO164 0x10U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO165 0x20U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO166 0x40U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO167 0x80U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO168 0x100U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFODR register +// +//************************************************************************************************* +#define GPIO_GPFODR_GPIO160 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO161 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO162 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO163 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO164 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO165 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO166 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO167 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO168 0x100U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPFGMUX1_GPIO160_S 0U +#define GPIO_GPFGMUX1_GPIO160_M 0x3U // Defines pin-muxing selection for GPIO160 +#define GPIO_GPFGMUX1_GPIO161_S 2U +#define GPIO_GPFGMUX1_GPIO161_M 0xCU // Defines pin-muxing selection for GPIO161 +#define GPIO_GPFGMUX1_GPIO162_S 4U +#define GPIO_GPFGMUX1_GPIO162_M 0x30U // Defines pin-muxing selection for GPIO162 +#define GPIO_GPFGMUX1_GPIO163_S 6U +#define GPIO_GPFGMUX1_GPIO163_M 0xC0U // Defines pin-muxing selection for GPIO163 +#define GPIO_GPFGMUX1_GPIO164_S 8U +#define GPIO_GPFGMUX1_GPIO164_M 0x300U // Defines pin-muxing selection for GPIO164 +#define GPIO_GPFGMUX1_GPIO165_S 10U +#define GPIO_GPFGMUX1_GPIO165_M 0xC00U // Defines pin-muxing selection for GPIO165 +#define GPIO_GPFGMUX1_GPIO166_S 12U +#define GPIO_GPFGMUX1_GPIO166_M 0x3000U // Defines pin-muxing selection for GPIO166 +#define GPIO_GPFGMUX1_GPIO167_S 14U +#define GPIO_GPFGMUX1_GPIO167_M 0xC000U // Defines pin-muxing selection for GPIO167 +#define GPIO_GPFGMUX1_GPIO168_S 16U +#define GPIO_GPFGMUX1_GPIO168_M 0x30000U // Defines pin-muxing selection for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPFCSEL1_GPIO160_S 0U +#define GPIO_GPFCSEL1_GPIO160_M 0xFU // GPIO160 Master CPU Select +#define GPIO_GPFCSEL1_GPIO161_S 4U +#define GPIO_GPFCSEL1_GPIO161_M 0xF0U // GPIO161 Master CPU Select +#define GPIO_GPFCSEL1_GPIO162_S 8U +#define GPIO_GPFCSEL1_GPIO162_M 0xF00U // GPIO162 Master CPU Select +#define GPIO_GPFCSEL1_GPIO163_S 12U +#define GPIO_GPFCSEL1_GPIO163_M 0xF000U // GPIO163 Master CPU Select +#define GPIO_GPFCSEL1_GPIO164_S 16U +#define GPIO_GPFCSEL1_GPIO164_M 0xF0000U // GPIO164 Master CPU Select +#define GPIO_GPFCSEL1_GPIO165_S 20U +#define GPIO_GPFCSEL1_GPIO165_M 0xF00000U // GPIO165 Master CPU Select +#define GPIO_GPFCSEL1_GPIO166_S 24U +#define GPIO_GPFCSEL1_GPIO166_M 0xF000000U // GPIO166 Master CPU Select +#define GPIO_GPFCSEL1_GPIO167_S 28U +#define GPIO_GPFCSEL1_GPIO167_M 0xF0000000U // GPIO167 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPFCSEL2_GPIO168_S 0U +#define GPIO_GPFCSEL2_GPIO168_M 0xFU // GPIO168 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFLOCK register +// +//************************************************************************************************* +#define GPIO_GPFLOCK_GPIO160 0x1U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO161 0x2U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO162 0x4U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO163 0x8U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO164 0x10U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO165 0x20U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO166 0x40U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO167 0x80U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO168 0x100U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCR register +// +//************************************************************************************************* +#define GPIO_GPFCR_GPIO160 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO161 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO162 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO163 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO164 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO165 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO166 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO167 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO168 0x100U // Configuration lock commit bit for this pin + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPADAT register +// +//************************************************************************************************* +#define GPIO_GPADAT_GPIO0 0x1U // Data Register for this pin +#define GPIO_GPADAT_GPIO1 0x2U // Data Register for this pin +#define GPIO_GPADAT_GPIO2 0x4U // Data Register for this pin +#define GPIO_GPADAT_GPIO3 0x8U // Data Register for this pin +#define GPIO_GPADAT_GPIO4 0x10U // Data Register for this pin +#define GPIO_GPADAT_GPIO5 0x20U // Data Register for this pin +#define GPIO_GPADAT_GPIO6 0x40U // Data Register for this pin +#define GPIO_GPADAT_GPIO7 0x80U // Data Register for this pin +#define GPIO_GPADAT_GPIO8 0x100U // Data Register for this pin +#define GPIO_GPADAT_GPIO9 0x200U // Data Register for this pin +#define GPIO_GPADAT_GPIO10 0x400U // Data Register for this pin +#define GPIO_GPADAT_GPIO11 0x800U // Data Register for this pin +#define GPIO_GPADAT_GPIO12 0x1000U // Data Register for this pin +#define GPIO_GPADAT_GPIO13 0x2000U // Data Register for this pin +#define GPIO_GPADAT_GPIO14 0x4000U // Data Register for this pin +#define GPIO_GPADAT_GPIO15 0x8000U // Data Register for this pin +#define GPIO_GPADAT_GPIO16 0x10000U // Data Register for this pin +#define GPIO_GPADAT_GPIO17 0x20000U // Data Register for this pin +#define GPIO_GPADAT_GPIO18 0x40000U // Data Register for this pin +#define GPIO_GPADAT_GPIO19 0x80000U // Data Register for this pin +#define GPIO_GPADAT_GPIO20 0x100000U // Data Register for this pin +#define GPIO_GPADAT_GPIO21 0x200000U // Data Register for this pin +#define GPIO_GPADAT_GPIO22 0x400000U // Data Register for this pin +#define GPIO_GPADAT_GPIO23 0x800000U // Data Register for this pin +#define GPIO_GPADAT_GPIO24 0x1000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO25 0x2000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO26 0x4000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO27 0x8000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO28 0x10000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO29 0x20000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO30 0x40000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO31 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPASET register +// +//************************************************************************************************* +#define GPIO_GPASET_GPIO0 0x1U // Output Set bit for this pin +#define GPIO_GPASET_GPIO1 0x2U // Output Set bit for this pin +#define GPIO_GPASET_GPIO2 0x4U // Output Set bit for this pin +#define GPIO_GPASET_GPIO3 0x8U // Output Set bit for this pin +#define GPIO_GPASET_GPIO4 0x10U // Output Set bit for this pin +#define GPIO_GPASET_GPIO5 0x20U // Output Set bit for this pin +#define GPIO_GPASET_GPIO6 0x40U // Output Set bit for this pin +#define GPIO_GPASET_GPIO7 0x80U // Output Set bit for this pin +#define GPIO_GPASET_GPIO8 0x100U // Output Set bit for this pin +#define GPIO_GPASET_GPIO9 0x200U // Output Set bit for this pin +#define GPIO_GPASET_GPIO10 0x400U // Output Set bit for this pin +#define GPIO_GPASET_GPIO11 0x800U // Output Set bit for this pin +#define GPIO_GPASET_GPIO12 0x1000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO13 0x2000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO14 0x4000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO15 0x8000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO16 0x10000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO17 0x20000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO18 0x40000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO19 0x80000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO20 0x100000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO21 0x200000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO22 0x400000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO23 0x800000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO24 0x1000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO25 0x2000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO26 0x4000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO27 0x8000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO28 0x10000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO29 0x20000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO30 0x40000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO31 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACLEAR register +// +//************************************************************************************************* +#define GPIO_GPACLEAR_GPIO0 0x1U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO1 0x2U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO2 0x4U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO3 0x8U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO4 0x10U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO5 0x20U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO6 0x40U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO7 0x80U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO8 0x100U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO9 0x200U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO10 0x400U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO11 0x800U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO12 0x1000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO13 0x2000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO14 0x4000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO15 0x8000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO16 0x10000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO17 0x20000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO18 0x40000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO19 0x80000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO20 0x100000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO21 0x200000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO22 0x400000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO23 0x800000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO24 0x1000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO25 0x2000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO26 0x4000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO27 0x8000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO28 0x10000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO29 0x20000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO30 0x40000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO31 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPATOGGLE register +// +//************************************************************************************************* +#define GPIO_GPATOGGLE_GPIO0 0x1U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO1 0x2U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO2 0x4U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO3 0x8U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO4 0x10U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO5 0x20U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO6 0x40U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO7 0x80U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO8 0x100U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO9 0x200U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO10 0x400U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO11 0x800U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO12 0x1000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO13 0x2000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO14 0x4000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO15 0x8000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO16 0x10000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO17 0x20000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO18 0x40000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO19 0x80000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO20 0x100000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO21 0x200000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO22 0x400000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO23 0x800000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO24 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO25 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO26 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO27 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO28 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO29 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO30 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO31 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBDAT register +// +//************************************************************************************************* +#define GPIO_GPBDAT_GPIO32 0x1U // Data Register for this pin +#define GPIO_GPBDAT_GPIO33 0x2U // Data Register for this pin +#define GPIO_GPBDAT_GPIO34 0x4U // Data Register for this pin +#define GPIO_GPBDAT_GPIO35 0x8U // Data Register for this pin +#define GPIO_GPBDAT_GPIO36 0x10U // Data Register for this pin +#define GPIO_GPBDAT_GPIO37 0x20U // Data Register for this pin +#define GPIO_GPBDAT_GPIO38 0x40U // Data Register for this pin +#define GPIO_GPBDAT_GPIO39 0x80U // Data Register for this pin +#define GPIO_GPBDAT_GPIO40 0x100U // Data Register for this pin +#define GPIO_GPBDAT_GPIO41 0x200U // Data Register for this pin +#define GPIO_GPBDAT_GPIO42 0x400U // Data Register for this pin +#define GPIO_GPBDAT_GPIO43 0x800U // Data Register for this pin +#define GPIO_GPBDAT_GPIO44 0x1000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO45 0x2000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO46 0x4000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO47 0x8000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO48 0x10000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO49 0x20000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO50 0x40000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO51 0x80000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO52 0x100000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO53 0x200000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO54 0x400000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO55 0x800000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO56 0x1000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO57 0x2000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO58 0x4000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO59 0x8000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO60 0x10000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO61 0x20000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO62 0x40000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO63 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBSET register +// +//************************************************************************************************* +#define GPIO_GPBSET_GPIO32 0x1U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO33 0x2U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO34 0x4U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO35 0x8U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO36 0x10U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO37 0x20U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO38 0x40U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO39 0x80U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO40 0x100U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO41 0x200U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO42 0x400U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO43 0x800U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO44 0x1000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO45 0x2000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO46 0x4000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO47 0x8000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO48 0x10000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO49 0x20000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO50 0x40000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO51 0x80000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO52 0x100000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO53 0x200000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO54 0x400000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO55 0x800000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO56 0x1000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO57 0x2000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO58 0x4000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO59 0x8000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO60 0x10000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO61 0x20000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO62 0x40000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO63 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCLEAR register +// +//************************************************************************************************* +#define GPIO_GPBCLEAR_GPIO32 0x1U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO33 0x2U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO34 0x4U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO35 0x8U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO36 0x10U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO37 0x20U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO38 0x40U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO39 0x80U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO40 0x100U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO41 0x200U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO42 0x400U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO43 0x800U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO44 0x1000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO45 0x2000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO46 0x4000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO47 0x8000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO48 0x10000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO49 0x20000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO50 0x40000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO51 0x80000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO52 0x100000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO53 0x200000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO54 0x400000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO55 0x800000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO56 0x1000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO57 0x2000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO58 0x4000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO59 0x8000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO60 0x10000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO61 0x20000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO62 0x40000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO63 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPBTOGGLE_GPIO32 0x1U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO33 0x2U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO34 0x4U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO35 0x8U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO36 0x10U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO37 0x20U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO38 0x40U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO39 0x80U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO40 0x100U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO41 0x200U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO42 0x400U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO43 0x800U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO44 0x1000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO45 0x2000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO46 0x4000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO47 0x8000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO48 0x10000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO49 0x20000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO50 0x40000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO51 0x80000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO52 0x100000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO53 0x200000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO54 0x400000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO55 0x800000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO56 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO57 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO58 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO59 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO60 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO61 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO62 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO63 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCDAT register +// +//************************************************************************************************* +#define GPIO_GPCDAT_GPIO64 0x1U // Data Register for this pin +#define GPIO_GPCDAT_GPIO65 0x2U // Data Register for this pin +#define GPIO_GPCDAT_GPIO66 0x4U // Data Register for this pin +#define GPIO_GPCDAT_GPIO67 0x8U // Data Register for this pin +#define GPIO_GPCDAT_GPIO68 0x10U // Data Register for this pin +#define GPIO_GPCDAT_GPIO69 0x20U // Data Register for this pin +#define GPIO_GPCDAT_GPIO70 0x40U // Data Register for this pin +#define GPIO_GPCDAT_GPIO71 0x80U // Data Register for this pin +#define GPIO_GPCDAT_GPIO72 0x100U // Data Register for this pin +#define GPIO_GPCDAT_GPIO73 0x200U // Data Register for this pin +#define GPIO_GPCDAT_GPIO74 0x400U // Data Register for this pin +#define GPIO_GPCDAT_GPIO75 0x800U // Data Register for this pin +#define GPIO_GPCDAT_GPIO76 0x1000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO77 0x2000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO78 0x4000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO79 0x8000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO80 0x10000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO81 0x20000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO82 0x40000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO83 0x80000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO84 0x100000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO85 0x200000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO86 0x400000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO87 0x800000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO88 0x1000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO89 0x2000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO90 0x4000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO91 0x8000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO92 0x10000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO93 0x20000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO94 0x40000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO95 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCSET register +// +//************************************************************************************************* +#define GPIO_GPCSET_GPIO64 0x1U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO65 0x2U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO66 0x4U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO67 0x8U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO68 0x10U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO69 0x20U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO70 0x40U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO71 0x80U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO72 0x100U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO73 0x200U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO74 0x400U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO75 0x800U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO76 0x1000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO77 0x2000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO78 0x4000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO79 0x8000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO80 0x10000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO81 0x20000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO82 0x40000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO83 0x80000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO84 0x100000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO85 0x200000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO86 0x400000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO87 0x800000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO88 0x1000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO89 0x2000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO90 0x4000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO91 0x8000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO92 0x10000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO93 0x20000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO94 0x40000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO95 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCLEAR register +// +//************************************************************************************************* +#define GPIO_GPCCLEAR_GPIO64 0x1U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO65 0x2U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO66 0x4U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO67 0x8U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO68 0x10U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO69 0x20U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO70 0x40U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO71 0x80U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO72 0x100U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO73 0x200U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO74 0x400U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO75 0x800U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO76 0x1000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO77 0x2000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO78 0x4000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO79 0x8000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO80 0x10000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO81 0x20000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO82 0x40000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO83 0x80000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO84 0x100000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO85 0x200000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO86 0x400000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO87 0x800000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO88 0x1000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO89 0x2000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO90 0x4000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO91 0x8000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO92 0x10000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO93 0x20000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO94 0x40000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO95 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPCTOGGLE_GPIO64 0x1U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO65 0x2U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO66 0x4U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO67 0x8U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO68 0x10U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO69 0x20U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO70 0x40U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO71 0x80U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO72 0x100U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO73 0x200U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO74 0x400U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO75 0x800U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO76 0x1000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO77 0x2000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO78 0x4000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO79 0x8000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO80 0x10000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO81 0x20000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO82 0x40000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO83 0x80000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO84 0x100000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO85 0x200000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO86 0x400000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO87 0x800000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO88 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO89 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO90 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO91 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO92 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO93 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO94 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO95 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDDAT register +// +//************************************************************************************************* +#define GPIO_GPDDAT_GPIO96 0x1U // Data Register for this pin +#define GPIO_GPDDAT_GPIO97 0x2U // Data Register for this pin +#define GPIO_GPDDAT_GPIO98 0x4U // Data Register for this pin +#define GPIO_GPDDAT_GPIO99 0x8U // Data Register for this pin +#define GPIO_GPDDAT_GPIO100 0x10U // Data Register for this pin +#define GPIO_GPDDAT_GPIO101 0x20U // Data Register for this pin +#define GPIO_GPDDAT_GPIO102 0x40U // Data Register for this pin +#define GPIO_GPDDAT_GPIO103 0x80U // Data Register for this pin +#define GPIO_GPDDAT_GPIO104 0x100U // Data Register for this pin +#define GPIO_GPDDAT_GPIO105 0x200U // Data Register for this pin +#define GPIO_GPDDAT_GPIO106 0x400U // Data Register for this pin +#define GPIO_GPDDAT_GPIO107 0x800U // Data Register for this pin +#define GPIO_GPDDAT_GPIO108 0x1000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO109 0x2000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO110 0x4000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO111 0x8000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO112 0x10000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO113 0x20000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO114 0x40000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO115 0x80000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO116 0x100000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO117 0x200000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO118 0x400000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO119 0x800000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO120 0x1000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO121 0x2000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO122 0x4000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO123 0x8000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO124 0x10000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO125 0x20000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO126 0x40000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO127 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDSET register +// +//************************************************************************************************* +#define GPIO_GPDSET_GPIO96 0x1U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO97 0x2U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO98 0x4U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO99 0x8U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO100 0x10U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO101 0x20U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO102 0x40U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO103 0x80U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO104 0x100U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO105 0x200U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO106 0x400U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO107 0x800U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO108 0x1000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO109 0x2000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO110 0x4000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO111 0x8000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO112 0x10000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO113 0x20000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO114 0x40000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO115 0x80000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO116 0x100000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO117 0x200000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO118 0x400000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO119 0x800000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO120 0x1000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO121 0x2000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO122 0x4000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO123 0x8000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO124 0x10000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO125 0x20000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO126 0x40000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO127 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCLEAR register +// +//************************************************************************************************* +#define GPIO_GPDCLEAR_GPIO96 0x1U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO97 0x2U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO98 0x4U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO99 0x8U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO100 0x10U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO101 0x20U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO102 0x40U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO103 0x80U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO104 0x100U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO105 0x200U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO106 0x400U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO107 0x800U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO108 0x1000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO109 0x2000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO110 0x4000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO111 0x8000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO112 0x10000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO113 0x20000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO114 0x40000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO115 0x80000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO116 0x100000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO117 0x200000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO118 0x400000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO119 0x800000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO120 0x1000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO121 0x2000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO122 0x4000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO123 0x8000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO124 0x10000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO125 0x20000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO126 0x40000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO127 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPDTOGGLE_GPIO96 0x1U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO97 0x2U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO98 0x4U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO99 0x8U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO100 0x10U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO101 0x20U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO102 0x40U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO103 0x80U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO104 0x100U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO105 0x200U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO106 0x400U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO107 0x800U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO108 0x1000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO109 0x2000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO110 0x4000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO111 0x8000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO112 0x10000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO113 0x20000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO114 0x40000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO115 0x80000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO116 0x100000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO117 0x200000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO118 0x400000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO119 0x800000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO120 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO121 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO122 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO123 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO124 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO125 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO126 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO127 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEDAT register +// +//************************************************************************************************* +#define GPIO_GPEDAT_GPIO128 0x1U // Data Register for this pin +#define GPIO_GPEDAT_GPIO129 0x2U // Data Register for this pin +#define GPIO_GPEDAT_GPIO130 0x4U // Data Register for this pin +#define GPIO_GPEDAT_GPIO131 0x8U // Data Register for this pin +#define GPIO_GPEDAT_GPIO132 0x10U // Data Register for this pin +#define GPIO_GPEDAT_GPIO133 0x20U // Data Register for this pin +#define GPIO_GPEDAT_GPIO134 0x40U // Data Register for this pin +#define GPIO_GPEDAT_GPIO135 0x80U // Data Register for this pin +#define GPIO_GPEDAT_GPIO136 0x100U // Data Register for this pin +#define GPIO_GPEDAT_GPIO137 0x200U // Data Register for this pin +#define GPIO_GPEDAT_GPIO138 0x400U // Data Register for this pin +#define GPIO_GPEDAT_GPIO139 0x800U // Data Register for this pin +#define GPIO_GPEDAT_GPIO140 0x1000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO141 0x2000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO142 0x4000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO143 0x8000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO144 0x10000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO145 0x20000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO146 0x40000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO147 0x80000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO148 0x100000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO149 0x200000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO150 0x400000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO151 0x800000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO152 0x1000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO153 0x2000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO154 0x4000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO155 0x8000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO156 0x10000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO157 0x20000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO158 0x40000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO159 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPESET register +// +//************************************************************************************************* +#define GPIO_GPESET_GPIO128 0x1U // Output Set bit for this pin +#define GPIO_GPESET_GPIO129 0x2U // Output Set bit for this pin +#define GPIO_GPESET_GPIO130 0x4U // Output Set bit for this pin +#define GPIO_GPESET_GPIO131 0x8U // Output Set bit for this pin +#define GPIO_GPESET_GPIO132 0x10U // Output Set bit for this pin +#define GPIO_GPESET_GPIO133 0x20U // Output Set bit for this pin +#define GPIO_GPESET_GPIO134 0x40U // Output Set bit for this pin +#define GPIO_GPESET_GPIO135 0x80U // Output Set bit for this pin +#define GPIO_GPESET_GPIO136 0x100U // Output Set bit for this pin +#define GPIO_GPESET_GPIO137 0x200U // Output Set bit for this pin +#define GPIO_GPESET_GPIO138 0x400U // Output Set bit for this pin +#define GPIO_GPESET_GPIO139 0x800U // Output Set bit for this pin +#define GPIO_GPESET_GPIO140 0x1000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO141 0x2000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO142 0x4000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO143 0x8000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO144 0x10000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO145 0x20000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO146 0x40000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO147 0x80000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO148 0x100000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO149 0x200000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO150 0x400000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO151 0x800000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO152 0x1000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO153 0x2000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO154 0x4000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO155 0x8000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO156 0x10000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO157 0x20000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO158 0x40000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO159 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECLEAR register +// +//************************************************************************************************* +#define GPIO_GPECLEAR_GPIO128 0x1U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO129 0x2U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO130 0x4U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO131 0x8U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO132 0x10U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO133 0x20U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO134 0x40U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO135 0x80U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO136 0x100U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO137 0x200U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO138 0x400U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO139 0x800U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO140 0x1000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO141 0x2000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO142 0x4000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO143 0x8000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO144 0x10000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO145 0x20000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO146 0x40000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO147 0x80000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO148 0x100000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO149 0x200000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO150 0x400000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO151 0x800000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO152 0x1000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO153 0x2000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO154 0x4000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO155 0x8000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO156 0x10000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO157 0x20000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO158 0x40000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO159 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPETOGGLE register +// +//************************************************************************************************* +#define GPIO_GPETOGGLE_GPIO128 0x1U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO129 0x2U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO130 0x4U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO131 0x8U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO132 0x10U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO133 0x20U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO134 0x40U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO135 0x80U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO136 0x100U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO137 0x200U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO138 0x400U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO139 0x800U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO140 0x1000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO141 0x2000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO142 0x4000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO143 0x8000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO144 0x10000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO145 0x20000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO146 0x40000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO147 0x80000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO148 0x100000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO149 0x200000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO150 0x400000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO151 0x800000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO152 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO153 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO154 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO155 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO156 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO157 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO158 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO159 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFDAT register +// +//************************************************************************************************* +#define GPIO_GPFDAT_GPIO160 0x1U // Data Register for this pin +#define GPIO_GPFDAT_GPIO161 0x2U // Data Register for this pin +#define GPIO_GPFDAT_GPIO162 0x4U // Data Register for this pin +#define GPIO_GPFDAT_GPIO163 0x8U // Data Register for this pin +#define GPIO_GPFDAT_GPIO164 0x10U // Data Register for this pin +#define GPIO_GPFDAT_GPIO165 0x20U // Data Register for this pin +#define GPIO_GPFDAT_GPIO166 0x40U // Data Register for this pin +#define GPIO_GPFDAT_GPIO167 0x80U // Data Register for this pin +#define GPIO_GPFDAT_GPIO168 0x100U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFSET register +// +//************************************************************************************************* +#define GPIO_GPFSET_GPIO160 0x1U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO161 0x2U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO162 0x4U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO163 0x8U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO164 0x10U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO165 0x20U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO166 0x40U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO167 0x80U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO168 0x100U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCLEAR register +// +//************************************************************************************************* +#define GPIO_GPFCLEAR_GPIO160 0x1U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO161 0x2U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO162 0x4U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO163 0x8U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO164 0x10U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO165 0x20U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO166 0x40U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO167 0x80U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO168 0x100U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPFTOGGLE_GPIO160 0x1U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO161 0x2U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO162 0x4U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO163 0x8U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO164 0x10U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO165 0x20U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO166 0x40U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO167 0x80U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO168 0x100U // Output Toggle bit for this pin + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_hic.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_hic.h new file mode 100644 index 0000000..07d544f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_hic.h @@ -0,0 +1,344 @@ +//########################################################################### +// +// FILE: hw_hic.h +// +// TITLE: Definitions for the HIC registers. +// +//########################################################################### +// $TI Release: $ +// $Release Date: $ +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_HIC_H +#define HW_HIC_H + +//************************************************************************************************* +// +// The following are defines for the HIC register offsets +// +//************************************************************************************************* +#define HIC_O_REV 0x0U // Module Revision Register +#define HIC_O_GCR 0x2U // Global Control Register +#define HIC_O_LOCK 0x4U // Lock Register +#define HIC_O_MODECR 0x6U // Mode Control Register +#define HIC_O_PINPOLCR 0x8U // Pin Polarity Control Register +#define HIC_O_BASESEL 0xAU // Base Select Register +#define HIC_O_HOSTCR 0xCU // Host Control Register +#define HIC_O_ERRADDR 0xEU // Host Error Address register +#define HIC_O_H2DTOKEN 0x10U // Host to Device Token Register +#define HIC_O_D2HTOKEN 0x12U // Devie to Host Token Register +#define HIC_O_DBADDR0 0x14U // Device Base Address Register 0 +#define HIC_O_DBADDR1 0x16U // Device Base Address Register 1 +#define HIC_O_DBADDR2 0x18U // Device Base Address Register 2 +#define HIC_O_DBADDR3 0x1AU // Device Base Address Register 3 +#define HIC_O_DBADDR4 0x1CU // Device Base Address Register 4 +#define HIC_O_DBADDR5 0x1EU // Device Base Address Register 5 +#define HIC_O_DBADDR6 0x20U // Device Base Address Register 6 +#define HIC_O_DBADDR7 0x22U // Device Base Address Register 7 +#define HIC_O_H2DINTEN 0x28U // H2D Interrupt Enable +#define HIC_O_H2DINTFLG 0x2AU // H2D Interrupt status Flag +#define HIC_O_H2DINTCLR 0x2CU // H2D Interrupt status Clear +#define HIC_O_H2DINTFRC 0x2EU // H2D Interrupt Set Force +#define HIC_O_D2HINTEN 0x30U // D2H Interrupt Enable +#define HIC_O_D2HINTFLG 0x32U // D2H Interrupt status Flag +#define HIC_O_D2HINTCLR 0x34U // D2H Interrupt status Clear +#define HIC_O_D2HINTFRC 0x36U // D2H Interrupt Set Force +#define HIC_O_ACCVIOADDR 0x38U // Access Violation Address +#define HIC_O_H2D_BUF0 0x40U // Host to Device Buffer 0 +#define HIC_O_H2D_BUF1 0x42U // Host to Device Buffer 1 +#define HIC_O_H2D_BUF2 0x44U // Host to Device Buffer 2 +#define HIC_O_H2D_BUF3 0x46U // Host to Device Buffer 3 +#define HIC_O_H2D_BUF4 0x48U // Host to Device Buffer 4 +#define HIC_O_H2D_BUF5 0x4AU // Host to Device Buffer 5 +#define HIC_O_H2D_BUF6 0x4CU // Host to Device Buffer 6 +#define HIC_O_H2D_BUF7 0x4EU // Host to Device Buffer 7 +#define HIC_O_H2D_BUF8 0x50U // Host to Device Buffer 8 +#define HIC_O_H2D_BUF9 0x52U // Host to Device Buffer 9 +#define HIC_O_H2D_BUF10 0x54U // Host to Device Buffer 10 +#define HIC_O_H2D_BUF11 0x56U // Host to Device Buffer 11 +#define HIC_O_H2D_BUF12 0x58U // Host to Device Buffer 12 +#define HIC_O_H2D_BUF13 0x5AU // Host to Device Buffer 13 +#define HIC_O_H2D_BUF14 0x5CU // Host to Device Buffer 14 +#define HIC_O_H2D_BUF15 0x5EU // Host to Device Buffer 15 +#define HIC_O_D2H_BUF0 0x60U // Device to Host Buffer 0 +#define HIC_O_D2H_BUF1 0x62U // Device to Host Buffer 1 +#define HIC_O_D2H_BUF2 0x64U // Device to Host Buffer 2 +#define HIC_O_D2H_BUF3 0x66U // Device to Host Buffer 3 +#define HIC_O_D2H_BUF4 0x68U // Device to Host Buffer 4 +#define HIC_O_D2H_BUF5 0x6AU // Device to Host Buffer 5 +#define HIC_O_D2H_BUF6 0x6CU // Device to Host Buffer 6 +#define HIC_O_D2H_BUF7 0x6EU // Device to Host Buffer 7 +#define HIC_O_D2H_BUF8 0x70U // Device to Host Buffer 8 +#define HIC_O_D2H_BUF9 0x72U // Device to Host Buffer 9 +#define HIC_O_D2H_BUF10 0x74U // Device to Host Buffer 10 +#define HIC_O_D2H_BUF11 0x76U // Device to Host Buffer 11 +#define HIC_O_D2H_BUF12 0x78U // Device to Host Buffer 12 +#define HIC_O_D2H_BUF13 0x7AU // Device to Host Buffer 13 +#define HIC_O_D2H_BUF14 0x7CU // Device to Host Buffer 14 +#define HIC_O_D2H_BUF15 0x7EU // Device to Host Buffer 15 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICREV register +// +//************************************************************************************************* +#define HIC_REV_MINOR_S 0U +#define HIC_REV_MINOR_M 0x3FU // Minor Revision Number +#define HIC_REV_CUSTOM_S 6U +#define HIC_REV_CUSTOM_M 0xC0U // Custom Module Number +#define HIC_REV_MAJOR_S 8U +#define HIC_REV_MAJOR_M 0x700U // Major Revision Number +#define HIC_REV_RTL_S 11U +#define HIC_REV_RTL_M 0xF800U // Design Release Number +#define HIC_REV_FUNC_S 16U +#define HIC_REV_FUNC_M 0xFFF0000U // Functional Release Number +#define HIC_REV_SCHEME_S 30U +#define HIC_REV_SCHEME_M 0xC0000000U // Defines Scheme for Module +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICGCR register +// +//************************************************************************************************* +#define HIC_GCR_HICEN_S 0U +#define HIC_GCR_HICEN_M 0xFU // Host Interface Enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICLOCK register +// +//************************************************************************************************* +#define HIC_LOCK_LOCK 0x1U // LOCK enable +#define HIC_LOCK_WRITE_ENABLE_KEY_S 16U +#define HIC_LOCK_WRITE_ENABLE_KEY_M 0xFFFF0000U // Key for enabling write +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICMODECR register +// +//************************************************************************************************* +#define HIC_MODECR_DW_MODE_S 0U +#define HIC_MODECR_DW_MODE_M 0x3U // Data Width Mode +#define HIC_MODECR_RW_MODE 0x10U // Read-Write Mode +#define HIC_MODECR_BEN_PRESENT 0x20U // Byte Enable Pins are present +#define HIC_MODECR_RDY_PRESENT 0x40U // Ready pin present +#define HIC_MODECR_H2DBUF_DEVWREN 0x100U // Write Enable for Device to H2D Buffer +#define HIC_MODECR_D2HBUF_HOSTWREN 0x200U // Write Enable for Host to D2H Buffer +#define HIC_MODECR_EN_DEVACC 0x400U // Enable Host access to Device region +#define HIC_MODECR_EN_HOSTWREALLOW 0x800U // Enable Host Write to EALLOWCTL register +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICPINPOLCR register +// +//************************************************************************************************* +#define HIC_PINPOLCR_CS_POL 0x1U // Chip Select Polarity +#define HIC_PINPOLCR_BEN_POL 0x2U // Byte Enable Polarity +#define HIC_PINPOLCR_OE_POL 0x4U // Output Enable Polarity +#define HIC_PINPOLCR_WE_POL 0x8U // Write Enable Polarity +#define HIC_PINPOLCR_RDY_POL 0x10U // Ready Polarity +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICBASESEL register +// +//************************************************************************************************* +#define HIC_BASESEL_BASE_SELECT_S 0U +#define HIC_BASESEL_BASE_SELECT_M 0x7U // Base Select +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICHOSTCR register +// +//************************************************************************************************* +#define HIC_HOSTCR_EALLOW_EN 0x1U // EALLOW Enable +#define HIC_HOSTCR_ACCSIZE 0x2U // Access Size +#define HIC_HOSTCR_PAGESEL 0x4U // Page Select +#define HIC_HOSTCR_HKEY_S 8U +#define HIC_HOSTCR_HKEY_M 0xFF00U // Host Key +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICERRADDR register +// +//************************************************************************************************* +#define HIC_ERRADDR_H2D_ERR_ADDR_S 0U +#define HIC_ERRADDR_H2D_ERR_ADDR_M 0xFFU // Address of the Host bus captured upon an + // error for Device +#define HIC_ERRADDR_H2D_BASE_SEL_S 12U +#define HIC_ERRADDR_H2D_BASE_SEL_M 0x7000U // Base Select corresponding to H2D error event +#define HIC_ERRADDR_D2H_ERR_ADDR_S 16U +#define HIC_ERRADDR_D2H_ERR_ADDR_M 0xFF0000U // Address of the Host bus captured upon an + // error for Host +#define HIC_ERRADDR_D2H_BASE_SEL_S 28U +#define HIC_ERRADDR_D2H_BASE_SEL_M 0x70000000U // Base Select corresponding to D2H error event +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR0 register +// +//************************************************************************************************* +#define HIC_DBADDR0_BASE_ADDR_S 7U +#define HIC_DBADDR0_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR1 register +// +//************************************************************************************************* +#define HIC_DBADDR1_BASE_ADDR_S 7U +#define HIC_DBADDR1_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR2 register +// +//************************************************************************************************* +#define HIC_DBADDR2_BASE_ADDR_S 7U +#define HIC_DBADDR2_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR3 register +// +//************************************************************************************************* +#define HIC_DBADDR3_BASE_ADDR_S 7U +#define HIC_DBADDR3_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR4 register +// +//************************************************************************************************* +#define HIC_DBADDR4_BASE_ADDR_S 7U +#define HIC_DBADDR4_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR5 register +// +//************************************************************************************************* +#define HIC_DBADDR5_BASE_ADDR_S 7U +#define HIC_DBADDR5_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR6 register +// +//************************************************************************************************* +#define HIC_DBADDR6_BASE_ADDR_S 7U +#define HIC_DBADDR6_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR7 register +// +//************************************************************************************************* +#define HIC_DBADDR7_BASE_ADDR_S 7U +#define HIC_DBADDR7_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTEN register +// +//************************************************************************************************* +#define HIC_H2DINTEN_H2D_INTEN 0x1U // Host To Device Interrupt Enable +#define HIC_H2DINTEN_BUSERR_INTEN 0x2U // BusError Interrupt Enable +#define HIC_H2DINTEN_ILLWR_INTEN 0x4U // Illegal Write event interrupt enable +#define HIC_H2DINTEN_ILLRD_INTEN 0x8U // Illegal Read event interrupt enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTFLG register +// +//************************************************************************************************* +#define HIC_H2DINTFLG_H2D_FLG 0x1U // Host To Device Interrupt Flag +#define HIC_H2DINTFLG_BUSERR_FLG 0x2U // BusError Interrupt Flag +#define HIC_H2DINTFLG_ILLWR_FLG 0x4U // Illegal write event interrupt flag +#define HIC_H2DINTFLG_ILLRD_FLG 0x8U // Illegal read event interrupt flag +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTCLR register +// +//************************************************************************************************* +#define HIC_H2DINTCLR_H2D_CLR 0x1U // Host To Device Interrupt Clear +#define HIC_H2DINTCLR_BUSERR_CLR 0x2U // BusError Interrupt Clear +#define HIC_H2DINTCLR_ILLWR_CLR 0x4U // Illegal Write Interrupt Clear +#define HIC_H2DINTCLR_ILLRD_CLR 0x8U // Illegal Read Interrupt Clear +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTFRC register +// +//************************************************************************************************* +#define HIC_H2DINTFRC_H2D_INTFRC 0x1U // Host To Device Force Set +#define HIC_H2DINTFRC_BUSERR_INTFRC 0x2U // BusError Interrupt Force Set +#define HIC_H2DINTFRC_ILLWR_INTFRC 0x4U // Illegal Write Interrupt Force Set +#define HIC_H2DINTFRC_ILLRD_INTFRC 0x8U // Illegal Read Interrupt Force Set +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTEN register +// +//************************************************************************************************* +#define HIC_D2HINTEN_D2H_INTEN 0x1U // Device to Host Data Ready Interrupt Enable +#define HIC_D2HINTEN_BUSERR_INTEN 0x2U // BusError Interrupt Enable +#define HIC_D2HINTEN_ILLWR_INTEN 0x4U // Illegal Write event Interrupt Enable +#define HIC_D2HINTEN_ILLRD_INTEN 0x8U // Illegal Read event Interrupt Enable +#define HIC_D2HINTEN_ACCVIO_INTEN 0x10U // Access Violation Interrupt Enable +#define HIC_D2HINTEN_EVTRIG_INTEN_S 16U +#define HIC_D2HINTEN_EVTRIG_INTEN_M 0xFFFF0000U // Event Trigger Interrupt Enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTFLG register +// +//************************************************************************************************* +#define HIC_D2HINTFLG_D2H_FLG 0x1U // Device to Host Data Ready Flag +#define HIC_D2HINTFLG_BUSERR_FLG 0x2U // BusError Flag +#define HIC_D2HINTFLG_ILLWR_FLG 0x4U // Illegal Write event Flag +#define HIC_D2HINTFLG_ILLRD_FLG 0x8U // Illegal Read event Flag +#define HIC_D2HINTFLG_ACCVIO_FLG 0x10U // Access Violation Flag +#define HIC_D2HINTFLG_EVTRIG_FLG_S 16U +#define HIC_D2HINTFLG_EVTRIG_FLG_M 0xFFFF0000U // Event Trigger Flag +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTCLR register +// +//************************************************************************************************* +#define HIC_D2HINTCLR_D2H_CLR 0x1U // Device to Host Interrupt Clear +#define HIC_D2HINTCLR_BUSERR_CLR 0x2U // BusError Interrupt Clear +#define HIC_D2HINTCLR_ILLWR_CLR 0x4U // Illegal Write Interrupt Clear +#define HIC_D2HINTCLR_ILLRD_CLR 0x8U // Illegal Read Interrupt Clear +#define HIC_D2HINTCLR_ACCVIO_CLR 0x10U // Access Violation Interrupt Clear +#define HIC_D2HINTCLR_EVTRIG_CLR_S 16U +#define HIC_D2HINTCLR_EVTRIG_CLR_M 0xFFFF0000U // Event Trigger Interrupt Clear +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTFRC register +// +//************************************************************************************************* +#define HIC_D2HINTFRC_D2H_INTFRC 0x1U // Device to Host Force Set +#define HIC_D2HINTFRC_BUSERR_INTFRC 0x2U // BusError Interrupt Force Set +#define HIC_D2HINTFRC_ILLWR_INTFRC 0x4U // Illegal Write Interrupt Force Set +#define HIC_D2HINTFRC_ILLRD_INTFRC 0x8U // Illegal Read Interrupt Force Set +#define HIC_D2HINTFRC_ACCVIO_INTFRC 0x10U // Access Violation Interrupt Force Set +#define HIC_D2HINTFRC_EVTRIG_INTFRC_S 16U +#define HIC_D2HINTFRC_EVTRIG_INTFRC_M 0xFFFF0000U // Event Trigger Interrupt Force Set + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_hrpwm.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_hrpwm.h new file mode 100644 index 0000000..a6c899f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_hrpwm.h @@ -0,0 +1,1058 @@ +//########################################################################### +// +// FILE: hw_hrpwm.h +// +// TITLE: Definitions for the HRPWM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_HRPWM_H +#define HW_HRPWM_H + +//************************************************************************************************* +// +// The following are defines for the HRPWM register offsets +// +//************************************************************************************************* +#define HRPWM_O_TBCTL 0x0U // Time Base Control Register +#define HRPWM_O_TBCTL2 0x1U // Time Base Control Register 2 +#define HRPWM_O_TBCTR 0x4U // Time Base Counter Register +#define HRPWM_O_TBSTS 0x5U // Time Base Status Register +#define HRPWM_O_CMPCTL 0x8U // Counter Compare Control Register +#define HRPWM_O_CMPCTL2 0x9U // Counter Compare Control Register 2 +#define HRPWM_O_DBCTL 0xCU // Dead-Band Generator Control Register +#define HRPWM_O_DBCTL2 0xDU // Dead-Band Generator Control Register 2 +#define HRPWM_O_AQCTL 0x10U // Action Qualifier Control Register +#define HRPWM_O_AQTSRCSEL 0x11U // Action Qualifier Trigger Event Source Select Register +#define HRPWM_O_PCCTL 0x14U // PWM Chopper Control Register +#define HRPWM_O_VCAPCTL 0x18U // Valley Capture Control Register +#define HRPWM_O_VCNTCFG 0x19U // Valley Counter Config Register +#define HRPWM_O_HRCNFG 0x20U // HRPWM Configuration Register +#define HRPWM_O_HRPWR 0x21U // HRPWM Power Register +#define HRPWM_O_HRMSTEP 0x26U // HRPWM MEP Step Register +#define HRPWM_O_HRCNFG2 0x27U // HRPWM Configuration 2 Register +#define HRPWM_O_HRPCTL 0x2DU // High Resolution Period Control Register +#define HRPWM_O_TRREM 0x2EU // HRPWM High Resolution Remainder Register +#define HRPWM_O_GLDCTL 0x34U // Global PWM Load Control Register +#define HRPWM_O_GLDCFG 0x35U // Global PWM Load Config Register +#define HRPWM_O_EPWMXLINK 0x38U // EPWMx Link Register +#define HRPWM_O_AQCTLA 0x40U // Action Qualifier Control Register For Output A +#define HRPWM_O_AQCTLA2 0x41U // Additional Action Qualifier Control Register For Output A +#define HRPWM_O_AQCTLB 0x42U // Action Qualifier Control Register For Output B +#define HRPWM_O_AQCTLB2 0x43U // Additional Action Qualifier Control Register For Output B +#define HRPWM_O_AQSFRC 0x47U // Action Qualifier Software Force Register +#define HRPWM_O_AQCSFRC 0x49U // Action Qualifier Continuous S/W Force Register +#define HRPWM_O_DBREDHR 0x50U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define HRPWM_O_DBRED 0x51U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define HRPWM_O_DBFEDHR 0x52U // Dead-Band Generator Falling Edge Delay High Resolution + // Register +#define HRPWM_O_DBFED 0x53U // Dead-Band Generator Falling Edge Delay Count Register +#define HRPWM_O_TBPHS 0x60U // Time Base Phase High +#define HRPWM_O_TBPRDHR 0x62U // Time Base Period High Resolution Register +#define HRPWM_O_TBPRD 0x63U // Time Base Period Register +#define HRPWM_O_CMPA 0x6AU // Counter Compare A Register +#define HRPWM_O_CMPB 0x6CU // Compare B Register +#define HRPWM_O_CMPC 0x6FU // Counter Compare C Register +#define HRPWM_O_CMPD 0x71U // Counter Compare D Register +#define HRPWM_O_GLDCTL2 0x74U // Global PWM Load Control Register 2 +#define HRPWM_O_SWVDELVAL 0x77U // Software Valley Mode Delay Register +#define HRPWM_O_TZSEL 0x80U // Trip Zone Select Register +#define HRPWM_O_TZDCSEL 0x82U // Trip Zone Digital Comparator Select Register +#define HRPWM_O_TZCTL 0x84U // Trip Zone Control Register +#define HRPWM_O_TZCTL2 0x85U // Additional Trip Zone Control Register +#define HRPWM_O_TZCTLDCA 0x86U // Trip Zone Control Register Digital Compare A +#define HRPWM_O_TZCTLDCB 0x87U // Trip Zone Control Register Digital Compare B +#define HRPWM_O_TZEINT 0x8DU // Trip Zone Enable Interrupt Register +#define HRPWM_O_TZFLG 0x93U // Trip Zone Flag Register +#define HRPWM_O_TZCBCFLG 0x94U // Trip Zone CBC Flag Register +#define HRPWM_O_TZOSTFLG 0x95U // Trip Zone OST Flag Register +#define HRPWM_O_TZCLR 0x97U // Trip Zone Clear Register +#define HRPWM_O_TZCBCCLR 0x98U // Trip Zone CBC Clear Register +#define HRPWM_O_TZOSTCLR 0x99U // Trip Zone OST Clear Register +#define HRPWM_O_TZFRC 0x9BU // Trip Zone Force Register +#define HRPWM_O_ETSEL 0xA4U // Event Trigger Selection Register +#define HRPWM_O_ETPS 0xA6U // Event Trigger Pre-Scale Register +#define HRPWM_O_ETFLG 0xA8U // Event Trigger Flag Register +#define HRPWM_O_ETCLR 0xAAU // Event Trigger Clear Register +#define HRPWM_O_ETFRC 0xACU // Event Trigger Force Register +#define HRPWM_O_ETINTPS 0xAEU // Event-Trigger Interrupt Pre-Scale Register +#define HRPWM_O_ETSOCPS 0xB0U // Event-Trigger SOC Pre-Scale Register +#define HRPWM_O_ETCNTINITCTL 0xB2U // Event-Trigger Counter Initialization Control Register +#define HRPWM_O_ETCNTINIT 0xB4U // Event-Trigger Counter Initialization Register +#define HRPWM_O_DCTRIPSEL 0xC0U // Digital Compare Trip Select Register +#define HRPWM_O_DCACTL 0xC3U // Digital Compare A Control Register +#define HRPWM_O_DCBCTL 0xC4U // Digital Compare B Control Register +#define HRPWM_O_DCFCTL 0xC7U // Digital Compare Filter Control Register +#define HRPWM_O_DCCAPCTL 0xC8U // Digital Compare Capture Control Register +#define HRPWM_O_DCFOFFSET 0xC9U // Digital Compare Filter Offset Register +#define HRPWM_O_DCFOFFSETCNT 0xCAU // Digital Compare Filter Offset Counter Register +#define HRPWM_O_DCFWINDOW 0xCBU // Digital Compare Filter Window Register +#define HRPWM_O_DCFWINDOWCNT 0xCCU // Digital Compare Filter Window Counter Register +#define HRPWM_O_DCCAP 0xCFU // Digital Compare Counter Capture Register +#define HRPWM_O_DCAHTRIPSEL 0xD2U // Digital Compare AH Trip Select +#define HRPWM_O_DCALTRIPSEL 0xD3U // Digital Compare AL Trip Select +#define HRPWM_O_DCBHTRIPSEL 0xD4U // Digital Compare BH Trip Select +#define HRPWM_O_DCBLTRIPSEL 0xD5U // Digital Compare BL Trip Select +#define HRPWM_O_HWVDELVAL 0xFDU // Hardware Valley Mode Delay Register +#define HRPWM_O_VCNTVAL 0xFEU // Hardware Valley Counter Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL register +// +//************************************************************************************************* +#define HRPWM_TBCTL_CTRMODE_S 0U +#define HRPWM_TBCTL_CTRMODE_M 0x3U // Counter Mode +#define HRPWM_TBCTL_PHSEN 0x4U // Phase Load Enable +#define HRPWM_TBCTL_PRDLD 0x8U // Active Period Load +#define HRPWM_TBCTL_SYNCOSEL_S 4U +#define HRPWM_TBCTL_SYNCOSEL_M 0x30U // Sync Output Select +#define HRPWM_TBCTL_SWFSYNC 0x40U // Software Force Sync Pulse +#define HRPWM_TBCTL_HSPCLKDIV_S 7U +#define HRPWM_TBCTL_HSPCLKDIV_M 0x380U // High Speed TBCLK Pre-scaler +#define HRPWM_TBCTL_CLKDIV_S 10U +#define HRPWM_TBCTL_CLKDIV_M 0x1C00U // Time Base Clock Pre-scaler +#define HRPWM_TBCTL_PHSDIR 0x2000U // Phase Direction Bit +#define HRPWM_TBCTL_FREE_SOFT_S 14U +#define HRPWM_TBCTL_FREE_SOFT_M 0xC000U // Emulation Mode Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL2 register +// +//************************************************************************************************* +#define HRPWM_TBCTL2_OSHTSYNCMODE 0x40U // One shot sync mode +#define HRPWM_TBCTL2_OSHTSYNC 0x80U // One shot sync +#define HRPWM_TBCTL2_SYNCOSELX_S 12U +#define HRPWM_TBCTL2_SYNCOSELX_M 0x3000U // Syncout selection +#define HRPWM_TBCTL2_PRDLDSYNC_S 14U +#define HRPWM_TBCTL2_PRDLDSYNC_M 0xC000U // PRD Shadow to Active Load on SYNC Event + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBSTS register +// +//************************************************************************************************* +#define HRPWM_TBSTS_CTRDIR 0x1U // Counter Direction Status +#define HRPWM_TBSTS_SYNCI 0x2U // External Input Sync Status +#define HRPWM_TBSTS_CTRMAX 0x4U // Counter Max Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL register +// +//************************************************************************************************* +#define HRPWM_CMPCTL_LOADAMODE_S 0U +#define HRPWM_CMPCTL_LOADAMODE_M 0x3U // Active Compare A Load +#define HRPWM_CMPCTL_LOADBMODE_S 2U +#define HRPWM_CMPCTL_LOADBMODE_M 0xCU // Active Compare B Load +#define HRPWM_CMPCTL_SHDWAMODE 0x10U // Compare A Register Block Operating Mode +#define HRPWM_CMPCTL_SHDWBMODE 0x40U // Compare B Register Block Operating Mode +#define HRPWM_CMPCTL_SHDWAFULL 0x100U // Compare A Shadow Register Full Status +#define HRPWM_CMPCTL_SHDWBFULL 0x200U // Compare B Shadow Register Full Status +#define HRPWM_CMPCTL_LOADASYNC_S 10U +#define HRPWM_CMPCTL_LOADASYNC_M 0xC00U // Active Compare A Load on SYNC +#define HRPWM_CMPCTL_LOADBSYNC_S 12U +#define HRPWM_CMPCTL_LOADBSYNC_M 0x3000U // Active Compare B Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL2 register +// +//************************************************************************************************* +#define HRPWM_CMPCTL2_LOADCMODE_S 0U +#define HRPWM_CMPCTL2_LOADCMODE_M 0x3U // Active Compare C Load +#define HRPWM_CMPCTL2_LOADDMODE_S 2U +#define HRPWM_CMPCTL2_LOADDMODE_M 0xCU // Active Compare D load +#define HRPWM_CMPCTL2_SHDWCMODE 0x10U // Compare C Block Operating Mode +#define HRPWM_CMPCTL2_SHDWDMODE 0x40U // Compare D Block Operating Mode +#define HRPWM_CMPCTL2_LOADCSYNC_S 10U +#define HRPWM_CMPCTL2_LOADCSYNC_M 0xC00U // Active Compare C Load on SYNC +#define HRPWM_CMPCTL2_LOADDSYNC_S 12U +#define HRPWM_CMPCTL2_LOADDSYNC_M 0x3000U // Active Compare D Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL register +// +//************************************************************************************************* +#define HRPWM_DBCTL_OUT_MODE_S 0U +#define HRPWM_DBCTL_OUT_MODE_M 0x3U // Dead Band Output Mode Control +#define HRPWM_DBCTL_POLSEL_S 2U +#define HRPWM_DBCTL_POLSEL_M 0xCU // Polarity Select Control +#define HRPWM_DBCTL_IN_MODE_S 4U +#define HRPWM_DBCTL_IN_MODE_M 0x30U // Dead Band Input Select Mode Control +#define HRPWM_DBCTL_LOADREDMODE_S 6U +#define HRPWM_DBCTL_LOADREDMODE_M 0xC0U // Active DBRED Load Mode +#define HRPWM_DBCTL_LOADFEDMODE_S 8U +#define HRPWM_DBCTL_LOADFEDMODE_M 0x300U // Active DBFED Load Mode +#define HRPWM_DBCTL_SHDWDBREDMODE 0x400U // DBRED Block Operating Mode +#define HRPWM_DBCTL_SHDWDBFEDMODE 0x800U // DBFED Block Operating Mode +#define HRPWM_DBCTL_OUTSWAP_S 12U +#define HRPWM_DBCTL_OUTSWAP_M 0x3000U // Dead Band Output Swap Control +#define HRPWM_DBCTL_DEDB_MODE 0x4000U // Dead Band Dual-Edge B Mode Control +#define HRPWM_DBCTL_HALFCYCLE 0x8000U // Half Cycle Clocking Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL2 register +// +//************************************************************************************************* +#define HRPWM_DBCTL2_LOADDBCTLMODE_S 0U +#define HRPWM_DBCTL2_LOADDBCTLMODE_M 0x3U // DBCTL Load from Shadow Mode Select +#define HRPWM_DBCTL2_SHDWDBCTLMODE 0x4U // DBCTL Load mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTL register +// +//************************************************************************************************* +#define HRPWM_AQCTL_LDAQAMODE_S 0U +#define HRPWM_AQCTL_LDAQAMODE_M 0x3U // Action Qualifier A Load Select +#define HRPWM_AQCTL_LDAQBMODE_S 2U +#define HRPWM_AQCTL_LDAQBMODE_M 0xCU // Action Qualifier B Load Select +#define HRPWM_AQCTL_SHDWAQAMODE 0x10U // Action Qualifer A Operating Mode +#define HRPWM_AQCTL_SHDWAQBMODE 0x40U // Action Qualifier B Operating Mode +#define HRPWM_AQCTL_LDAQASYNC_S 8U +#define HRPWM_AQCTL_LDAQASYNC_M 0x300U // AQCTLA Register Load on SYNC +#define HRPWM_AQCTL_LDAQBSYNC_S 10U +#define HRPWM_AQCTL_LDAQBSYNC_M 0xC00U // AQCTLB Register Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQTSRCSEL register +// +//************************************************************************************************* +#define HRPWM_AQTSRCSEL_T1SEL_S 0U +#define HRPWM_AQTSRCSEL_T1SEL_M 0xFU // T1 Event Source Select Bits +#define HRPWM_AQTSRCSEL_T2SEL_S 4U +#define HRPWM_AQTSRCSEL_T2SEL_M 0xF0U // T2 Event Source Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCCTL register +// +//************************************************************************************************* +#define HRPWM_PCCTL_CHPEN 0x1U // PWM chopping enable +#define HRPWM_PCCTL_OSHTWTH_S 1U +#define HRPWM_PCCTL_OSHTWTH_M 0x1EU // One-shot pulse width +#define HRPWM_PCCTL_CHPFREQ_S 5U +#define HRPWM_PCCTL_CHPFREQ_M 0xE0U // Chopping clock frequency +#define HRPWM_PCCTL_CHPDUTY_S 8U +#define HRPWM_PCCTL_CHPDUTY_M 0x700U // Chopping clock Duty cycle + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCAPCTL register +// +//************************************************************************************************* +#define HRPWM_VCAPCTL_VCAPE 0x1U // Valley Capture mode +#define HRPWM_VCAPCTL_VCAPSTART 0x2U // Valley Capture Start +#define HRPWM_VCAPCTL_TRIGSEL_S 2U +#define HRPWM_VCAPCTL_TRIGSEL_M 0x1CU // Capture Trigger Select +#define HRPWM_VCAPCTL_VDELAYDIV_S 7U +#define HRPWM_VCAPCTL_VDELAYDIV_M 0x380U // Valley Delay Mode Divide Enable +#define HRPWM_VCAPCTL_EDGEFILTDLYSEL 0x400U // Valley Switching Mode Delay Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCNTCFG register +// +//************************************************************************************************* +#define HRPWM_VCNTCFG_STARTEDGE_S 0U +#define HRPWM_VCNTCFG_STARTEDGE_M 0xFU // Counter Start Edge Selection +#define HRPWM_VCNTCFG_STARTEDGESTS 0x80U // Start Edge Status Bit +#define HRPWM_VCNTCFG_STOPEDGE_S 8U +#define HRPWM_VCNTCFG_STOPEDGE_M 0xF00U // Counter Start Edge Selection +#define HRPWM_VCNTCFG_STOPEDGESTS 0x8000U // Stop Edge Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG register +// +//************************************************************************************************* +#define HRPWM_HRCNFG_EDGMODE_S 0U +#define HRPWM_HRCNFG_EDGMODE_M 0x3U // ePWMxA Edge Mode Select Bits +#define HRPWM_HRCNFG_CTLMODE 0x4U // ePWMxA Control Mode Select Bits +#define HRPWM_HRCNFG_HRLOAD_S 3U +#define HRPWM_HRCNFG_HRLOAD_M 0x18U // ePWMxA Shadow Mode Select Bits +#define HRPWM_HRCNFG_SELOUTB 0x20U // EPWMB Output Selection Bit +#define HRPWM_HRCNFG_AUTOCONV 0x40U // Autoconversion Bit +#define HRPWM_HRCNFG_SWAPAB 0x80U // Swap EPWMA and EPWMB Outputs Bit +#define HRPWM_HRCNFG_EDGMODEB_S 8U +#define HRPWM_HRCNFG_EDGMODEB_M 0x300U // ePWMxB Edge Mode Select Bits +#define HRPWM_HRCNFG_CTLMODEB 0x400U // ePWMxB Control Mode Select Bits +#define HRPWM_HRCNFG_HRLOADB_S 11U +#define HRPWM_HRCNFG_HRLOADB_M 0x1800U // ePWMxB Shadow Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPWR register +// +//************************************************************************************************* +#define HRPWM_HRPWR_CALPWRON 0x8000U // Calibration Power On + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRMSTEP register +// +//************************************************************************************************* +#define HRPWM_HRMSTEP_HRMSTEP_S 0U +#define HRPWM_HRMSTEP_HRMSTEP_M 0xFFU // High Resolution Micro Step Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG2 register +// +//************************************************************************************************* +#define HRPWM_HRCNFG2_EDGMODEDB_S 0U +#define HRPWM_HRCNFG2_EDGMODEDB_M 0x3U // Dead-Band Edge-Mode Select Bits +#define HRPWM_HRCNFG2_CTLMODEDBRED_S 2U +#define HRPWM_HRCNFG2_CTLMODEDBRED_M 0xCU // DBRED Control Mode Select Bits +#define HRPWM_HRCNFG2_CTLMODEDBFED_S 4U +#define HRPWM_HRCNFG2_CTLMODEDBFED_M 0x30U // DBFED Control Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPCTL register +// +//************************************************************************************************* +#define HRPWM_HRPCTL_HRPE 0x1U // High Resolution Period Enable +#define HRPWM_HRPCTL_PWMSYNCSEL 0x2U // EPWMSYNCPER Source Select +#define HRPWM_HRPCTL_TBPHSHRLOADE 0x4U // TBPHSHR Load Enable +#define HRPWM_HRPCTL_PWMSYNCSELX_S 4U +#define HRPWM_HRPCTL_PWMSYNCSELX_M 0x70U // EPWMSYNCPER Extended Source Select Bit: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRREM register +// +//************************************************************************************************* +#define HRPWM_TRREM_TRREM_S 0U +#define HRPWM_TRREM_TRREM_M 0x7FFU // HRPWM Remainder Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL register +// +//************************************************************************************************* +#define HRPWM_GLDCTL_GLD 0x1U // Global Shadow to Active load event control +#define HRPWM_GLDCTL_GLDMODE_S 1U +#define HRPWM_GLDCTL_GLDMODE_M 0x1EU // Shadow to Active Global Load Pulse Selection +#define HRPWM_GLDCTL_OSHTMODE 0x20U // One Shot Load mode control bit +#define HRPWM_GLDCTL_GLDPRD_S 7U +#define HRPWM_GLDCTL_GLDPRD_M 0x380U // Global Load Strobe Period Select Register +#define HRPWM_GLDCTL_GLDCNT_S 10U +#define HRPWM_GLDCTL_GLDCNT_M 0x1C00U // Global Load Strobe Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCFG register +// +//************************************************************************************************* +#define HRPWM_GLDCFG_TBPRD_TBPRDHR 0x1U // Global load event configuration for TBPRD:TBPRDHR +#define HRPWM_GLDCFG_CMPA_CMPAHR 0x2U // Global load event configuration for CMPA:CMPAHR +#define HRPWM_GLDCFG_CMPB_CMPBHR 0x4U // Global load event configuration for CMPB:CMPBHR +#define HRPWM_GLDCFG_CMPC 0x8U // Global load event configuration for CMPC +#define HRPWM_GLDCFG_CMPD 0x10U // Global load event configuration for CMPD +#define HRPWM_GLDCFG_DBRED_DBREDHR 0x20U // Global load event configuration for DBRED:DBREDHR +#define HRPWM_GLDCFG_DBFED_DBFEDHR 0x40U // Global load event configuration for DBFED:DBFEDHR +#define HRPWM_GLDCFG_DBCTL 0x80U // Global load event configuration for DBCTL +#define HRPWM_GLDCFG_AQCTLA_AQCTLA2 0x100U // Global load event configuration for AQCTLA/A2 +#define HRPWM_GLDCFG_AQCTLB_AQCTLB2 0x200U // Global load event configuration for AQCTLB/B2 +#define HRPWM_GLDCFG_AQCSFRC 0x400U // Global load event configuration for AQCSFRC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EPWMXLINK register +// +//************************************************************************************************* +#define HRPWM_EPWMXLINK_TBPRDLINK_S 0U +#define HRPWM_EPWMXLINK_TBPRDLINK_M 0xFU // TBPRD:TBPRDHR Link +#define HRPWM_EPWMXLINK_CMPALINK_S 4U +#define HRPWM_EPWMXLINK_CMPALINK_M 0xF0U // CMPA:CMPAHR Link +#define HRPWM_EPWMXLINK_CMPBLINK_S 8U +#define HRPWM_EPWMXLINK_CMPBLINK_M 0xF00U // CMPB:CMPBHR Link +#define HRPWM_EPWMXLINK_CMPCLINK_S 12U +#define HRPWM_EPWMXLINK_CMPCLINK_M 0xF000U // CMPC Link +#define HRPWM_EPWMXLINK_CMPDLINK_S 16U +#define HRPWM_EPWMXLINK_CMPDLINK_M 0xF0000U // CMPD Link +#define HRPWM_EPWMXLINK_GLDCTL2LINK_S 28U +#define HRPWM_EPWMXLINK_GLDCTL2LINK_M 0xF0000000U // GLDCTL2 Link + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA register +// +//************************************************************************************************* +#define HRPWM_AQCTLA_ZRO_S 0U +#define HRPWM_AQCTLA_ZRO_M 0x3U // Action Counter = Zero +#define HRPWM_AQCTLA_PRD_S 2U +#define HRPWM_AQCTLA_PRD_M 0xCU // Action Counter = Period +#define HRPWM_AQCTLA_CAU_S 4U +#define HRPWM_AQCTLA_CAU_M 0x30U // Action Counter = Compare A Up +#define HRPWM_AQCTLA_CAD_S 6U +#define HRPWM_AQCTLA_CAD_M 0xC0U // Action Counter = Compare A Down +#define HRPWM_AQCTLA_CBU_S 8U +#define HRPWM_AQCTLA_CBU_M 0x300U // Action Counter = Compare B Up +#define HRPWM_AQCTLA_CBD_S 10U +#define HRPWM_AQCTLA_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA2 register +// +//************************************************************************************************* +#define HRPWM_AQCTLA2_T1U_S 0U +#define HRPWM_AQCTLA2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define HRPWM_AQCTLA2_T1D_S 2U +#define HRPWM_AQCTLA2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define HRPWM_AQCTLA2_T2U_S 4U +#define HRPWM_AQCTLA2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define HRPWM_AQCTLA2_T2D_S 6U +#define HRPWM_AQCTLA2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB register +// +//************************************************************************************************* +#define HRPWM_AQCTLB_ZRO_S 0U +#define HRPWM_AQCTLB_ZRO_M 0x3U // Action Counter = Zero +#define HRPWM_AQCTLB_PRD_S 2U +#define HRPWM_AQCTLB_PRD_M 0xCU // Action Counter = Period +#define HRPWM_AQCTLB_CAU_S 4U +#define HRPWM_AQCTLB_CAU_M 0x30U // Action Counter = Compare A Up +#define HRPWM_AQCTLB_CAD_S 6U +#define HRPWM_AQCTLB_CAD_M 0xC0U // Action Counter = Compare A Down +#define HRPWM_AQCTLB_CBU_S 8U +#define HRPWM_AQCTLB_CBU_M 0x300U // Action Counter = Compare B Up +#define HRPWM_AQCTLB_CBD_S 10U +#define HRPWM_AQCTLB_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB2 register +// +//************************************************************************************************* +#define HRPWM_AQCTLB2_T1U_S 0U +#define HRPWM_AQCTLB2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define HRPWM_AQCTLB2_T1D_S 2U +#define HRPWM_AQCTLB2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define HRPWM_AQCTLB2_T2U_S 4U +#define HRPWM_AQCTLB2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define HRPWM_AQCTLB2_T2D_S 6U +#define HRPWM_AQCTLB2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQSFRC register +// +//************************************************************************************************* +#define HRPWM_AQSFRC_ACTSFA_S 0U +#define HRPWM_AQSFRC_ACTSFA_M 0x3U // Action when One-time SW Force A Invoked +#define HRPWM_AQSFRC_OTSFA 0x4U // One-time SW Force A Output +#define HRPWM_AQSFRC_ACTSFB_S 3U +#define HRPWM_AQSFRC_ACTSFB_M 0x18U // Action when One-time SW Force B Invoked +#define HRPWM_AQSFRC_OTSFB 0x20U // One-time SW Force A Output +#define HRPWM_AQSFRC_RLDCSF_S 6U +#define HRPWM_AQSFRC_RLDCSF_M 0xC0U // Reload from Shadow Options + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCSFRC register +// +//************************************************************************************************* +#define HRPWM_AQCSFRC_CSFA_S 0U +#define HRPWM_AQCSFRC_CSFA_M 0x3U // Continuous Software Force on output A +#define HRPWM_AQCSFRC_CSFB_S 2U +#define HRPWM_AQCSFRC_CSFB_M 0xCU // Continuous Software Force on output B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBREDHR register +// +//************************************************************************************************* +#define HRPWM_DBREDHR_DBREDHR_S 9U +#define HRPWM_DBREDHR_DBREDHR_M 0xFE00U // DBREDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBRED register +// +//************************************************************************************************* +#define HRPWM_DBRED_DBRED_S 0U +#define HRPWM_DBRED_DBRED_M 0x3FFFU // Rising edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFEDHR register +// +//************************************************************************************************* +#define HRPWM_DBFEDHR_DBFEDHR_S 9U +#define HRPWM_DBFEDHR_DBFEDHR_M 0xFE00U // DBFEDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFED register +// +//************************************************************************************************* +#define HRPWM_DBFED_DBFED_S 0U +#define HRPWM_DBFED_DBFED_M 0x3FFFU // Falling edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBPHS register +// +//************************************************************************************************* +#define HRPWM_TBPHS_TBPHSHR_S 0U +#define HRPWM_TBPHS_TBPHSHR_M 0xFFFFU // Extension Register for HRPWM Phase (8-bits) +#define HRPWM_TBPHS_TBPHS_S 16U +#define HRPWM_TBPHS_TBPHS_M 0xFFFF0000U // Phase Offset Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPA register +// +//************************************************************************************************* +#define HRPWM_CMPA_CMPAHR_S 0U +#define HRPWM_CMPA_CMPAHR_M 0xFFFFU // Compare A HRPWM Extension Register +#define HRPWM_CMPA_CMPA_S 16U +#define HRPWM_CMPA_CMPA_M 0xFFFF0000U // Compare A Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPB register +// +//************************************************************************************************* +#define HRPWM_CMPB_CMPBHR_S 0U +#define HRPWM_CMPB_CMPBHR_M 0xFFFFU // Compare B High Resolution Bits +#define HRPWM_CMPB_CMPB_S 16U +#define HRPWM_CMPB_CMPB_M 0xFFFF0000U // Compare B Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL2 register +// +//************************************************************************************************* +#define HRPWM_GLDCTL2_OSHTLD 0x1U // Enable reload event in one shot mode +#define HRPWM_GLDCTL2_GFRCLD 0x2U // Force reload event in one shot mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZSEL register +// +//************************************************************************************************* +#define HRPWM_TZSEL_CBC1 0x1U // TZ1 CBC select +#define HRPWM_TZSEL_CBC2 0x2U // TZ2 CBC select +#define HRPWM_TZSEL_CBC3 0x4U // TZ3 CBC select +#define HRPWM_TZSEL_CBC4 0x8U // TZ4 CBC select +#define HRPWM_TZSEL_CBC5 0x10U // TZ5 CBC select +#define HRPWM_TZSEL_CBC6 0x20U // TZ6 CBC select +#define HRPWM_TZSEL_DCAEVT2 0x40U // DCAEVT2 CBC select +#define HRPWM_TZSEL_DCBEVT2 0x80U // DCBEVT2 CBC select +#define HRPWM_TZSEL_OSHT1 0x100U // One-shot TZ1 select +#define HRPWM_TZSEL_OSHT2 0x200U // One-shot TZ2 select +#define HRPWM_TZSEL_OSHT3 0x400U // One-shot TZ3 select +#define HRPWM_TZSEL_OSHT4 0x800U // One-shot TZ4 select +#define HRPWM_TZSEL_OSHT5 0x1000U // One-shot TZ5 select +#define HRPWM_TZSEL_OSHT6 0x2000U // One-shot TZ6 select +#define HRPWM_TZSEL_DCAEVT1 0x4000U // One-shot DCAEVT1 select +#define HRPWM_TZSEL_DCBEVT1 0x8000U // One-shot DCBEVT1 select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZDCSEL register +// +//************************************************************************************************* +#define HRPWM_TZDCSEL_DCAEVT1_S 0U +#define HRPWM_TZDCSEL_DCAEVT1_M 0x7U // Digital Compare Output A Event 1 +#define HRPWM_TZDCSEL_DCAEVT2_S 3U +#define HRPWM_TZDCSEL_DCAEVT2_M 0x38U // Digital Compare Output A Event 2 +#define HRPWM_TZDCSEL_DCBEVT1_S 6U +#define HRPWM_TZDCSEL_DCBEVT1_M 0x1C0U // Digital Compare Output B Event 1 +#define HRPWM_TZDCSEL_DCBEVT2_S 9U +#define HRPWM_TZDCSEL_DCBEVT2_M 0xE00U // Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL register +// +//************************************************************************************************* +#define HRPWM_TZCTL_TZA_S 0U +#define HRPWM_TZCTL_TZA_M 0x3U // TZ1 to TZ6 Trip Action On EPWMxA +#define HRPWM_TZCTL_TZB_S 2U +#define HRPWM_TZCTL_TZB_M 0xCU // TZ1 to TZ6 Trip Action On EPWMxB +#define HRPWM_TZCTL_DCAEVT1_S 4U +#define HRPWM_TZCTL_DCAEVT1_M 0x30U // EPWMxA action on DCAEVT1 +#define HRPWM_TZCTL_DCAEVT2_S 6U +#define HRPWM_TZCTL_DCAEVT2_M 0xC0U // EPWMxA action on DCAEVT2 +#define HRPWM_TZCTL_DCBEVT1_S 8U +#define HRPWM_TZCTL_DCBEVT1_M 0x300U // EPWMxB action on DCBEVT1 +#define HRPWM_TZCTL_DCBEVT2_S 10U +#define HRPWM_TZCTL_DCBEVT2_M 0xC00U // EPWMxB action on DCBEVT2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL2 register +// +//************************************************************************************************* +#define HRPWM_TZCTL2_TZAU_S 0U +#define HRPWM_TZCTL2_TZAU_M 0x7U // Trip Action On EPWMxA while Count direction is UP +#define HRPWM_TZCTL2_TZAD_S 3U +#define HRPWM_TZCTL2_TZAD_M 0x38U // Trip Action On EPWMxA while Count direction is DOWN +#define HRPWM_TZCTL2_TZBU_S 6U +#define HRPWM_TZCTL2_TZBU_M 0x1C0U // Trip Action On EPWMxB while Count direction is UP +#define HRPWM_TZCTL2_TZBD_S 9U +#define HRPWM_TZCTL2_TZBD_M 0xE00U // Trip Action On EPWMxB while Count direction is DOWN +#define HRPWM_TZCTL2_ETZE 0x8000U // TZCTL2 Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCA register +// +//************************************************************************************************* +#define HRPWM_TZCTLDCA_DCAEVT1U_S 0U +#define HRPWM_TZCTLDCA_DCAEVT1U_M 0x7U // DCAEVT1 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCA_DCAEVT1D_S 3U +#define HRPWM_TZCTLDCA_DCAEVT1D_M 0x38U // DCAEVT1 Action On EPWMxA while Count direction is + // DOWN +#define HRPWM_TZCTLDCA_DCAEVT2U_S 6U +#define HRPWM_TZCTLDCA_DCAEVT2U_M 0x1C0U // DCAEVT2 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCA_DCAEVT2D_S 9U +#define HRPWM_TZCTLDCA_DCAEVT2D_M 0xE00U // DCAEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCB register +// +//************************************************************************************************* +#define HRPWM_TZCTLDCB_DCBEVT1U_S 0U +#define HRPWM_TZCTLDCB_DCBEVT1U_M 0x7U // DCBEVT1 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCB_DCBEVT1D_S 3U +#define HRPWM_TZCTLDCB_DCBEVT1D_M 0x38U // DCBEVT1 Action On EPWMxA while Count direction is + // DOWN +#define HRPWM_TZCTLDCB_DCBEVT2U_S 6U +#define HRPWM_TZCTLDCB_DCBEVT2U_M 0x1C0U // DCBEVT2 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCB_DCBEVT2D_S 9U +#define HRPWM_TZCTLDCB_DCBEVT2D_M 0xE00U // DCBEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZEINT register +// +//************************************************************************************************* +#define HRPWM_TZEINT_CBC 0x2U // Trip Zones Cycle By Cycle Int Enable +#define HRPWM_TZEINT_OST 0x4U // Trip Zones One Shot Int Enable +#define HRPWM_TZEINT_DCAEVT1 0x8U // Digital Compare A Event 1 Int Enable +#define HRPWM_TZEINT_DCAEVT2 0x10U // Digital Compare A Event 2 Int Enable +#define HRPWM_TZEINT_DCBEVT1 0x20U // Digital Compare B Event 1 Int Enable +#define HRPWM_TZEINT_DCBEVT2 0x40U // Digital Compare B Event 2 Int Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFLG register +// +//************************************************************************************************* +#define HRPWM_TZFLG_INT 0x1U // Global Int Status Flag +#define HRPWM_TZFLG_CBC 0x2U // Trip Zones Cycle By Cycle Flag +#define HRPWM_TZFLG_OST 0x4U // Trip Zones One Shot Flag +#define HRPWM_TZFLG_DCAEVT1 0x8U // Digital Compare A Event 1 Flag +#define HRPWM_TZFLG_DCAEVT2 0x10U // Digital Compare A Event 2 Flag +#define HRPWM_TZFLG_DCBEVT1 0x20U // Digital Compare B Event 1 Flag +#define HRPWM_TZFLG_DCBEVT2 0x40U // Digital Compare B Event 2 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCFLG register +// +//************************************************************************************************* +#define HRPWM_TZCBCFLG_CBC1 0x1U // Latched Status Flag for CBC1 Trip Latch +#define HRPWM_TZCBCFLG_CBC2 0x2U // Latched Status Flag for CBC2 Trip Latch +#define HRPWM_TZCBCFLG_CBC3 0x4U // Latched Status Flag for CBC3 Trip Latch +#define HRPWM_TZCBCFLG_CBC4 0x8U // Latched Status Flag for CBC4 Trip Latch +#define HRPWM_TZCBCFLG_CBC5 0x10U // Latched Status Flag for CBC5 Trip Latch +#define HRPWM_TZCBCFLG_CBC6 0x20U // Latched Status Flag for CBC6 Trip Latch +#define HRPWM_TZCBCFLG_DCAEVT2 0x40U // Latched Status Flag for Digital Compare Output A Event + // 2 +#define HRPWM_TZCBCFLG_DCBEVT2 0x80U // Latched Status Flag for Digital Compare Output B Event + // 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTFLG register +// +//************************************************************************************************* +#define HRPWM_TZOSTFLG_OST1 0x1U // Latched Status Flag for OST1 Trip Latch +#define HRPWM_TZOSTFLG_OST2 0x2U // Latched Status Flag for OST2 Trip Latch +#define HRPWM_TZOSTFLG_OST3 0x4U // Latched Status Flag for OST3 Trip Latch +#define HRPWM_TZOSTFLG_OST4 0x8U // Latched Status Flag for OST4 Trip Latch +#define HRPWM_TZOSTFLG_OST5 0x10U // Latched Status Flag for OST5 Trip Latch +#define HRPWM_TZOSTFLG_OST6 0x20U // Latched Status Flag for OST6 Trip Latch +#define HRPWM_TZOSTFLG_DCAEVT1 0x40U // Latched Status Flag for Digital Compare Output A Event + // 1 +#define HRPWM_TZOSTFLG_DCBEVT1 0x80U // Latched Status Flag for Digital Compare Output B Event + // 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCLR register +// +//************************************************************************************************* +#define HRPWM_TZCLR_INT 0x1U // Global Interrupt Clear Flag +#define HRPWM_TZCLR_CBC 0x2U // Cycle-By-Cycle Flag Clear +#define HRPWM_TZCLR_OST 0x4U // One-Shot Flag Clear +#define HRPWM_TZCLR_DCAEVT1 0x8U // DCAVET1 Flag Clear +#define HRPWM_TZCLR_DCAEVT2 0x10U // DCAEVT2 Flag Clear +#define HRPWM_TZCLR_DCBEVT1 0x20U // DCBEVT1 Flag Clear +#define HRPWM_TZCLR_DCBEVT2 0x40U // DCBEVT2 Flag Clear +#define HRPWM_TZCLR_CBCPULSE_S 14U +#define HRPWM_TZCLR_CBCPULSE_M 0xC000U // Clear Pulse for CBC Trip Latch + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCCLR register +// +//************************************************************************************************* +#define HRPWM_TZCBCCLR_CBC1 0x1U // Clear Flag for Cycle-By-Cycle (CBC1) Trip Latch +#define HRPWM_TZCBCCLR_CBC2 0x2U // Clear Flag for Cycle-By-Cycle (CBC2) Trip Latch +#define HRPWM_TZCBCCLR_CBC3 0x4U // Clear Flag for Cycle-By-Cycle (CBC3) Trip Latch +#define HRPWM_TZCBCCLR_CBC4 0x8U // Clear Flag for Cycle-By-Cycle (CBC4) Trip Latch +#define HRPWM_TZCBCCLR_CBC5 0x10U // Clear Flag for Cycle-By-Cycle (CBC5) Trip Latch +#define HRPWM_TZCBCCLR_CBC6 0x20U // Clear Flag for Cycle-By-Cycle (CBC6) Trip Latch +#define HRPWM_TZCBCCLR_DCAEVT2 0x40U // Clear Flag forDCAEVT2 selected for CBC +#define HRPWM_TZCBCCLR_DCBEVT2 0x80U // Clear Flag for DCBEVT2 selected for CBC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTCLR register +// +//************************************************************************************************* +#define HRPWM_TZOSTCLR_OST1 0x1U // Clear Flag for Oneshot (OST1) Trip Latch +#define HRPWM_TZOSTCLR_OST2 0x2U // Clear Flag for Oneshot (OST2) Trip Latch +#define HRPWM_TZOSTCLR_OST3 0x4U // Clear Flag for Oneshot (OST3) Trip Latch +#define HRPWM_TZOSTCLR_OST4 0x8U // Clear Flag for Oneshot (OST4) Trip Latch +#define HRPWM_TZOSTCLR_OST5 0x10U // Clear Flag for Oneshot (OST5) Trip Latch +#define HRPWM_TZOSTCLR_OST6 0x20U // Clear Flag for Oneshot (OST6) Trip Latch +#define HRPWM_TZOSTCLR_DCAEVT1 0x40U // Clear Flag for DCAEVT1 selected for OST +#define HRPWM_TZOSTCLR_DCBEVT1 0x80U // Clear Flag for DCBEVT1 selected for OST + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFRC register +// +//************************************************************************************************* +#define HRPWM_TZFRC_CBC 0x2U // Force Trip Zones Cycle By Cycle Event +#define HRPWM_TZFRC_OST 0x4U // Force Trip Zones One Shot Event +#define HRPWM_TZFRC_DCAEVT1 0x8U // Force Digital Compare A Event 1 +#define HRPWM_TZFRC_DCAEVT2 0x10U // Force Digital Compare A Event 2 +#define HRPWM_TZFRC_DCBEVT1 0x20U // Force Digital Compare B Event 1 +#define HRPWM_TZFRC_DCBEVT2 0x40U // Force Digital Compare B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSEL register +// +//************************************************************************************************* +#define HRPWM_ETSEL_INTSEL_S 0U +#define HRPWM_ETSEL_INTSEL_M 0x7U // EPWMxINTn Select +#define HRPWM_ETSEL_INTEN 0x8U // EPWMxINTn Enable +#define HRPWM_ETSEL_SOCASELCMP 0x10U // EPWMxSOCA Compare Select +#define HRPWM_ETSEL_SOCBSELCMP 0x20U // EPWMxSOCB Compare Select +#define HRPWM_ETSEL_INTSELCMP 0x40U // EPWMxINT Compare Select +#define HRPWM_ETSEL_SOCASEL_S 8U +#define HRPWM_ETSEL_SOCASEL_M 0x700U // Start of Conversion A Select +#define HRPWM_ETSEL_SOCAEN 0x800U // Start of Conversion A Enable +#define HRPWM_ETSEL_SOCBSEL_S 12U +#define HRPWM_ETSEL_SOCBSEL_M 0x7000U // Start of Conversion B Select +#define HRPWM_ETSEL_SOCBEN 0x8000U // Start of Conversion B Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETPS register +// +//************************************************************************************************* +#define HRPWM_ETPS_INTPRD_S 0U +#define HRPWM_ETPS_INTPRD_M 0x3U // EPWMxINTn Period Select +#define HRPWM_ETPS_INTCNT_S 2U +#define HRPWM_ETPS_INTCNT_M 0xCU // EPWMxINTn Counter Register +#define HRPWM_ETPS_INTPSSEL 0x10U // EPWMxINTn Pre-Scale Selection Bits +#define HRPWM_ETPS_SOCPSSEL 0x20U // EPWMxSOC A/B Pre-Scale Selection Bits +#define HRPWM_ETPS_SOCAPRD_S 8U +#define HRPWM_ETPS_SOCAPRD_M 0x300U // EPWMxSOCA Period Select +#define HRPWM_ETPS_SOCACNT_S 10U +#define HRPWM_ETPS_SOCACNT_M 0xC00U // EPWMxSOCA Counter Register +#define HRPWM_ETPS_SOCBPRD_S 12U +#define HRPWM_ETPS_SOCBPRD_M 0x3000U // EPWMxSOCB Period Select +#define HRPWM_ETPS_SOCBCNT_S 14U +#define HRPWM_ETPS_SOCBCNT_M 0xC000U // EPWMxSOCB Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFLG register +// +//************************************************************************************************* +#define HRPWM_ETFLG_INT 0x1U // EPWMxINTn Flag +#define HRPWM_ETFLG_SOCA 0x4U // EPWMxSOCA Flag +#define HRPWM_ETFLG_SOCB 0x8U // EPWMxSOCB Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCLR register +// +//************************************************************************************************* +#define HRPWM_ETCLR_INT 0x1U // EPWMxINTn Clear +#define HRPWM_ETCLR_SOCA 0x4U // EPWMxSOCA Clear +#define HRPWM_ETCLR_SOCB 0x8U // EPWMxSOCB Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFRC register +// +//************************************************************************************************* +#define HRPWM_ETFRC_INT 0x1U // EPWMxINTn Force +#define HRPWM_ETFRC_SOCA 0x4U // EPWMxSOCA Force +#define HRPWM_ETFRC_SOCB 0x8U // EPWMxSOCB Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETINTPS register +// +//************************************************************************************************* +#define HRPWM_ETINTPS_INTPRD2_S 0U +#define HRPWM_ETINTPS_INTPRD2_M 0xFU // EPWMxINTn Period Select +#define HRPWM_ETINTPS_INTCNT2_S 4U +#define HRPWM_ETINTPS_INTCNT2_M 0xF0U // EPWMxINTn Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSOCPS register +// +//************************************************************************************************* +#define HRPWM_ETSOCPS_SOCAPRD2_S 0U +#define HRPWM_ETSOCPS_SOCAPRD2_M 0xFU // EPWMxSOCA Period Select +#define HRPWM_ETSOCPS_SOCACNT2_S 4U +#define HRPWM_ETSOCPS_SOCACNT2_M 0xF0U // EPWMxSOCA Counter Register +#define HRPWM_ETSOCPS_SOCBPRD2_S 8U +#define HRPWM_ETSOCPS_SOCBPRD2_M 0xF00U // EPWMxSOCB Period Select +#define HRPWM_ETSOCPS_SOCBCNT2_S 12U +#define HRPWM_ETSOCPS_SOCBCNT2_M 0xF000U // EPWMxSOCB Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINITCTL register +// +//************************************************************************************************* +#define HRPWM_ETCNTINITCTL_INTINITFRC 0x400U // EPWMxINT Counter Initialization Force +#define HRPWM_ETCNTINITCTL_SOCAINITFRC 0x800U // EPWMxSOCA Counter Initialization Force +#define HRPWM_ETCNTINITCTL_SOCBINITFRC 0x1000U // EPWMxSOCB Counter Initialization Force +#define HRPWM_ETCNTINITCTL_INTINITEN 0x2000U // EPWMxINT Counter Initialization Enable +#define HRPWM_ETCNTINITCTL_SOCAINITEN 0x4000U // EPWMxSOCA Counter Initialization Enable +#define HRPWM_ETCNTINITCTL_SOCBINITEN 0x8000U // EPWMxSOCB Counter Initialization Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINIT register +// +//************************************************************************************************* +#define HRPWM_ETCNTINIT_INTINIT_S 0U +#define HRPWM_ETCNTINIT_INTINIT_M 0xFU // EPWMxINT Counter Initialization Bits +#define HRPWM_ETCNTINIT_SOCAINIT_S 4U +#define HRPWM_ETCNTINIT_SOCAINIT_M 0xF0U // EPWMxSOCA Counter Initialization Bits +#define HRPWM_ETCNTINIT_SOCBINIT_S 8U +#define HRPWM_ETCNTINIT_SOCBINIT_M 0xF00U // EPWMxSOCB Counter Initialization Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCTRIPSEL_DCAHCOMPSEL_S 0U +#define HRPWM_DCTRIPSEL_DCAHCOMPSEL_M 0xFU // Digital Compare A High COMP Input Select +#define HRPWM_DCTRIPSEL_DCALCOMPSEL_S 4U +#define HRPWM_DCTRIPSEL_DCALCOMPSEL_M 0xF0U // Digital Compare A Low COMP Input Select +#define HRPWM_DCTRIPSEL_DCBHCOMPSEL_S 8U +#define HRPWM_DCTRIPSEL_DCBHCOMPSEL_M 0xF00U // Digital Compare B High COMP Input Select +#define HRPWM_DCTRIPSEL_DCBLCOMPSEL_S 12U +#define HRPWM_DCTRIPSEL_DCBLCOMPSEL_M 0xF000U // Digital Compare B Low COMP Input Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCACTL register +// +//************************************************************************************************* +#define HRPWM_DCACTL_EVT1SRCSEL 0x1U // DCAEVT1 Source Signal +#define HRPWM_DCACTL_EVT1FRCSYNCSEL 0x2U // DCAEVT1 Force Sync Signal +#define HRPWM_DCACTL_EVT1SOCE 0x4U // DCAEVT1 SOC Enable +#define HRPWM_DCACTL_EVT1SYNCE 0x8U // DCAEVT1 SYNC Enable +#define HRPWM_DCACTL_EVT2SRCSEL 0x100U // DCAEVT2 Source Signal +#define HRPWM_DCACTL_EVT2FRCSYNCSEL 0x200U // DCAEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBCTL register +// +//************************************************************************************************* +#define HRPWM_DCBCTL_EVT1SRCSEL 0x1U // DCBEVT1 Source Signal +#define HRPWM_DCBCTL_EVT1FRCSYNCSEL 0x2U // DCBEVT1 Force Sync Signal +#define HRPWM_DCBCTL_EVT1SOCE 0x4U // DCBEVT1 SOC Enable +#define HRPWM_DCBCTL_EVT1SYNCE 0x8U // DCBEVT1 SYNC Enable +#define HRPWM_DCBCTL_EVT2SRCSEL 0x100U // DCBEVT2 Source Signal +#define HRPWM_DCBCTL_EVT2FRCSYNCSEL 0x200U // DCBEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCFCTL register +// +//************************************************************************************************* +#define HRPWM_DCFCTL_SRCSEL_S 0U +#define HRPWM_DCFCTL_SRCSEL_M 0x3U // Filter Block Signal Source Select +#define HRPWM_DCFCTL_BLANKE 0x4U // Blanking Enable/Disable +#define HRPWM_DCFCTL_BLANKINV 0x8U // Blanking Window Inversion +#define HRPWM_DCFCTL_PULSESEL_S 4U +#define HRPWM_DCFCTL_PULSESEL_M 0x30U // Pulse Select for Blanking & Capture Alignment +#define HRPWM_DCFCTL_EDGEFILTSEL 0x40U // Edge Filter Select +#define HRPWM_DCFCTL_EDGEMODE_S 8U +#define HRPWM_DCFCTL_EDGEMODE_M 0x300U // Edge Mode +#define HRPWM_DCFCTL_EDGECOUNT_S 10U +#define HRPWM_DCFCTL_EDGECOUNT_M 0x1C00U // Edge Count +#define HRPWM_DCFCTL_EDGESTATUS_S 13U +#define HRPWM_DCFCTL_EDGESTATUS_M 0xE000U // Edge Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCCAPCTL register +// +//************************************************************************************************* +#define HRPWM_DCCAPCTL_CAPE 0x1U // Counter Capture Enable +#define HRPWM_DCCAPCTL_SHDWMODE 0x2U // Counter Capture Mode +#define HRPWM_DCCAPCTL_CAPSTS 0x2000U // Latched Status Flag for Capture Event +#define HRPWM_DCCAPCTL_CAPCLR 0x4000U // DC Capture Latched Status Clear Flag +#define HRPWM_DCCAPCTL_CAPMODE 0x8000U // Counter Capture Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCAHTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCAHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCALTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCALTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAL Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBHTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCBHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBLTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCBLTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBL Mux + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_i2c.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_i2c.h new file mode 100644 index 0000000..e37ef50 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_i2c.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_i2c.h +// +// TITLE: Definitions for the I2C registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_I2C_H +#define HW_I2C_H + +//************************************************************************************************* +// +// The following are defines for the I2C register offsets +// +//************************************************************************************************* +#define I2C_O_OAR 0x0U // I2C Own address +#define I2C_O_IER 0x1U // I2C Interrupt Enable +#define I2C_O_STR 0x2U // I2C Status +#define I2C_O_CLKL 0x3U // I2C Clock low-time divider +#define I2C_O_CLKH 0x4U // I2C Clock high-time divider +#define I2C_O_CNT 0x5U // I2C Data count +#define I2C_O_DRR 0x6U // I2C Data receive +#define I2C_O_SAR 0x7U // I2C Slave address +#define I2C_O_DXR 0x8U // I2C Data Transmit +#define I2C_O_MDR 0x9U // I2C Mode +#define I2C_O_ISRC 0xAU // I2C Interrupt Source +#define I2C_O_EMDR 0xBU // I2C Extended Mode +#define I2C_O_PSC 0xCU // I2C Prescaler +#define I2C_O_FFTX 0x20U // I2C FIFO Transmit +#define I2C_O_FFRX 0x21U // I2C FIFO Receive + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2COAR register +// +//************************************************************************************************* +#define I2C_OAR_OAR_S 0U +#define I2C_OAR_OAR_M 0x3FFU // I2C Own address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CIER register +// +//************************************************************************************************* +#define I2C_IER_ARBL 0x1U // Arbitration-lost interrupt enable +#define I2C_IER_NACK 0x2U // No-acknowledgment interrupt enable +#define I2C_IER_ARDY 0x4U // Register-access-ready interrupt enable +#define I2C_IER_RRDY 0x8U // Receive-data-ready interrupt enable +#define I2C_IER_XRDY 0x10U // Transmit-data-ready interrupt enable +#define I2C_IER_SCD 0x20U // Stop condition detected interrupt enable +#define I2C_IER_AAS 0x40U // Addressed as slave interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CSTR register +// +//************************************************************************************************* +#define I2C_STR_ARBL 0x1U // Arbitration-lost interrupt flag bit +#define I2C_STR_NACK 0x2U // No-acknowledgment interrupt flag bit. +#define I2C_STR_ARDY 0x4U // Register-access-ready interrupt flag bit +#define I2C_STR_RRDY 0x8U // Receive-data-ready interrupt flag bit. +#define I2C_STR_XRDY 0x10U // Transmit-data-ready interrupt flag bit. +#define I2C_STR_SCD 0x20U // Stop condition detected bit. +#define I2C_STR_AD0 0x100U // Address 0 bits +#define I2C_STR_AAS 0x200U // Addressed-as-slave bit +#define I2C_STR_XSMT 0x400U // Transmit shift register empty bit. +#define I2C_STR_RSFULL 0x800U // Receive shift register full bit. +#define I2C_STR_BB 0x1000U // Bus busy bit. +#define I2C_STR_NACKSNT 0x2000U // NACK sent bit. +#define I2C_STR_SDIR 0x4000U // Slave direction bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CDRR register +// +//************************************************************************************************* +#define I2C_DRR_DATA_S 0U +#define I2C_DRR_DATA_M 0xFFU // Receive data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CSAR register +// +//************************************************************************************************* +#define I2C_SAR_SAR_S 0U +#define I2C_SAR_SAR_M 0x3FFU // Slave Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CDXR register +// +//************************************************************************************************* +#define I2C_DXR_DATA_S 0U +#define I2C_DXR_DATA_M 0xFFU // Transmit data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CMDR register +// +//************************************************************************************************* +#define I2C_MDR_BC_S 0U +#define I2C_MDR_BC_M 0x7U // Bit count bits. +#define I2C_MDR_FDF 0x8U // Free Data Format +#define I2C_MDR_STB 0x10U // START Byte Mode +#define I2C_MDR_IRS 0x20U // I2C Module Reset +#define I2C_MDR_DLB 0x40U // Digital Loopback Mode +#define I2C_MDR_RM 0x80U // Repeat Mode +#define I2C_MDR_XA 0x100U // Expanded Address Mode +#define I2C_MDR_TRX 0x200U // Transmitter Mode +#define I2C_MDR_MST 0x400U // Master Mode +#define I2C_MDR_STP 0x800U // STOP Condition +#define I2C_MDR_STT 0x2000U // START condition bit +#define I2C_MDR_FREE 0x4000U // Debug Action +#define I2C_MDR_NACKMOD 0x8000U // NACK mode bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CISRC register +// +//************************************************************************************************* +#define I2C_ISRC_INTCODE_S 0U +#define I2C_ISRC_INTCODE_M 0x7U // Interrupt code bits. +#define I2C_ISRC_WRITE_ZEROS_S 8U +#define I2C_ISRC_WRITE_ZEROS_M 0xF00U // Always write all 0s to this field + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CEMDR register +// +//************************************************************************************************* +#define I2C_EMDR_BC 0x1U // Backwards compatibility mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CPSC register +// +//************************************************************************************************* +#define I2C_PSC_IPSC_S 0U +#define I2C_PSC_IPSC_M 0xFFU // I2C Prescaler Divide Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CFFTX register +// +//************************************************************************************************* +#define I2C_FFTX_TXFFIL_S 0U +#define I2C_FFTX_TXFFIL_M 0x1FU // Transmit FIFO Interrupt Level +#define I2C_FFTX_TXFFIENA 0x20U // Transmit FIFO Interrupt Enable +#define I2C_FFTX_TXFFINTCLR 0x40U // Transmit FIFO Interrupt Flag Clear +#define I2C_FFTX_TXFFINT 0x80U // Transmit FIFO Interrupt Flag +#define I2C_FFTX_TXFFST_S 8U +#define I2C_FFTX_TXFFST_M 0x1F00U // Transmit FIFO Status +#define I2C_FFTX_TXFFRST 0x2000U // Transmit FIFO Reset +#define I2C_FFTX_I2CFFEN 0x4000U // Transmit FIFO Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CFFRX register +// +//************************************************************************************************* +#define I2C_FFRX_RXFFIL_S 0U +#define I2C_FFRX_RXFFIL_M 0x1FU // Receive FIFO Interrupt Level +#define I2C_FFRX_RXFFIENA 0x20U // Receive FIFO Interrupt Enable +#define I2C_FFRX_RXFFINTCLR 0x40U // Receive FIFO Interrupt Flag Clear +#define I2C_FFRX_RXFFINT 0x80U // Receive FIFO Interrupt Flag +#define I2C_FFRX_RXFFST_S 8U +#define I2C_FFRX_RXFFST_M 0x1F00U // Receive FIFO Status +#define I2C_FFRX_RXFFRST 0x2000U // Receive FIFO Reset + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_inputxbar.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_inputxbar.h new file mode 100644 index 0000000..a2567f2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_inputxbar.h @@ -0,0 +1,92 @@ +//########################################################################### +// +// FILE: hw_inputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_INPUTXBAR_H +#define HW_INPUTXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_INPUT1SELECT 0x0U // INPUT1 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT2SELECT 0x1U // INPUT2 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT3SELECT 0x2U // INPUT3 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT4SELECT 0x3U // INPUT4 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT5SELECT 0x4U // INPUT5 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT6SELECT 0x5U // INPUT6 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT7SELECT 0x6U // INPUT7 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT8SELECT 0x7U // INPUT8 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT9SELECT 0x8U // INPUT9 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT10SELECT 0x9U // INPUT10 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT11SELECT 0xAU // INPUT11 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT12SELECT 0xBU // INPUT12 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT13SELECT 0xCU // INPUT13 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT14SELECT 0xDU // INPUT14 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUTSELECTLOCK 0x1EU // Input Select Lock Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INPUTSELECTLOCK register +// +//************************************************************************************************* +#define XBAR_INPUTSELECTLOCK_INPUT1SELECT 0x1U // Lock bit for INPUT1SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT2SELECT 0x2U // Lock bit for INPUT2SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT3SELECT 0x4U // Lock bit for INPUT3SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT4SELECT 0x8U // Lock bit for INPUT4SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT5SELECT 0x10U // Lock bit for INPUT5SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT6SELECT 0x20U // Lock bit for INPUT6SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT7SELECT 0x40U // Lock bit for INPUT7SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT8SELECT 0x80U // Lock bit for INPUT8SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT9SELECT 0x100U // Lock bit for INPUT9SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT10SELECT 0x200U // Lock bit for INPUT10SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT11SELECT 0x400U // Lock bit for INPUT11SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT12SELECT 0x800U // Lock bit for INPUT12SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT13SELECT 0x1000U // Lock bit for INPUT13SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT14SELECT 0x2000U // Lock bit for INPUT14SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT15SELECT 0x4000U // Lock bit for INPUT15SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT16SELECT 0x8000U // Lock bit for INPUT16SELECT Register + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_ints.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ints.h new file mode 100644 index 0000000..d49c58d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ints.h @@ -0,0 +1,212 @@ +//########################################################################### +// +// FILE: hw_ints.h +// +// TITLE: Definitions of interrupt numbers for use with interrupt.c. +// +//########################################################################### +// +// +//########################################################################### + +#ifndef HW_INTS_H +#define HW_INTS_H + +//***************************************************************************** +// +// PIE Interrupt Numbers +// +// 0x00FF = PIE Table Row # +// 0xFF00 = PIE Table Column # +// 0xFFFF0000 = PIE Vector ID +// +//***************************************************************************** + +// Lower PIE Group 1 +#define INT_ADCA1 0x00200101U // 1.1 - ADCA Interrupt 1 +#define INT_ADCB1 0x00210102U // 1.2 - ADCB Interrupt 1 +#define INT_ADCC1 0x00220103U // 1.3 - ADCC Interrupt 1 +#define INT_XINT1 0x00230104U // 1.4 - XINT1 Interrupt +#define INT_XINT2 0x00240105U // 1.5 - XINT2 Interrupt +#define INT_ADCD1 0x00250106U // 1.6 - ADCD Interrupt 1 +#define INT_TIMER0 0x00260107U // 1.7 - Timer 0 Interrupt +#define INT_WAKE 0x00270108U // 1.8 - Standby and Halt Wakeup Interrupt + +// Lower PIE Group 2 +#define INT_EPWM1_TZ 0x00280201U // 2.1 - ePWM1 Trip Zone Interrupt +#define INT_EPWM2_TZ 0x00290202U // 2.2 - ePWM2 Trip Zone Interrupt +#define INT_EPWM3_TZ 0x002A0203U // 2.3 - ePWM3 Trip Zone Interrupt +#define INT_EPWM4_TZ 0x002B0204U // 2.4 - ePWM4 Trip Zone Interrupt +#define INT_EPWM5_TZ 0x002C0205U // 2.5 - ePWM5 Trip Zone Interrupt +#define INT_EPWM6_TZ 0x002D0206U // 2.6 - ePWM6 Trip Zone Interrupt +#define INT_EPWM7_TZ 0x002E0207U // 2.7 - ePWM7 Trip Zone Interrupt +#define INT_EPWM8_TZ 0x002F0208U // 2.8 - ePWM8 Trip Zone Interrupt + +// Lower PIE Group 3 +#define INT_EPWM1 0x00300301U // 3.1 - ePWM1 Interrupt +#define INT_EPWM2 0x00310302U // 3.2 - ePWM2 Interrupt +#define INT_EPWM3 0x00320303U // 3.3 - ePWM3 Interrupt +#define INT_EPWM4 0x00330304U // 3.4 - ePWM4 Interrupt +#define INT_EPWM5 0x00340305U // 3.5 - ePWM5 Interrupt +#define INT_EPWM6 0x00350306U // 3.6 - ePWM6 Interrupt +#define INT_EPWM7 0x00360307U // 3.7 - ePWM7 Interrupt +#define INT_EPWM8 0x00370308U // 3.8 - ePWM8 Interrupt + +// Lower PIE Group 4 +#define INT_ECAP1 0x00380401U // 4.1 - eCAP1 Interrupt +#define INT_ECAP2 0x00390402U // 4.2 - eCAP2 Interrupt +#define INT_ECAP3 0x003A0403U // 4.3 - eCAP3 Interrupt +#define INT_ECAP4 0x003B0404U // 4.4 - eCAP4 Interrupt +#define INT_ECAP5 0x003C0405U // 4.5 - eCAP5 Interrupt +#define INT_ECAP6 0x003D0406U // 4.6 - eCAP6 Interrupt +// Lower PIE Group 5 +#define INT_EQEP1 0x00400501U // 5.1 - eQEP1 Interrupt +#define INT_EQEP2 0x00410502U // 5.2 - eQEP2 Interrupt +#define INT_EQEP3 0x00420503U // 5.3 - eQEP3 Interrupt +#define INT_CLB1 0x00440505U // 5.5 - CLB1 (Reconfigurable Logic) Interrupt +#define INT_CLB2 0x00450506U // 5.6 - CLB2 (Reconfigurable Logic) Interrupt +#define INT_CLB3 0x00460507U // 5.7 - CLB3 (Reconfigurable Logic) Interrupt +#define INT_CLB4 0x00470508U // 5.8 - CLB4 (Reconfigurable Logic) Interrupt + +// Lower PIE Group 6 +#define INT_SPIA_RX 0x00480601U // 6.1 - SPIA Receive Interrupt +#define INT_SPIA_TX 0x00490602U // 6.2 - SPIA Transmit Interrupt +#define INT_SPIB_RX 0x004A0603U // 6.3 - SPIB Receive Interrupt +#define INT_SPIB_TX 0x004B0604U // 6.4 - SPIB Transmit Interrupt +#define INT_MCBSPA_RX 0x004C0605U // 6.5 - McBSPA Receive Interrupt +#define INT_MCBSPA_TX 0x004D0606U // 6.6 - McBSPA Transmit Interrupt +#define INT_MCBSPB_RX 0x004E0607U // 6.7 - McBSPB Receive Interrupt +#define INT_MCBSPB_TX 0x004F0608U // 6.8 - McBSPB Transmit Interrupt + +// Lower PIE Group 7 +#define INT_DMA_CH1 0x00500701U // 7.1 - DMA Channel 1 Interrupt +#define INT_DMA_CH2 0x00510702U // 7.2 - DMA Channel 2 Interrupt +#define INT_DMA_CH3 0x00520703U // 7.3 - DMA Channel 3 Interrupt +#define INT_DMA_CH4 0x00530704U // 7.4 - DMA Channel 4 Interrupt +#define INT_DMA_CH5 0x00540705U // 7.5 - DMA Channel 5 Interrupt +#define INT_DMA_CH6 0x00550706U // 7.6 - DMA Channel 6 Interrupt + +// Lower PIE Group 8 +#define INT_I2CA 0x00580801U // 8.1 - I2CA Interrupt 1 +#define INT_I2CA_FIFO 0x00590802U // 8.2 - I2CA Interrupt 2 +#define INT_I2CB 0x005A0803U // 8.3 - I2CB Interrupt 1 +#define INT_I2CB_FIFO 0x005B0804U // 8.4 - I2CB Interrupt 2 +#define INT_SCIC_RX 0x005C0805U // 8.5 - SCIC Receive Interrupt +#define INT_SCIC_TX 0x005D0806U // 8.6 - SCIC Transmit Interrupt +#define INT_SCID_RX 0x005E0807U // 8.7 - SCID Receive Interrupt +#define INT_SCID_TX 0x005F0808U // 8.8 - SCID Transmit Interrupt + +// Lower PIE Group 9 +#define INT_SCIA_RX 0x00600901U // 9.1 - SCIA Receive Interrupt +#define INT_SCIA_TX 0x00610902U // 9.2 - SCIA Transmit Interrupt +#define INT_SCIB_RX 0x00620903U // 9.3 - SCIB Receive Interrupt +#define INT_SCIB_TX 0x00630904U // 9.4 - SCIB Transmit Interrupt +#define INT_CANA0 0x00640905U // 9.5 - CANA Interrupt 0 +#define INT_CANA1 0x00650906U // 9.6 - CANA Interrupt 1 +#define INT_CANB0 0x00660907U // 9.7 - CANB Interrupt 0 +#define INT_CANB1 0x00670908U // 9.8 - CANB Interrupt 1 + +// Lower PIE Group 10 +#define INT_ADCA_EVT 0x00680A01U // 10.1 - ADCA Event Interrupt +#define INT_ADCA2 0x00690A02U // 10.2 - ADCA Interrupt 2 +#define INT_ADCA3 0x006A0A03U // 10.3 - ADCA Interrupt 3 +#define INT_ADCA4 0x006B0A04U // 10.4 - ADCA Interrupt 4 +#define INT_ADCB_EVT 0x006C0A05U // 10.5 - ADCB Event Interrupt +#define INT_ADCB2 0x006D0A06U // 10.6 - ADCB Interrupt 2 +#define INT_ADCB3 0x006E0A07U // 10.7 - ADCB Interrupt 3 +#define INT_ADCB4 0x006F0A08U // 10.8 - ADCB Interrupt 4 + +// Lower PIE Group 11 +#define INT_CLA1_1 0x00700B01U // 11.1 - CLA1 Interrupt 1 +#define INT_CLA1_2 0x00710B02U // 11.2 - CLA1 Interrupt 2 +#define INT_CLA1_3 0x00720B03U // 11.3 - CLA1 Interrupt 3 +#define INT_CLA1_4 0x00730B04U // 11.4 - CLA1 Interrupt 4 +#define INT_CLA1_5 0x00740B05U // 11.5 - CLA1 Interrupt 5 +#define INT_CLA1_6 0x00750B06U // 11.6 - CLA1 Interrupt 6 +#define INT_CLA1_7 0x00760B07U // 11.7 - CLA1 Interrupt 7 +#define INT_CLA1_8 0x00770B08U // 11.8 - CLA1 Interrupt 8 + +// Lower PIE Group 12 +#define INT_XINT3 0x00780C01U // 12.1 - XINT3 Interrupt +#define INT_XINT4 0x00790C02U // 12.2 - XINT4 Interrupt +#define INT_XINT5 0x007A0C03U // 12.3 - XINT5 Interrupt +#define INT_PBIST 0x007B0C04U // 12.4 - PBIST Interrupt +#define INT_FMC 0x007C0C05U // 12.5 - Flash Wrapper Operation Done Interrupt +#define INT_VCU 0x007D0C06U // 12.6 - VCU Interrupt +#define INT_FPU_OVERFLOW 0x007E0C07U // 12.7 - FPU Overflow Interrupt +#define INT_FPU_UNDERFLOW 0x007F0C08U // 12.8 - FPU Underflow Interrupt + +// Upper PIE Group 1 +#define INT_IPC_0 0x0084010DU // 1.13 - IPC Interrupt 1 +#define INT_IPC_1 0x0085010EU // 1.14 - IPC Interrupt 2 +#define INT_IPC_2 0x0086010FU // 1.15 - IPC Interrupt 3 +#define INT_IPC_3 0x00870110U // 1.16 - IPC Interrupt 4 + +// Upper PIE Group 2 +#define INT_EPWM9_TZ 0x00880209U // 2.9 - ePWM9 Trip Zone Interrupt +#define INT_EPWM10_TZ 0x0089020AU // 2.10 - ePWM10 Trip Zone Interrupt +#define INT_EPWM11_TZ 0x008A020BU // 2.11 - ePWM11 Trip Zone Interrupt +#define INT_EPWM12_TZ 0x008B020CU // 2.12 - ePWM12 Trip Zone Interrupt + +// Upper PIE Group 3 +#define INT_EPWM9 0x00900309U // 3.9 - ePWM9 Interrupt +#define INT_EPWM10 0x0091030AU // 3.10 - ePWM10 Interrupt +#define INT_EPWM11 0x0092030BU // 3.11 - ePWM11 Interrupt +#define INT_EPWM12 0x0093030CU // 3.12 - ePWM12 Interrupt + +// Upper PIE Group 5 +#define INT_SD1 0x00A00509U // 5.9 - SD1 Interrupt +#define INT_SD2 0x00A1050AU // 5.10 - SD2 Interrupt + +// Upper PIE Group 6 +#define INT_SPIC_RX 0x00A80609U // 6.9 - SPIC Receive Interrupt +#define INT_SPIC_TX 0x00A9060AU // 6.10 - SPIC Transmit Interrupt + +// Upper PIE Group 8 +#define INT_UPPA 0x00BE080FU // 8.15 - uPPA Interrupt + +// Upper PIE Group 9 +#define INT_USBA 0x00C6090FU // 9.15 - USBA Interrupt + +// Upper PIE Group 10 +#define INT_ADCC_EVT 0x00C80A09U // 10.9 - ADCC Event Interrupt +#define INT_ADCC2 0x00C90A0AU // 10.10 - ADCC Interrupt 2 +#define INT_ADCC3 0x00CA0A0BU // 10.11 - ADCC Interrupt 3 +#define INT_ADCC4 0x00CB0A0CU // 10.12 - ADCC Interrupt 4 +#define INT_ADCD_EVT 0x00CC0A0DU // 10.13 - ADCD Event Interrupt +#define INT_ADCD2 0x00CD0A0EU // 10.14 - ADCD Interrupt 2 +#define INT_ADCD3 0x00CE0A0FU // 10.15 - ADCD Interrupt 3 +#define INT_ADCD4 0x00CF0A10U // 10.16 - ADCD Interrupt 4 + +// Upper PIE Group 12 +#define INT_EMIF_ERROR 0x00D80C09U // 12.9 - EMIF Error Interrupt +#define INT_RAM_CORR_ERR 0x00D90C0AU // 12.10 - RAM Correctable Error Interrupt +#define INT_FLASH_CORR_ERR 0x00DA0C0BU // 12.11 - Flash Correctable Error Interrupt +#define INT_RAM_ACC_VIOL 0x00DB0C0CU // 12.12 - RAM Access Violation Interrupt +#define INT_SYS_PLL_SLIP 0x00DC0C0DU // 12.13 - System PLL Slip Interrupt +#define INT_AUX_PLL_SLIP 0x00DD0C0EU // 12.14 - Auxiliary PLL Slip Interrupt +#define INT_CLA_OVERFLOW 0x00DE0C0FU // 12.15 - CLA Overflow Interrupt +#define INT_CLA_UNDERFLOW 0x00DF0C10U // 12.16 - CLA Underflow Interrupt + +// Other interrupts +#define INT_TIMER1 0x000D0000U // CPU Timer 1 Interrupt +#define INT_TIMER2 0x000E0000U // CPU Timer 2 Interrupt +#define INT_DATALOG 0x000F0000U // Datalogging Interrupt +#define INT_RTOS 0x00100000U // RTOS Interrupt +#define INT_EMU 0x00110000U // Emulation Interrupt +#define INT_NMI 0x00120000U // Non-Maskable Interrupt +#define INT_ILLEGAL 0x00130000U // Illegal Operation Trap +#define INT_USER1 0x00140000U // User Defined Trap 1 +#define INT_USER2 0x00150000U // User Defined Trap 2 +#define INT_USER3 0x00160000U // User Defined Trap 3 +#define INT_USER4 0x00170000U // User Defined Trap 4 +#define INT_USER5 0x00180000U // User Defined Trap 5 +#define INT_USER6 0x00190000U // User Defined Trap 6 +#define INT_USER7 0x001A0000U // User Defined Trap 7 +#define INT_USER8 0x001B0000U // User Defined Trap 8 +#define INT_USER9 0x001C0000U // User Defined Trap 9 +#define INT_USER10 0x001D0000U // User Defined Trap 10 +#define INT_USER11 0x001E0000U // User Defined Trap 11 +#define INT_USER12 0x001F0000U // User Defined Trap 12 + +#endif // HW_INTS_H diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_ipc.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ipc.h new file mode 100644 index 0000000..e99715f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_ipc.h @@ -0,0 +1,323 @@ +//########################################################################### +// +// FILE: hw_ipc.h +// +// TITLE: Definitions for the IPC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_IPC_H +#define HW_IPC_H + +//***************************************************************************** +// +// The following are defines for the IPC register offsets +// +//***************************************************************************** +#define IPC_O_ACK 0x0U // IPC incoming flag clear + // (acknowledge) register +#define IPC_O_STS 0x2U // IPC incoming flag status + // register +#define IPC_O_SET 0x4U // IPC remote flag set register +#define IPC_O_CLR 0x6U // IPC remote flag clear + // register +#define IPC_O_FLG 0x8U // IPC remote flag status + // register +#define IPC_O_COUNTERL 0xCU // IPC Counter Low Register +#define IPC_O_COUNTERH 0xEU // IPC Counter High Register +#ifndef CPU2 +#define IPC_O_SENDCOM 0x10U // Local to Remote IPC Command + // Register +#define IPC_O_SENDADDR 0x12U // Local to Remote IPC Address + // Register +#define IPC_O_SENDDATA 0x14U // Local to Remote IPC Data + // Register +#define IPC_O_REMOTEREPLY 0x16U // Remote to Local IPC Reply + // Data Register +#define IPC_O_RECVCOM 0x18U // Remote to Local IPC Command + // Register +#define IPC_O_RECVADDR 0x1AU // Remote to Local IPC Address + // Register +#define IPC_O_RECVDATA 0x1CU // Remote to Local IPC Data + // Register +#define IPC_O_LOCALREPLY 0x1EU // Local to Remote IPC Reply + // Data Register +#else +#define IPC_O_RECVCOM 0x10U // Remote to Local IPC Command + // Register +#define IPC_O_RECVADDR 0x12U // Remote to Local IPC Address + // Register +#define IPC_O_RECVDATA 0x14U // Remote to Local IPC Data + // Register +#define IPC_O_LOCALREPLY 0x16U // Local to Remote IPC Reply + // Data Register +#define IPC_O_SENDCOM 0x18U // Local to Remote IPC Command + // Register +#define IPC_O_SENDADDR 0x1AU // Local to Remote IPC Address + // Register +#define IPC_O_SENDDATA 0x1CU // Local to Remote IPC Data + // Register +#define IPC_O_REMOTEREPLY 0x1EU // Remote to Local IPC Reply + // Data Register +#endif +#define IPC_O_BOOTSTS 0x20U // CPU2 to CPU1 IPC Boot Status + // Register +#define IPC_O_BOOTMODE 0x22U // CPU1 to CPU2 IPC Boot Mode + // Register + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCACK register +// +//***************************************************************************** +#define IPC_ACK_IPC0 0x1U // Local IPC Flag 0 + // Acknowledgement +#define IPC_ACK_IPC1 0x2U // Local IPC Flag 1 + // Acknowledgement +#define IPC_ACK_IPC2 0x4U // Local IPC Flag 2 + // Acknowledgement +#define IPC_ACK_IPC3 0x8U // Local IPC Flag 3 + // Acknowledgement +#define IPC_ACK_IPC4 0x10U // Local IPC Flag 4 + // Acknowledgement +#define IPC_ACK_IPC5 0x20U // Local IPC Flag 5 + // Acknowledgement +#define IPC_ACK_IPC6 0x40U // Local IPC Flag 6 + // Acknowledgement +#define IPC_ACK_IPC7 0x80U // Local IPC Flag 7 + // Acknowledgement +#define IPC_ACK_IPC8 0x100U // Local IPC Flag 8 + // Acknowledgement +#define IPC_ACK_IPC9 0x200U // Local IPC Flag 9 + // Acknowledgement +#define IPC_ACK_IPC10 0x400U // Local IPC Flag 10 + // Acknowledgement +#define IPC_ACK_IPC11 0x800U // Local IPC Flag 11 + // Acknowledgement +#define IPC_ACK_IPC12 0x1000U // Local IPC Flag 12 + // Acknowledgement +#define IPC_ACK_IPC13 0x2000U // Local IPC Flag 13 + // Acknowledgement +#define IPC_ACK_IPC14 0x4000U // Local IPC Flag 14 + // Acknowledgement +#define IPC_ACK_IPC15 0x8000U // Local IPC Flag 15 + // Acknowledgement +#define IPC_ACK_IPC16 0x10000U // Local IPC Flag 16 + // Acknowledgement +#define IPC_ACK_IPC17 0x20000U // Local IPC Flag 17 + // Acknowledgement +#define IPC_ACK_IPC18 0x40000U // Local IPC Flag 18 + // Acknowledgement +#define IPC_ACK_IPC19 0x80000U // Local IPC Flag 19 + // Acknowledgement +#define IPC_ACK_IPC20 0x100000U // Local IPC Flag 20 + // Acknowledgement +#define IPC_ACK_IPC21 0x200000U // Local IPC Flag 21 + // Acknowledgement +#define IPC_ACK_IPC22 0x400000U // Local IPC Flag 22 + // Acknowledgement +#define IPC_ACK_IPC23 0x800000U // Local IPC Flag 23 + // Acknowledgement +#define IPC_ACK_IPC24 0x1000000U // Local IPC Flag 24 + // Acknowledgement +#define IPC_ACK_IPC25 0x2000000U // Local IPC Flag 25 + // Acknowledgement +#define IPC_ACK_IPC26 0x4000000U // Local IPC Flag 26 + // Acknowledgement +#define IPC_ACK_IPC27 0x8000000U // Local IPC Flag 27 + // Acknowledgement +#define IPC_ACK_IPC28 0x10000000U // Local IPC Flag 28 + // Acknowledgement +#define IPC_ACK_IPC29 0x20000000U // Local IPC Flag 29 + // Acknowledgement +#define IPC_ACK_IPC30 0x40000000U // Local IPC Flag 30 + // Acknowledgement +#define IPC_ACK_IPC31 0x80000000U // Local IPC Flag 31 + // Acknowledgement + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCSTS register +// +//***************************************************************************** +#define IPC_STS_IPC0 0x1U // Local IPC Flag 0 Status +#define IPC_STS_IPC1 0x2U // Local IPC Flag 1 Status +#define IPC_STS_IPC2 0x4U // Local IPC Flag 2 Status +#define IPC_STS_IPC3 0x8U // Local IPC Flag 3 Status +#define IPC_STS_IPC4 0x10U // Local IPC Flag 4 Status +#define IPC_STS_IPC5 0x20U // Local IPC Flag 5 Status +#define IPC_STS_IPC6 0x40U // Local IPC Flag 6 Status +#define IPC_STS_IPC7 0x80U // Local IPC Flag 7 Status +#define IPC_STS_IPC8 0x100U // Local IPC Flag 8 Status +#define IPC_STS_IPC9 0x200U // Local IPC Flag 9 Status +#define IPC_STS_IPC10 0x400U // Local IPC Flag 10 Status +#define IPC_STS_IPC11 0x800U // Local IPC Flag 11 Status +#define IPC_STS_IPC12 0x1000U // Local IPC Flag 12 Status +#define IPC_STS_IPC13 0x2000U // Local IPC Flag 13 Status +#define IPC_STS_IPC14 0x4000U // Local IPC Flag 14 Status +#define IPC_STS_IPC15 0x8000U // Local IPC Flag 15 Status +#define IPC_STS_IPC16 0x10000U // Local IPC Flag 16 Status +#define IPC_STS_IPC17 0x20000U // Local IPC Flag 17 Status +#define IPC_STS_IPC18 0x40000U // Local IPC Flag 18 Status +#define IPC_STS_IPC19 0x80000U // Local IPC Flag 19 Status +#define IPC_STS_IPC20 0x100000U // Local IPC Flag 20 Status +#define IPC_STS_IPC21 0x200000U // Local IPC Flag 21 Status +#define IPC_STS_IPC22 0x400000U // Local IPC Flag 22 Status +#define IPC_STS_IPC23 0x800000U // Local IPC Flag 23 Status +#define IPC_STS_IPC24 0x1000000U // Local IPC Flag 24 Status +#define IPC_STS_IPC25 0x2000000U // Local IPC Flag 25 Status +#define IPC_STS_IPC26 0x4000000U // Local IPC Flag 26 Status +#define IPC_STS_IPC27 0x8000000U // Local IPC Flag 27 Status +#define IPC_STS_IPC28 0x10000000U // Local IPC Flag 28 Status +#define IPC_STS_IPC29 0x20000000U // Local IPC Flag 29 Status +#define IPC_STS_IPC30 0x40000000U // Local IPC Flag 30 Status +#define IPC_STS_IPC31 0x80000000U // Local IPC Flag 31 Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCSET register +// +//***************************************************************************** +#define IPC_SET_IPC0 0x1U // Set Remote IPC0 Flag +#define IPC_SET_IPC1 0x2U // Set Remote IPC1 Flag +#define IPC_SET_IPC2 0x4U // Set Remote IPC2 Flag +#define IPC_SET_IPC3 0x8U // Set Remote IPC3 Flag +#define IPC_SET_IPC4 0x10U // Set Remote IPC4 Flag +#define IPC_SET_IPC5 0x20U // Set Remote IPC5 Flag +#define IPC_SET_IPC6 0x40U // Set Remote IPC6 Flag +#define IPC_SET_IPC7 0x80U // Set Remote IPC7 Flag +#define IPC_SET_IPC8 0x100U // Set Remote IPC8 Flag +#define IPC_SET_IPC9 0x200U // Set Remote IPC9 Flag +#define IPC_SET_IPC10 0x400U // Set Remote IPC10 Flag +#define IPC_SET_IPC11 0x800U // Set Remote IPC11 Flag +#define IPC_SET_IPC12 0x1000U // Set Remote IPC12 Flag +#define IPC_SET_IPC13 0x2000U // Set Remote IPC13 Flag +#define IPC_SET_IPC14 0x4000U // Set Remote IPC14 Flag +#define IPC_SET_IPC15 0x8000U // Set Remote IPC15 Flag +#define IPC_SET_IPC16 0x10000U // Set Remote IPC16 Flag +#define IPC_SET_IPC17 0x20000U // Set Remote IPC17 Flag +#define IPC_SET_IPC18 0x40000U // Set Remote IPC18 Flag +#define IPC_SET_IPC19 0x80000U // Set Remote IPC19 Flag +#define IPC_SET_IPC20 0x100000U // Set Remote IPC20 Flag +#define IPC_SET_IPC21 0x200000U // Set Remote IPC21 Flag +#define IPC_SET_IPC22 0x400000U // Set Remote IPC22 Flag +#define IPC_SET_IPC23 0x800000U // Set Remote IPC23 Flag +#define IPC_SET_IPC24 0x1000000U // Set Remote IPC24 Flag +#define IPC_SET_IPC25 0x2000000U // Set Remote IPC25 Flag +#define IPC_SET_IPC26 0x4000000U // Set Remote IPC26 Flag +#define IPC_SET_IPC27 0x8000000U // Set Remote IPC27 Flag +#define IPC_SET_IPC28 0x10000000U // Set Remote IPC28 Flag +#define IPC_SET_IPC29 0x20000000U // Set Remote IPC29 Flag +#define IPC_SET_IPC30 0x40000000U // Set Remote IPC30 Flag +#define IPC_SET_IPC31 0x80000000U // Set Remote IPC31 Flag + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCCLR register +// +//***************************************************************************** +#define IPC_CLR_IPC0 0x1U // Clear Remote IPC0 Flag +#define IPC_CLR_IPC1 0x2U // Clear Remote IPC1 Flag +#define IPC_CLR_IPC2 0x4U // Clear Remote IPC2 Flag +#define IPC_CLR_IPC3 0x8U // Clear Remote IPC3 Flag +#define IPC_CLR_IPC4 0x10U // Clear Remote IPC4 Flag +#define IPC_CLR_IPC5 0x20U // Clear Remote IPC5 Flag +#define IPC_CLR_IPC6 0x40U // Clear Remote IPC6 Flag +#define IPC_CLR_IPC7 0x80U // Clear Remote IPC7 Flag +#define IPC_CLR_IPC8 0x100U // Clear Remote IPC8 Flag +#define IPC_CLR_IPC9 0x200U // Clear Remote IPC9 Flag +#define IPC_CLR_IPC10 0x400U // Clear Remote IPC10 Flag +#define IPC_CLR_IPC11 0x800U // Clear Remote IPC11 Flag +#define IPC_CLR_IPC12 0x1000U // Clear Remote IPC12 Flag +#define IPC_CLR_IPC13 0x2000U // Clear Remote IPC13 Flag +#define IPC_CLR_IPC14 0x4000U // Clear Remote IPC14 Flag +#define IPC_CLR_IPC15 0x8000U // Clear Remote IPC15 Flag +#define IPC_CLR_IPC16 0x10000U // Clear Remote IPC16 Flag +#define IPC_CLR_IPC17 0x20000U // Clear Remote IPC17 Flag +#define IPC_CLR_IPC18 0x40000U // Clear Remote IPC18 Flag +#define IPC_CLR_IPC19 0x80000U // Clear Remote IPC19 Flag +#define IPC_CLR_IPC20 0x100000U // Clear Remote IPC20 Flag +#define IPC_CLR_IPC21 0x200000U // Clear Remote IPC21 Flag +#define IPC_CLR_IPC22 0x400000U // Clear Remote IPC22 Flag +#define IPC_CLR_IPC23 0x800000U // Clear Remote IPC23 Flag +#define IPC_CLR_IPC24 0x1000000U // Clear Remote IPC24 Flag +#define IPC_CLR_IPC25 0x2000000U // Clear Remote IPC25 Flag +#define IPC_CLR_IPC26 0x4000000U // Clear Remote IPC26 Flag +#define IPC_CLR_IPC27 0x8000000U // Clear Remote IPC27 Flag +#define IPC_CLR_IPC28 0x10000000U // Clear Remote IPC28 Flag +#define IPC_CLR_IPC29 0x20000000U // Clear Remote IPC29 Flag +#define IPC_CLR_IPC30 0x40000000U // Clear Remote IPC30 Flag +#define IPC_CLR_IPC31 0x80000000U // Clear Remote IPC31 Flag + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCFLG register +// +//***************************************************************************** +#define IPC_FLG_IPC0 0x1U // Remote IPC0 Flag Status +#define IPC_FLG_IPC1 0x2U // Remote IPC1 Flag Status +#define IPC_FLG_IPC2 0x4U // Remote IPC2 Flag Status +#define IPC_FLG_IPC3 0x8U // Remote IPC3 Flag Status +#define IPC_FLG_IPC4 0x10U // Remote IPC4 Flag Status +#define IPC_FLG_IPC5 0x20U // Remote IPC5 Flag Status +#define IPC_FLG_IPC6 0x40U // Remote IPC6 Flag Status +#define IPC_FLG_IPC7 0x80U // Remote IPC7 Flag Status +#define IPC_FLG_IPC8 0x100U // Remote IPC8 Flag Status +#define IPC_FLG_IPC9 0x200U // Remote IPC9 Flag Status +#define IPC_FLG_IPC10 0x400U // Remote IPC10 Flag Status +#define IPC_FLG_IPC11 0x800U // Remote IPC11 Flag Status +#define IPC_FLG_IPC12 0x1000U // Remote IPC12 Flag Status +#define IPC_FLG_IPC13 0x2000U // Remote IPC13 Flag Status +#define IPC_FLG_IPC14 0x4000U // Remote IPC14 Flag Status +#define IPC_FLG_IPC15 0x8000U // Remote IPC15 Flag Status +#define IPC_FLG_IPC16 0x10000U // Remote IPC16 Flag Status +#define IPC_FLG_IPC17 0x20000U // Remote IPC17 Flag Status +#define IPC_FLG_IPC18 0x40000U // Remote IPC18 Flag Status +#define IPC_FLG_IPC19 0x80000U // Remote IPC19 Flag Status +#define IPC_FLG_IPC20 0x100000U // Remote IPC20 Flag Status +#define IPC_FLG_IPC21 0x200000U // Remote IPC21 Flag Status +#define IPC_FLG_IPC22 0x400000U // Remote IPC22 Flag Status +#define IPC_FLG_IPC23 0x800000U // Remote IPC23 Flag Status +#define IPC_FLG_IPC24 0x1000000U // Remote IPC24 Flag Status +#define IPC_FLG_IPC25 0x2000000U // Remote IPC25 Flag Status +#define IPC_FLG_IPC26 0x4000000U // Remote IPC26 Flag Status +#define IPC_FLG_IPC27 0x8000000U // Remote IPC27 Flag Status +#define IPC_FLG_IPC28 0x10000000U // Remote IPC28 Flag Status +#define IPC_FLG_IPC29 0x20000000U // Remote IPC29 Flag Status +#define IPC_FLG_IPC30 0x40000000U // Remote IPC30 Flag Status +#define IPC_FLG_IPC31 0x80000000U // Remote IPC31 Flag Status +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_mcbsp.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_mcbsp.h new file mode 100644 index 0000000..814055f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_mcbsp.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_mcbsp.h +// +// TITLE: Definitions for the MCBSP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MCBSP_H +#define HW_MCBSP_H + +//************************************************************************************************* +// +// The following are defines for the MCBSP register offsets +// +//************************************************************************************************* +#define MCBSP_O_DRR2 0x0U // Data receive register bits 31-16 +#define MCBSP_O_DRR1 0x1U // Data receive register bits 15-0 +#define MCBSP_O_DXR2 0x2U // Data transmit register bits 31-16 +#define MCBSP_O_DXR1 0x3U // Data transmit register bits 15-0 +#define MCBSP_O_SPCR2 0x4U // Serial port control register 2 +#define MCBSP_O_SPCR1 0x5U // Serial port control register 1 +#define MCBSP_O_RCR2 0x6U // Receive Control register 2 +#define MCBSP_O_RCR1 0x7U // Receive Control register 1 +#define MCBSP_O_XCR2 0x8U // Transmit Control register 2 +#define MCBSP_O_XCR1 0x9U // Transmit Control register 1 +#define MCBSP_O_SRGR2 0xAU // Sample rate generator register 2 +#define MCBSP_O_SRGR1 0xBU // Sample rate generator register 1 +#define MCBSP_O_MCR2 0xCU // Multi-channel control register 2 +#define MCBSP_O_MCR1 0xDU // Multi-channel control register 1 +#define MCBSP_O_RCERA 0xEU // Receive channel enable partition A +#define MCBSP_O_RCERB 0xFU // Receive channel enable partition B +#define MCBSP_O_XCERA 0x10U // Transmit channel enable partition A +#define MCBSP_O_XCERB 0x11U // Transmit channel enable partition B +#define MCBSP_O_PCR 0x12U // Pin Control register +#define MCBSP_O_RCERC 0x13U // Receive channel enable partition C +#define MCBSP_O_RCERD 0x14U // Receive channel enable partition D +#define MCBSP_O_XCERC 0x15U // Transmit channel enable partition C +#define MCBSP_O_XCERD 0x16U // Transmit channel enable partition D +#define MCBSP_O_RCERE 0x17U // Receive channel enable partition E +#define MCBSP_O_RCERF 0x18U // Receive channel enable partition F +#define MCBSP_O_XCERE 0x19U // Transmit channel enable partition E +#define MCBSP_O_XCERF 0x1AU // Transmit channel enable partition F +#define MCBSP_O_RCERG 0x1BU // Receive channel enable partition G +#define MCBSP_O_RCERH 0x1CU // Receive channel enable partition H +#define MCBSP_O_XCERG 0x1DU // Transmit channel enable partition G +#define MCBSP_O_XCERH 0x1EU // Transmit channel enable partition H +#define MCBSP_O_MFFINT 0x23U // Interrupt enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DRR2 register +// +//************************************************************************************************* +#define MCBSP_DRR2_HWLB_S 0U +#define MCBSP_DRR2_HWLB_M 0xFFU // High word low byte +#define MCBSP_DRR2_HWHB_S 8U +#define MCBSP_DRR2_HWHB_M 0xFF00U // High word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DRR1 register +// +//************************************************************************************************* +#define MCBSP_DRR1_LWLB_S 0U +#define MCBSP_DRR1_LWLB_M 0xFFU // Low word low byte +#define MCBSP_DRR1_LWHB_S 8U +#define MCBSP_DRR1_LWHB_M 0xFF00U // Low word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DXR2 register +// +//************************************************************************************************* +#define MCBSP_DXR2_HWLB_S 0U +#define MCBSP_DXR2_HWLB_M 0xFFU // High word low byte +#define MCBSP_DXR2_HWHB_S 8U +#define MCBSP_DXR2_HWHB_M 0xFF00U // High word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DXR1 register +// +//************************************************************************************************* +#define MCBSP_DXR1_LWLB_S 0U +#define MCBSP_DXR1_LWLB_M 0xFFU // Low word low byte +#define MCBSP_DXR1_LWHB_S 8U +#define MCBSP_DXR1_LWHB_M 0xFF00U // Low word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPCR2 register +// +//************************************************************************************************* +#define MCBSP_SPCR2_XRST 0x1U // Transmitter reset +#define MCBSP_SPCR2_XRDY 0x2U // Transmitter ready +#define MCBSP_SPCR2_XEMPTY 0x4U // Transmitter empty +#define MCBSP_SPCR2_XSYNCERR 0x8U // Transmit sync error INT flag +#define MCBSP_SPCR2_XINTM_S 4U +#define MCBSP_SPCR2_XINTM_M 0x30U // Transmit Interupt mode bits +#define MCBSP_SPCR2_GRST 0x40U // Sample rate generator reset +#define MCBSP_SPCR2_FRST 0x80U // Frame sync logic reset +#define MCBSP_SPCR2_SOFT 0x100U // SOFT bit +#define MCBSP_SPCR2_FREE 0x200U // FREE bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPCR1 register +// +//************************************************************************************************* +#define MCBSP_SPCR1_RRST 0x1U // Receiver reset +#define MCBSP_SPCR1_RRDY 0x2U // Receiver ready +#define MCBSP_SPCR1_RFULL 0x4U // Receiver full +#define MCBSP_SPCR1_RSYNCERR 0x8U // Receive sync error INT flag +#define MCBSP_SPCR1_RINTM_S 4U +#define MCBSP_SPCR1_RINTM_M 0x30U // Receive Interupt mode bits +#define MCBSP_SPCR1_DXENA 0x80U // DX delay enable +#define MCBSP_SPCR1_CLKSTP_S 11U +#define MCBSP_SPCR1_CLKSTP_M 0x1800U // Clock stop mode +#define MCBSP_SPCR1_RJUST_S 13U +#define MCBSP_SPCR1_RJUST_M 0x6000U // Rx sign extension and justification mode +#define MCBSP_SPCR1_DLB 0x8000U // Digital loopback + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCR2 register +// +//************************************************************************************************* +#define MCBSP_RCR2_RDATDLY_S 0U +#define MCBSP_RCR2_RDATDLY_M 0x3U // Receive data delay +#define MCBSP_RCR2_RFIG 0x4U // Receive frame sync ignore +#define MCBSP_RCR2_RCOMPAND_S 3U +#define MCBSP_RCR2_RCOMPAND_M 0x18U // Receive Companding Mode selects +#define MCBSP_RCR2_RWDLEN2_S 5U +#define MCBSP_RCR2_RWDLEN2_M 0xE0U // Receive word length 2 +#define MCBSP_RCR2_RFRLEN2_S 8U +#define MCBSP_RCR2_RFRLEN2_M 0x7F00U // Receive Frame length 2 +#define MCBSP_RCR2_RPHASE 0x8000U // Receive Phase + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCR1 register +// +//************************************************************************************************* +#define MCBSP_RCR1_RWDLEN1_S 5U +#define MCBSP_RCR1_RWDLEN1_M 0xE0U // Receive word length 1 +#define MCBSP_RCR1_RFRLEN1_S 8U +#define MCBSP_RCR1_RFRLEN1_M 0x7F00U // Receive Frame length 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCR2 register +// +//************************************************************************************************* +#define MCBSP_XCR2_XDATDLY_S 0U +#define MCBSP_XCR2_XDATDLY_M 0x3U // Transmit data delay +#define MCBSP_XCR2_XFIG 0x4U // Transmit frame sync ignore +#define MCBSP_XCR2_XCOMPAND_S 3U +#define MCBSP_XCR2_XCOMPAND_M 0x18U // Transmit Companding Mode selects +#define MCBSP_XCR2_XWDLEN2_S 5U +#define MCBSP_XCR2_XWDLEN2_M 0xE0U // Transmit word length 2 +#define MCBSP_XCR2_XFRLEN2_S 8U +#define MCBSP_XCR2_XFRLEN2_M 0x7F00U // Transmit Frame length 2 +#define MCBSP_XCR2_XPHASE 0x8000U // Transmit Phase + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCR1 register +// +//************************************************************************************************* +#define MCBSP_XCR1_XWDLEN1_S 5U +#define MCBSP_XCR1_XWDLEN1_M 0xE0U // Transmit word length 1 +#define MCBSP_XCR1_XFRLEN1_S 8U +#define MCBSP_XCR1_XFRLEN1_M 0x7F00U // Transmit Frame length 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SRGR2 register +// +//************************************************************************************************* +#define MCBSP_SRGR2_FPER_S 0U +#define MCBSP_SRGR2_FPER_M 0xFFFU // Frame-sync period +#define MCBSP_SRGR2_FSGM 0x1000U // Frame sync generator mode +#define MCBSP_SRGR2_CLKSM 0x2000U // Sample rate generator mode +#define MCBSP_SRGR2_GSYNC 0x8000U // CLKG sync + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SRGR1 register +// +//************************************************************************************************* +#define MCBSP_SRGR1_CLKGDV_S 0U +#define MCBSP_SRGR1_CLKGDV_M 0xFFU // CLKG divider +#define MCBSP_SRGR1_FWID_S 8U +#define MCBSP_SRGR1_FWID_M 0xFF00U // Frame width + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCR2 register +// +//************************************************************************************************* +#define MCBSP_MCR2_XMCM_S 0U +#define MCBSP_MCR2_XMCM_M 0x3U // Transmit data delay +#define MCBSP_MCR2_XCBLK_S 2U +#define MCBSP_MCR2_XCBLK_M 0x1CU // Transmit frame sync ignore +#define MCBSP_MCR2_XPABLK_S 5U +#define MCBSP_MCR2_XPABLK_M 0x60U // Transmit Companding Mode selects +#define MCBSP_MCR2_XPBBLK_S 7U +#define MCBSP_MCR2_XPBBLK_M 0x180U // Transmit word length 2 +#define MCBSP_MCR2_XMCME 0x200U // Transmit Frame length 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCR1 register +// +//************************************************************************************************* +#define MCBSP_MCR1_RMCM 0x1U // Receive multichannel mode +#define MCBSP_MCR1_RCBLK_S 2U +#define MCBSP_MCR1_RCBLK_M 0x1CU // eceive current block +#define MCBSP_MCR1_RPABLK_S 5U +#define MCBSP_MCR1_RPABLK_M 0x60U // Receive partition A Block +#define MCBSP_MCR1_RPBBLK_S 7U +#define MCBSP_MCR1_RPBBLK_M 0x180U // Receive partition B Block +#define MCBSP_MCR1_RMCME 0x200U // Receive multi-channel enhance mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCR register +// +//************************************************************************************************* +#define MCBSP_PCR_CLKRP 0x1U // Receive Clock polarity +#define MCBSP_PCR_CLKXP 0x2U // Transmit clock polarity +#define MCBSP_PCR_FSRP 0x4U // Receive Frame synchronization polarity +#define MCBSP_PCR_FSXP 0x8U // Transmit Frame synchronization polarity +#define MCBSP_PCR_SCLKME 0x80U // Sample clock mode selection +#define MCBSP_PCR_CLKRM 0x100U // Receiver Clock Mode +#define MCBSP_PCR_CLKXM 0x200U // Transmit Clock Mode. +#define MCBSP_PCR_FSRM 0x400U // Receive Frame Synchronization Mode +#define MCBSP_PCR_FSXM 0x800U // Transmit Frame Synchronization Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MFFINT register +// +//************************************************************************************************* +#define MCBSP_MFFINT_XINT 0x1U // Enable for Receive Interrupt +#define MCBSP_MFFINT_RINT 0x4U // Enable for transmit Interrupt + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_memcfg.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_memcfg.h new file mode 100644 index 0000000..d5d7e8c --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_memcfg.h @@ -0,0 +1,870 @@ +//########################################################################### +// +// FILE: hw_memcfg.h +// +// TITLE: Definitions for the MEMCFG registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MEMCFG_H +#define HW_MEMCFG_H + +//************************************************************************************************* +// +// The following are defines for the MEMCFG register offsets +// +//************************************************************************************************* +#define MEMCFG_O_DXLOCK 0x0U // Dedicated RAM Config Lock Register +#define MEMCFG_O_DXCOMMIT 0x2U // Dedicated RAM Config Lock Commit Register +#define MEMCFG_O_DXACCPROT0 0x8U // Dedicated RAM Config Register +#define MEMCFG_O_DXTEST 0x10U // Dedicated RAM TEST Register +#define MEMCFG_O_DXINIT 0x12U // Dedicated RAM Init Register +#define MEMCFG_O_DXINITDONE 0x14U // Dedicated RAM InitDone Status Register +#define MEMCFG_O_LSXLOCK 0x20U // Local Shared RAM Config Lock Register +#define MEMCFG_O_LSXCOMMIT 0x22U // Local Shared RAM Config Lock Commit Register +#define MEMCFG_O_LSXMSEL 0x24U // Local Shared RAM Master Sel Register +#define MEMCFG_O_LSXCLAPGM 0x26U // Local Shared RAM Prog/Exe control Register +#define MEMCFG_O_LSXACCPROT0 0x28U // Local Shared RAM Config Register 0 +#define MEMCFG_O_LSXACCPROT1 0x2AU // Local Shared RAM Config Register 1 +#define MEMCFG_O_LSXTEST 0x30U // Local Shared RAM TEST Register +#define MEMCFG_O_LSXINIT 0x32U // Local Shared RAM Init Register +#define MEMCFG_O_LSXINITDONE 0x34U // Local Shared RAM InitDone Status Register +#define MEMCFG_O_GSXLOCK 0x40U // Global Shared RAM Config Lock Register +#define MEMCFG_O_GSXCOMMIT 0x42U // Global Shared RAM Config Lock Commit Register +#define MEMCFG_O_GSXMSEL 0x44U // Global Shared RAM Master Sel Register +#define MEMCFG_O_GSXACCPROT0 0x48U // Global Shared RAM Config Register 0 +#define MEMCFG_O_GSXACCPROT1 0x4AU // Global Shared RAM Config Register 1 +#define MEMCFG_O_GSXACCPROT2 0x4CU // Global Shared RAM Config Register 2 +#define MEMCFG_O_GSXACCPROT3 0x4EU // Global Shared RAM Config Register 3 +#define MEMCFG_O_GSXTEST 0x50U // Global Shared RAM TEST Register +#define MEMCFG_O_GSXINIT 0x52U // Global Shared RAM Init Register +#define MEMCFG_O_GSXINITDONE 0x54U // Global Shared RAM InitDone Status Register +#define MEMCFG_O_MSGXTEST 0x70U // Message RAM TEST Register +#define MEMCFG_O_MSGXINIT 0x72U // Message RAM Init Register +#define MEMCFG_O_MSGXINITDONE 0x74U // Message RAM InitDone Status Register + +#define MEMCFG_O_EMIF1LOCK 0x0U // EMIF1 Config Lock Register +#define MEMCFG_O_EMIF1COMMIT 0x2U // EMIF1 Config Lock Commit Register +#define MEMCFG_O_EMIF1MSEL 0x4U // EMIF1 Master Sel Register +#define MEMCFG_O_EMIF1ACCPROT0 0x8U // EMIF1 Config Register 0 + +#define MEMCFG_O_EMIF2LOCK 0x0U // EMIF2 Config Lock Register +#define MEMCFG_O_EMIF2COMMIT 0x2U // EMIF2 Config Lock Commit Register +#define MEMCFG_O_EMIF2ACCPROT0 0x8U // EMIF2 Config Register 0 + +#define MEMCFG_O_NMAVFLG 0x0U // Non-Master Access Violation Flag Register +#define MEMCFG_O_NMAVSET 0x2U // Non-Master Access Violation Flag Set Register +#define MEMCFG_O_NMAVCLR 0x4U // Non-Master Access Violation Flag Clear Register +#define MEMCFG_O_NMAVINTEN 0x6U // Non-Master Access Violation Interrupt Enable Register +#define MEMCFG_O_NMCPURDAVADDR 0x8U // Non-Master CPU Read Access Violation Address +#define MEMCFG_O_NMCPUWRAVADDR 0xAU // Non-Master CPU Write Access Violation Address +#define MEMCFG_O_NMCPUFAVADDR 0xCU // Non-Master CPU Fetch Access Violation Address +#define MEMCFG_O_NMDMAWRAVADDR 0xEU // Non-Master DMA Write Access Violation Address +#define MEMCFG_O_NMCLA1RDAVADDR 0x10U // Non-Master CLA1 Read Access Violation Address +#define MEMCFG_O_NMCLA1WRAVADDR 0x12U // Non-Master CLA1 Write Access Violation Address +#define MEMCFG_O_NMCLA1FAVADDR 0x14U // Non-Master CLA1 Fetch Access Violation Address +#define MEMCFG_O_MAVFLG 0x20U // Master Access Violation Flag Register +#define MEMCFG_O_MAVSET 0x22U // Master Access Violation Flag Set Register +#define MEMCFG_O_MAVCLR 0x24U // Master Access Violation Flag Clear Register +#define MEMCFG_O_MAVINTEN 0x26U // Master Access Violation Interrupt Enable Register +#define MEMCFG_O_MCPUFAVADDR 0x28U // Master CPU Fetch Access Violation Address +#define MEMCFG_O_MCPUWRAVADDR 0x2AU // Master CPU Write Access Violation Address +#define MEMCFG_O_MDMAWRAVADDR 0x2CU // Master DMA Write Access Violation Address + +#define MEMCFG_O_UCERRFLG 0x0U // Uncorrectable Error Flag Register +#define MEMCFG_O_UCERRSET 0x2U // Uncorrectable Error Flag Set Register +#define MEMCFG_O_UCERRCLR 0x4U // Uncorrectable Error Flag Clear Register +#define MEMCFG_O_UCCPUREADDR 0x6U // Uncorrectable CPU Read Error Address +#define MEMCFG_O_UCDMAREADDR 0x8U // Uncorrectable DMA Read Error Address +#define MEMCFG_O_UCCLA1READDR 0xAU // Uncorrectable CLA1 Read Error Address +#define MEMCFG_O_CERRFLG 0x20U // Correctable Error Flag Register +#define MEMCFG_O_CERRSET 0x22U // Correctable Error Flag Set Register +#define MEMCFG_O_CERRCLR 0x24U // Correctable Error Flag Clear Register +#define MEMCFG_O_CCPUREADDR 0x26U // Correctable CPU Read Error Address +#define MEMCFG_O_CERRCNT 0x2EU // Correctable Error Count Register +#define MEMCFG_O_CERRTHRES 0x30U // Correctable Error Threshold Value Register +#define MEMCFG_O_CEINTFLG 0x32U // Correctable Error Interrupt Flag Status Register +#define MEMCFG_O_CEINTCLR 0x34U // Correctable Error Interrupt Flag Clear Register +#define MEMCFG_O_CEINTSET 0x36U // Correctable Error Interrupt Flag Set Register +#define MEMCFG_O_CEINTEN 0x38U // Correctable Error Interrupt Enable Register + +#define MEMCFG_O_ROMWAITSTATE 0x0U // ROM Wait State Configuration Register + +#define MEMCFG_O_ROMPREFETCH 0x0U // ROM Prefetch Configuration Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxLOCK register +// +//************************************************************************************************* +#define MEMCFG_DXLOCK_LOCK_D0 0x4U // D0 RAM access protection and master select fields lock + // bit +#define MEMCFG_DXLOCK_LOCK_D1 0x8U // D1 RAM access protection and master select fields lock + // bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_DXCOMMIT_COMMIT_D0 0x4U // D0 RAM access protection and master select permanent + // lock +#define MEMCFG_DXCOMMIT_COMMIT_D1 0x8U // D1 RAM access protection and master select permanent + // lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_DXACCPROT0_FETCHPROT_D0 0x10000U // Fetch Protection For D0 RAM +#define MEMCFG_DXACCPROT0_CPUWRPROT_D0 0x20000U // CPU WR Protection For D0 RAM +#define MEMCFG_DXACCPROT0_FETCHPROT_D1 0x1000000U // Fetch Protection For D1 RAM +#define MEMCFG_DXACCPROT0_CPUWRPROT_D1 0x2000000U // CPU WR Protection For D1 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxTEST register +// +//************************************************************************************************* +#define MEMCFG_DXTEST_TEST_M0_S 0U +#define MEMCFG_DXTEST_TEST_M0_M 0x3U // Selects the different modes for M0 RAM +#define MEMCFG_DXTEST_TEST_M1_S 2U +#define MEMCFG_DXTEST_TEST_M1_M 0xCU // Selects the different modes for M1 RAM +#define MEMCFG_DXTEST_TEST_D0_S 4U +#define MEMCFG_DXTEST_TEST_D0_M 0x30U // Selects the different modes for D0 RAM +#define MEMCFG_DXTEST_TEST_D1_S 6U +#define MEMCFG_DXTEST_TEST_D1_M 0xC0U // Selects the different modes for D1 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxINIT register +// +//************************************************************************************************* +#define MEMCFG_DXINIT_INIT_M0 0x1U // RAM Initialization control for M0 RAM. +#define MEMCFG_DXINIT_INIT_M1 0x2U // RAM Initialization control for M1 RAM. +#define MEMCFG_DXINIT_INIT_D0 0x4U // RAM Initialization control for D0 RAM. +#define MEMCFG_DXINIT_INIT_D1 0x8U // RAM Initialization control for D1 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_DXINITDONE_INITDONE_M0 0x1U // RAM Initialization status for M0 RAM. +#define MEMCFG_DXINITDONE_INITDONE_M1 0x2U // RAM Initialization status for M1 RAM. +#define MEMCFG_DXINITDONE_INITDONE_D0 0x4U // RAM Initialization status for D0 RAM. +#define MEMCFG_DXINITDONE_INITDONE_D1 0x8U // RAM Initialization status for D1 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxLOCK register +// +//************************************************************************************************* +#define MEMCFG_LSXLOCK_LOCK_LS0 0x1U // LS0 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS1 0x2U // LS1 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS2 0x4U // LS2 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS3 0x8U // LS3 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS4 0x10U // LS4 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS5 0x20U // LS5 RAM access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_LSXCOMMIT_COMMIT_LS0 0x1U // LS0 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS1 0x2U // LS1 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS2 0x4U // LS2 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS3 0x8U // LS3 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS4 0x10U // LS4 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS5 0x20U // LS5 RAM access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxMSEL register +// +//************************************************************************************************* +#define MEMCFG_LSXMSEL_MSEL_LS0_S 0U +#define MEMCFG_LSXMSEL_MSEL_LS0_M 0x3U // Master Select for LS0 RAM +#define MEMCFG_LSXMSEL_MSEL_LS1_S 2U +#define MEMCFG_LSXMSEL_MSEL_LS1_M 0xCU // Master Select for LS1 RAM +#define MEMCFG_LSXMSEL_MSEL_LS2_S 4U +#define MEMCFG_LSXMSEL_MSEL_LS2_M 0x30U // Master Select for LS2 RAM +#define MEMCFG_LSXMSEL_MSEL_LS3_S 6U +#define MEMCFG_LSXMSEL_MSEL_LS3_M 0xC0U // Master Select for LS3 RAM +#define MEMCFG_LSXMSEL_MSEL_LS4_S 8U +#define MEMCFG_LSXMSEL_MSEL_LS4_M 0x300U // Master Select for LS4 RAM +#define MEMCFG_LSXMSEL_MSEL_LS5_S 10U +#define MEMCFG_LSXMSEL_MSEL_LS5_M 0xC00U // Master Select for LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxCLAPGM register +// +//************************************************************************************************* +#define MEMCFG_LSXCLAPGM_CLAPGM_LS0 0x1U // Selects LS0 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS1 0x2U // Selects LS1 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS2 0x4U // Selects LS2 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS3 0x8U // Selects LS3 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS4 0x10U // Selects LS4 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS5 0x20U // Selects LS5 RAM as program vs data memory for CLA + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS0 0x1U // Fetch Protection For LS0 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS0 0x2U // CPU WR Protection For LS0 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS1 0x100U // Fetch Protection For LS1 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS1 0x200U // CPU WR Protection For LS1 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS2 0x10000U // Fetch Protection For LS2 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS2 0x20000U // CPU WR Protection For LS2 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS3 0x1000000U // Fetch Protection For LS3 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS3 0x2000000U // CPU WR Protection For LS3 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxACCPROT1 register +// +//************************************************************************************************* +#define MEMCFG_LSXACCPROT1_FETCHPROT_LS4 0x1U // Fetch Protection For LS4 RAM +#define MEMCFG_LSXACCPROT1_CPUWRPROT_LS4 0x2U // CPU WR Protection For LS4 RAM +#define MEMCFG_LSXACCPROT1_FETCHPROT_LS5 0x100U // Fetch Protection For LS5 RAM +#define MEMCFG_LSXACCPROT1_CPUWRPROT_LS5 0x200U // CPU WR Protection For LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxTEST register +// +//************************************************************************************************* +#define MEMCFG_LSXTEST_TEST_LS0_S 0U +#define MEMCFG_LSXTEST_TEST_LS0_M 0x3U // Selects the different modes for LS0 RAM +#define MEMCFG_LSXTEST_TEST_LS1_S 2U +#define MEMCFG_LSXTEST_TEST_LS1_M 0xCU // Selects the different modes for LS1 RAM +#define MEMCFG_LSXTEST_TEST_LS2_S 4U +#define MEMCFG_LSXTEST_TEST_LS2_M 0x30U // Selects the different modes for LS2 RAM +#define MEMCFG_LSXTEST_TEST_LS3_S 6U +#define MEMCFG_LSXTEST_TEST_LS3_M 0xC0U // Selects the different modes for LS3 RAM +#define MEMCFG_LSXTEST_TEST_LS4_S 8U +#define MEMCFG_LSXTEST_TEST_LS4_M 0x300U // Selects the different modes for LS4 RAM +#define MEMCFG_LSXTEST_TEST_LS5_S 10U +#define MEMCFG_LSXTEST_TEST_LS5_M 0xC00U // Selects the different modes for LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxINIT register +// +//************************************************************************************************* +#define MEMCFG_LSXINIT_INIT_LS0 0x1U // RAM Initialization control for LS0 RAM. +#define MEMCFG_LSXINIT_INIT_LS1 0x2U // RAM Initialization control for LS1 RAM. +#define MEMCFG_LSXINIT_INIT_LS2 0x4U // RAM Initialization control for LS2 RAM. +#define MEMCFG_LSXINIT_INIT_LS3 0x8U // RAM Initialization control for LS3 RAM. +#define MEMCFG_LSXINIT_INIT_LS4 0x10U // RAM Initialization control for LS4 RAM. +#define MEMCFG_LSXINIT_INIT_LS5 0x20U // RAM Initialization control for LS5 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_LSXINITDONE_INITDONE_LS0 0x1U // RAM Initialization status for LS0 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS1 0x2U // RAM Initialization status for LS1 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS2 0x4U // RAM Initialization status for LS2 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS3 0x8U // RAM Initialization status for LS3 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS4 0x10U // RAM Initialization status for LS4 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS5 0x20U // RAM Initialization status for LS5 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxLOCK register +// +//************************************************************************************************* +#define MEMCFG_GSXLOCK_LOCK_GS0 0x1U // GS0 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS1 0x2U // GS1 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS2 0x4U // GS2 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS3 0x8U // GS3 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS4 0x10U // GS4 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS5 0x20U // GS5 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS6 0x40U // GS6 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS7 0x80U // GS7 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS8 0x100U // GS8 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS9 0x200U // GS9 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS10 0x400U // GS10 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS11 0x800U // GS11 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS12 0x1000U // GS12 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS13 0x2000U // GS13 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS14 0x4000U // GS14 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS15 0x8000U // GS15 RAM access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_GSXCOMMIT_COMMIT_GS0 0x1U // GS0 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS1 0x2U // GS1 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS2 0x4U // GS2 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS3 0x8U // GS3 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS4 0x10U // GS4 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS5 0x20U // GS5 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS6 0x40U // GS6 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS7 0x80U // GS7 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS8 0x100U // GS8 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS9 0x200U // GS9 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS10 0x400U // GS10 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS11 0x800U // GS11 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS12 0x1000U // GS12 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS13 0x2000U // GS13 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS14 0x4000U // GS14 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS15 0x8000U // GS15 RAM access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxMSEL register +// +//************************************************************************************************* +#define MEMCFG_GSXMSEL_MSEL_GS0 0x1U // Master Select for GS0 RAM +#define MEMCFG_GSXMSEL_MSEL_GS1 0x2U // Master Select for GS1 RAM +#define MEMCFG_GSXMSEL_MSEL_GS2 0x4U // Master Select for GS2 RAM +#define MEMCFG_GSXMSEL_MSEL_GS3 0x8U // Master Select for GS3 RAM +#define MEMCFG_GSXMSEL_MSEL_GS4 0x10U // Master Select for GS4 RAM +#define MEMCFG_GSXMSEL_MSEL_GS5 0x20U // Master Select for GS5 RAM +#define MEMCFG_GSXMSEL_MSEL_GS6 0x40U // Master Select for GS6 RAM +#define MEMCFG_GSXMSEL_MSEL_GS7 0x80U // Master Select for GS7 RAM +#define MEMCFG_GSXMSEL_MSEL_GS8 0x100U // Master Select for GS8 RAM +#define MEMCFG_GSXMSEL_MSEL_GS9 0x200U // Master Select for GS9 RAM +#define MEMCFG_GSXMSEL_MSEL_GS10 0x400U // Master Select for GS10 RAM +#define MEMCFG_GSXMSEL_MSEL_GS11 0x800U // Master Select for GS11 RAM +#define MEMCFG_GSXMSEL_MSEL_GS12 0x1000U // Master Select for GS12 RAM +#define MEMCFG_GSXMSEL_MSEL_GS13 0x2000U // Master Select for GS13 RAM +#define MEMCFG_GSXMSEL_MSEL_GS14 0x4000U // Master Select for GS14 RAM +#define MEMCFG_GSXMSEL_MSEL_GS15 0x8000U // Master Select for GS15 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS0 0x1U // Fetch Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS0 0x2U // CPU WR Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS0 0x4U // DMA WR Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS1 0x100U // Fetch Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS1 0x200U // CPU WR Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS1 0x400U // DMA WR Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS2 0x10000U // Fetch Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS2 0x20000U // CPU WR Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS2 0x40000U // DMA WR Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS3 0x1000000U // Fetch Protection For GS3 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS3 0x2000000U // CPU WR Protection For GS3 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS3 0x4000000U // DMA WR Protection For GS3 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT1 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS4 0x1U // Fetch Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS4 0x2U // CPU WR Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS4 0x4U // DMA WR Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS5 0x100U // Fetch Protection For GS5 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS5 0x200U // CPU WR Protection For GS5 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS5 0x400U // DMA WR Protection For GS5RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS6 0x10000U // Fetch Protection For GS6 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS6 0x20000U // CPU WR Protection For GS6 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS6 0x40000U // DMA WR Protection For GS6RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS7 0x1000000U // Fetch Protection For GS7 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS7 0x2000000U // CPU WR Protection For GS7 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS7 0x4000000U // DMA WR Protection For GS7RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT2 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS8 0x1U // Fetch Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS8 0x2U // CPU WR Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS8 0x4U // DMA WR Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS9 0x100U // Fetch Protection For GS9 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS9 0x200U // CPU WR Protection For GS9 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS9 0x400U // DMA WR Protection For GS9RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS10 0x10000U // Fetch Protection For GS10 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS10 0x20000U // CPU WR Protection For GS10 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS10 0x40000U // DMA WR Protection For GS10RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS11 0x1000000U // Fetch Protection For GS11 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS11 0x2000000U // CPU WR Protection For GS11 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS11 0x4000000U // DMA WR Protection For GS11RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT3 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS12 0x1U // Fetch Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS12 0x2U // CPU WR Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS12 0x4U // DMA WR Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS13 0x100U // Fetch Protection For GS13 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS13 0x200U // CPU WR Protection For GS13 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS13 0x400U // DMA WR Protection For GS13RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS14 0x10000U // Fetch Protection For GS14 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS14 0x20000U // CPU WR Protection For GS14 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS14 0x40000U // DMA WR Protection For GS14RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS15 0x1000000U // Fetch Protection For GS15 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS15 0x2000000U // CPU WR Protection For GS15 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS15 0x4000000U // DMA WR Protection For GS15RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxTEST register +// +//************************************************************************************************* +#define MEMCFG_GSXTEST_TEST_GS0_S 0U +#define MEMCFG_GSXTEST_TEST_GS0_M 0x3U // Selects the different modes for GS0 RAM +#define MEMCFG_GSXTEST_TEST_GS1_S 2U +#define MEMCFG_GSXTEST_TEST_GS1_M 0xCU // Selects the different modes for GS1 RAM +#define MEMCFG_GSXTEST_TEST_GS2_S 4U +#define MEMCFG_GSXTEST_TEST_GS2_M 0x30U // Selects the different modes for GS2 RAM +#define MEMCFG_GSXTEST_TEST_GS3_S 6U +#define MEMCFG_GSXTEST_TEST_GS3_M 0xC0U // Selects the different modes for GS3 RAM +#define MEMCFG_GSXTEST_TEST_GS4_S 8U +#define MEMCFG_GSXTEST_TEST_GS4_M 0x300U // Selects the different modes for GS4 RAM +#define MEMCFG_GSXTEST_TEST_GS5_S 10U +#define MEMCFG_GSXTEST_TEST_GS5_M 0xC00U // Selects the different modes for GS5 RAM +#define MEMCFG_GSXTEST_TEST_GS6_S 12U +#define MEMCFG_GSXTEST_TEST_GS6_M 0x3000U // Selects the different modes for GS6 RAM +#define MEMCFG_GSXTEST_TEST_GS7_S 14U +#define MEMCFG_GSXTEST_TEST_GS7_M 0xC000U // Selects the different modes for GS7 RAM +#define MEMCFG_GSXTEST_TEST_GS8_S 16U +#define MEMCFG_GSXTEST_TEST_GS8_M 0x30000U // Selects the different modes for GS8 RAM +#define MEMCFG_GSXTEST_TEST_GS9_S 18U +#define MEMCFG_GSXTEST_TEST_GS9_M 0xC0000U // Selects the different modes for GS9 RAM +#define MEMCFG_GSXTEST_TEST_GS10_S 20U +#define MEMCFG_GSXTEST_TEST_GS10_M 0x300000U // Selects the different modes for GS10 RAM +#define MEMCFG_GSXTEST_TEST_GS11_S 22U +#define MEMCFG_GSXTEST_TEST_GS11_M 0xC00000U // Selects the different modes for GS11 RAM +#define MEMCFG_GSXTEST_TEST_GS12_S 24U +#define MEMCFG_GSXTEST_TEST_GS12_M 0x3000000U // Selects the different modes for GS12 RAM +#define MEMCFG_GSXTEST_TEST_GS13_S 26U +#define MEMCFG_GSXTEST_TEST_GS13_M 0xC000000U // Selects the different modes for GS13 RAM +#define MEMCFG_GSXTEST_TEST_GS14_S 28U +#define MEMCFG_GSXTEST_TEST_GS14_M 0x30000000U // Selects the different modes for GS14 RAM +#define MEMCFG_GSXTEST_TEST_GS15_S 30U +#define MEMCFG_GSXTEST_TEST_GS15_M 0xC0000000U // Selects the different modes for GS15 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxINIT register +// +//************************************************************************************************* +#define MEMCFG_GSXINIT_INIT_GS0 0x1U // RAM Initialization control for GS0 RAM. +#define MEMCFG_GSXINIT_INIT_GS1 0x2U // RAM Initialization control for GS1 RAM. +#define MEMCFG_GSXINIT_INIT_GS2 0x4U // RAM Initialization control for GS2 RAM. +#define MEMCFG_GSXINIT_INIT_GS3 0x8U // RAM Initialization control for GS3 RAM. +#define MEMCFG_GSXINIT_INIT_GS4 0x10U // RAM Initialization control for GS4 RAM. +#define MEMCFG_GSXINIT_INIT_GS5 0x20U // RAM Initialization control for GS5 RAM. +#define MEMCFG_GSXINIT_INIT_GS6 0x40U // RAM Initialization control for GS6 RAM. +#define MEMCFG_GSXINIT_INIT_GS7 0x80U // RAM Initialization control for GS7 RAM. +#define MEMCFG_GSXINIT_INIT_GS8 0x100U // RAM Initialization control for GS8 RAM. +#define MEMCFG_GSXINIT_INIT_GS9 0x200U // RAM Initialization control for GS9 RAM. +#define MEMCFG_GSXINIT_INIT_GS10 0x400U // RAM Initialization control for GS10 RAM. +#define MEMCFG_GSXINIT_INIT_GS11 0x800U // RAM Initialization control for GS11 RAM. +#define MEMCFG_GSXINIT_INIT_GS12 0x1000U // RAM Initialization control for GS12 RAM. +#define MEMCFG_GSXINIT_INIT_GS13 0x2000U // RAM Initialization control for GS13 RAM. +#define MEMCFG_GSXINIT_INIT_GS14 0x4000U // RAM Initialization control for GS14 RAM. +#define MEMCFG_GSXINIT_INIT_GS15 0x8000U // RAM Initialization control for GS15 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_GSXINITDONE_INITDONE_GS0 0x1U // RAM Initialization status for GS0 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS1 0x2U // RAM Initialization status for GS1 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS2 0x4U // RAM Initialization status for GS2 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS3 0x8U // RAM Initialization status for GS3 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS4 0x10U // RAM Initialization status for GS4 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS5 0x20U // RAM Initialization status for GS5 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS6 0x40U // RAM Initialization status for GS6 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS7 0x80U // RAM Initialization status for GS7 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS8 0x100U // RAM Initialization status for GS8 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS9 0x200U // RAM Initialization status for GS9 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS10 0x400U // RAM Initialization status for GS10 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS11 0x800U // RAM Initialization status for GS11 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS12 0x1000U // RAM Initialization status for GS12 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS13 0x2000U // RAM Initialization status for GS13 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS14 0x4000U // RAM Initialization status for GS14 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS15 0x8000U // RAM Initialization status for GS15 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxTEST register +// +//************************************************************************************************* +#define MEMCFG_MSGXTEST_TEST_CPUTOCPU_S 0U +#define MEMCFG_MSGXTEST_TEST_CPUTOCPU_M 0x3U // CPU to CPU Mode Select +#define MEMCFG_MSGXTEST_TEST_CPUTOCLA1_S 2U +#define MEMCFG_MSGXTEST_TEST_CPUTOCLA1_M 0xCU // CPU to CLA1 MSG RAM Mode Select +#define MEMCFG_MSGXTEST_TEST_CLA1TOCPU_S 4U +#define MEMCFG_MSGXTEST_TEST_CLA1TOCPU_M 0x30U // CLA1 to CPU MSG RAM Mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxINIT register +// +//************************************************************************************************* +#define MEMCFG_MSGXINIT_INIT_CPUTOCPU 0x1U // Initialization control for CPU to CPU MSG RAM +#define MEMCFG_MSGXINIT_INIT_CPUTOCLA1 0x2U // Initialization control for CPUTOCLA1 MSG RAM +#define MEMCFG_MSGXINIT_INIT_CLA1TOCPU 0x4U // Initialization control for CLA1TOCPU MSG RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_MSGXINITDONE_INITDONE_CPUTOCPU 0x1U // Initialization status for CPU to CPU MSG + // RAM +#define MEMCFG_MSGXINITDONE_INITDONE_CPUTOCLA1 0x2U // Initialization status for CPU to CLA1 + // MSG RAM +#define MEMCFG_MSGXINITDONE_INITDONE_CLA1TOCPU 0x4U // Initialization status for CLA1 to CPU + // MSG RAM + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1LOCK register +// +//************************************************************************************************* +#define MEMCFG_EMIF1LOCK_LOCK_EMIF1 0x1U // EMIF1 access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1COMMIT register +// +//************************************************************************************************* +#define MEMCFG_EMIF1COMMIT_COMMIT_EMIF1 0x1U // EMIF1 access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1MSEL register +// +//************************************************************************************************* +#define MEMCFG_EMIF1MSEL_MSEL_EMIF1_S 0U +#define MEMCFG_EMIF1MSEL_MSEL_EMIF1_M 0x3U // Master Select for EMIF1. +#define MEMCFG_EMIF1MSEL_KEY_S 4U +#define MEMCFG_EMIF1MSEL_KEY_M 0xFFFFFFF0U // KEY to enable the write into MSEL_EMIF1 + // bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1ACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 0x1U // Fetch Protection For EMIF1 +#define MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 0x2U // CPU WR Protection For EMIF1 +#define MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1 0x4U // DMA WR Protection For EMIF1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2LOCK register +// +//************************************************************************************************* +#define MEMCFG_EMIF2LOCK_LOCK_EMIF2 0x1U // EMIF2 access protection and master select permanent + // lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2COMMIT register +// +//************************************************************************************************* +#define MEMCFG_EMIF2COMMIT_COMMIT_EMIF2 0x1U // EMIF2 access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2ACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_EMIF2ACCPROT0_FETCHPROT_EMIF2 0x1U // Fetch Protection For EMIF2 +#define MEMCFG_EMIF2ACCPROT0_CPUWRPROT_EMIF2 0x2U // CPU WR Protection For EMIF2 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVFLG register +// +//************************************************************************************************* +#define MEMCFG_NMAVFLG_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag +#define MEMCFG_NMAVFLG_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag +#define MEMCFG_NMAVFLG_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag +#define MEMCFG_NMAVFLG_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVSET register +// +//************************************************************************************************* +#define MEMCFG_NMAVSET_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag Set +#define MEMCFG_NMAVSET_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag Set +#define MEMCFG_NMAVSET_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVCLR register +// +//************************************************************************************************* +#define MEMCFG_NMAVCLR_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag Clear +#define MEMCFG_NMAVCLR_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVINTEN register +// +//************************************************************************************************* +#define MEMCFG_NMAVINTEN_CPUREAD 0x1U // Non Master CPU Read Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CPUWRITE 0x2U // Non Master CPU Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_DMAWRITE 0x8U // Non Master DMA Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Interrupt + // Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVFLG register +// +//************************************************************************************************* +#define MEMCFG_MAVFLG_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag +#define MEMCFG_MAVFLG_CPUWRITE 0x2U // Master CPU Write Access Violation Flag +#define MEMCFG_MAVFLG_DMAWRITE 0x4U // Master DMA Write Access Violation Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVSET register +// +//************************************************************************************************* +#define MEMCFG_MAVSET_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag Set +#define MEMCFG_MAVSET_CPUWRITE 0x2U // Master CPU Write Access Violation Flag Set +#define MEMCFG_MAVSET_DMAWRITE 0x4U // Master DMA Write Access Violation Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVCLR register +// +//************************************************************************************************* +#define MEMCFG_MAVCLR_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag Clear +#define MEMCFG_MAVCLR_CPUWRITE 0x2U // Master CPU Write Access Violation Flag Clear +#define MEMCFG_MAVCLR_DMAWRITE 0x4U // Master DMA Write Access Violation Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVINTEN register +// +//************************************************************************************************* +#define MEMCFG_MAVINTEN_CPUFETCH 0x1U // Master CPU Fetch Access Violation Interrupt Enable +#define MEMCFG_MAVINTEN_CPUWRITE 0x2U // Master CPU Write Access Violation Interrupt Enable +#define MEMCFG_MAVINTEN_DMAWRITE 0x4U // Master DMA Write Access Violation Interrupt Enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRFLG register +// +//************************************************************************************************* +#define MEMCFG_UCERRFLG_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag +#define MEMCFG_UCERRFLG_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag +#define MEMCFG_UCERRFLG_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRSET register +// +//************************************************************************************************* +#define MEMCFG_UCERRSET_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag Set +#define MEMCFG_UCERRSET_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag Set +#define MEMCFG_UCERRSET_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRCLR register +// +//************************************************************************************************* +#define MEMCFG_UCERRCLR_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag Clear +#define MEMCFG_UCERRCLR_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag Clear +#define MEMCFG_UCERRCLR_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRFLG register +// +//************************************************************************************************* +#define MEMCFG_CERRFLG_CPURDERR 0x1U // CPU Correctable Read Error Flag +#define MEMCFG_CERRFLG_DMARDERR 0x2U // DMA Correctable Read Error Flag +#define MEMCFG_CERRFLG_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRSET register +// +//************************************************************************************************* +#define MEMCFG_CERRSET_CPURDERR 0x1U // CPU Correctable Read Error Flag Set +#define MEMCFG_CERRSET_DMARDERR 0x2U // DMA Correctable Read Error Flag Set +#define MEMCFG_CERRSET_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRCLR register +// +//************************************************************************************************* +#define MEMCFG_CERRCLR_CPURDERR 0x1U // CPU Correctable Read Error Flag Clear +#define MEMCFG_CERRCLR_DMARDERR 0x2U // DMA Correctable Read Error Flag Clear +#define MEMCFG_CERRCLR_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTFLG register +// +//************************************************************************************************* +#define MEMCFG_CEINTFLG_CEINTFLAG 0x1U // Total corrected error count exceeded threshold flag. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTCLR register +// +//************************************************************************************************* +#define MEMCFG_CEINTCLR_CEINTCLR 0x1U // CPU Corrected Error Threshold Exceeded Error Clear. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTSET register +// +//************************************************************************************************* +#define MEMCFG_CEINTSET_CEINTSET 0x1U // Total corrected error count exceeded flag set. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTEN register +// +//************************************************************************************************* +#define MEMCFG_CEINTEN_CEINTEN 0x1U // CPU/DMA Correctable Error Interrupt Enable. + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ROMWAITSTATE register +// +//************************************************************************************************* +#define MEMCFG_ROMWAITSTATE_WSDISABLE 0x1U // C28x ROM Wait State Enable/Disable Control + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ROMPREFETCH register +// +//************************************************************************************************* +#define MEMCFG_ROMPREFETCH_PFENABLE 0x1U // ROM Prefetch Enable/Disable Control + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_memmap.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_memmap.h new file mode 100644 index 0000000..ba0b5e5 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_memmap.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_memmap.h +// +// TITLE: Macros defining the memory map of the C28x. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MEMMAP_H +#define HW_MEMMAP_H + +//***************************************************************************** +// +// The following are defines for the base address of the memories and +// peripherals. +// +//***************************************************************************** +#define M0_RAM_BASE 0x00000000U +#define M1_RAM_BASE 0x00000400U +#define ADCARESULT_BASE 0x00000B00U +#define ADCBRESULT_BASE 0x00000B20U +#define ADCCRESULT_BASE 0x00000B40U +#define ADCDRESULT_BASE 0x00000B60U +#define CPUTIMER0_BASE 0x00000C00U +#define CPUTIMER1_BASE 0x00000C08U +#define CPUTIMER2_BASE 0x00000C10U +#define CLA1_SOFTINT_BASE 0x00000CE0U +#define PIECTRL_BASE 0x00000CE0U +#define PIEVECTTABLE_BASE 0x00000D00U +#define DMA_BASE 0x00001000U +#define DMA_CH1_BASE 0x00001020U +#define DMA_CH2_BASE 0x00001040U +#define DMA_CH3_BASE 0x00001060U +#define DMA_CH4_BASE 0x00001080U +#define DMA_CH5_BASE 0x000010A0U +#define DMA_CH6_BASE 0x000010C0U +#define CLA1_BASE 0x00001400U +#define CLATOCPU_RAM_BASE 0x00001480U +#define CPUTOCLA_RAM_BASE 0x00001500U +#define CLB1_BASE 0x00003000U +#define CLB1_LOGICCFG_BASE 0x00003000U +#define CLB1_LOGICCTL_BASE 0x00003100U +#define CLB1_DATAEXCH_BASE 0x00003200U +#define CLB2_BASE 0x00003400U +#define CLB2_LOGICCFG_BASE 0x00003400U +#define CLB2_LOGICCTL_BASE 0x00003500U +#define CLB2_DATAEXCH_BASE 0x00003600U +#define CLB3_BASE 0x00003800U +#define CLB3_LOGICCFG_BASE 0x00003800U +#define CLB3_LOGICCTL_BASE 0x00003900U +#define CLB3_DATAEXCH_BASE 0x00003A00U +#define CLB4_BASE 0x00003C00U +#define CLB4_LOGICCFG_BASE 0x00003C00U +#define CLB4_LOGICCTL_BASE 0x00003D00U +#define CLB4_DATAEXCH_BASE 0x00003E00U +#define EPWM1_BASE 0x00004000U +#define EPWM2_BASE 0x00004100U +#define EPWM3_BASE 0x00004200U +#define EPWM4_BASE 0x00004300U +#define EPWM5_BASE 0x00004400U +#define EPWM6_BASE 0x00004500U +#define EPWM7_BASE 0x00004600U +#define EPWM8_BASE 0x00004700U +#define EPWM9_BASE 0x00004800U +#define EPWM10_BASE 0x00004900U +#define EPWM11_BASE 0x00004A00U +#define EPWM12_BASE 0x00004B00U +#define ECAP1_BASE 0x00005000U +#define ECAP2_BASE 0x00005020U +#define ECAP3_BASE 0x00005040U +#define ECAP4_BASE 0x00005060U +#define ECAP5_BASE 0x00005080U +#define ECAP6_BASE 0x000050A0U +#define EQEP1_BASE 0x00005100U +#define EQEP2_BASE 0x00005140U +#define EQEP3_BASE 0x00005180U +#define DACA_BASE 0x00005C00U +#define DACB_BASE 0x00005C10U +#define DACC_BASE 0x00005C20U +#define CMPSS1_BASE 0x00005C80U +#define CMPSS2_BASE 0x00005CA0U +#define CMPSS3_BASE 0x00005CC0U +#define CMPSS4_BASE 0x00005CE0U +#define CMPSS5_BASE 0x00005D00U +#define CMPSS6_BASE 0x00005D20U +#define CMPSS7_BASE 0x00005D40U +#define CMPSS8_BASE 0x00005D60U +#define SDFM1_BASE 0x00005E00U +#define SDFM2_BASE 0x00005E80U +#define MCBSPA_BASE 0x00006000U +#define MCBSPB_BASE 0x00006040U +#define SPIA_BASE 0x00006100U +#define SPIB_BASE 0x00006110U +#define SPIC_BASE 0x00006120U +#define UPP_BASE 0x00006200U +#define UPP_TX_MSG_RAM_BASE 0x00006C00U +#define UPP_RX_MSG_RAM_BASE 0x00006E00U +#define WD_BASE 0x00007000U +#define NMI_BASE 0x00007060U +#define XINT_BASE 0x00007070U +#define SCIA_BASE 0x00007200U +#define SCIB_BASE 0x00007210U +#define SCIC_BASE 0x00007220U +#define SCID_BASE 0x00007230U +#define I2CA_BASE 0x00007300U +#define I2CB_BASE 0x00007340U +#define ADCA_BASE 0x00007400U +#define ADCB_BASE 0x00007480U +#define ADCC_BASE 0x00007500U +#define ADCD_BASE 0x00007580U +#define INPUTXBAR_BASE 0x00007900U +#define XBAR_BASE 0x00007920U +#define SYNCSOC_BASE 0x00007940U +#define DMACLASRCSEL_BASE 0x00007980U +#define EPWMXBAR_BASE 0x00007A00U +#define CLBXBAR_BASE 0x00007A40U +#define OUTPUTXBAR_BASE 0x00007A80U +#define GPIOCTRL_BASE 0x00007C00U +#define GPIODATA_BASE 0x00007F00U +#define LS0_RAM_BASE 0x00008000U +#define LS1_RAM_BASE 0x00008800U +#define LS2_RAM_BASE 0x00009000U +#define LS3_RAM_BASE 0x00009800U +#define LS4_RAM_BASE 0x0000A000U +#define LS5_RAM_BASE 0x0000A800U +#define D0_RAM_BASE 0x0000B000U +#define D1_RAM_BASE 0x0000B800U +#define GS0_RAM_BASE 0x0000C000U +#define GS1_RAM_BASE 0x0000D000U +#define GS2_RAM_BASE 0x0000E000U +#define GS3_RAM_BASE 0x0000F000U +#define GS4_RAM_BASE 0x00010000U +#define GS5_RAM_BASE 0x00011000U +#define GS6_RAM_BASE 0x00012000U +#define GS7_RAM_BASE 0x00013000U +#define GS8_RAM_BASE 0x00014000U +#define GS9_RAM_BASE 0x00015000U +#define GS10_RAM_BASE 0x00016000U +#define GS11_RAM_BASE 0x00017000U +#define GS12_RAM_BASE 0x00018000U +#define GS13_RAM_BASE 0x00019000U +#define GS14_RAM_BASE 0x0001A000U +#define GS15_RAM_BASE 0x0001B000U +#define CPU2_TO_CPU1_MSG_RAM_BASE 0x0003F800U +#define CPU1_TO_CPU2_MSG_RAM_BASE 0x0003FC00U +#define USBA_BASE 0x00040000U +#define EMIF1_BASE 0x00047000U +#define EMIF2_BASE 0x00047800U +#define CANA_BASE 0x00048000U +#define CANA_MSG_RAM_BASE 0x00049000U +#define CANB_BASE 0x0004A000U +#define CANB_MSG_RAM_BASE 0x0004B000U +#define IPC_BASE 0x00050000U +#define FLASHPUMPSEMAPHORE_BASE 0x00050024U +#define DEVCFG_BASE 0x0005D000U +#define ANALOGSUBSYS_BASE 0x0005D180U +#define CLKCFG_BASE 0x0005D200U +#define CPUSYS_BASE 0x0005D300U +#define ROMPREFETCH_BASE 0x0005E608U +#define DCSM_Z1_BASE 0x0005F000U +#define DCSM_Z2_BASE 0x0005F040U +#define DCSMCOMMON_BASE 0x0005F070U +#define MEMCFG_BASE 0x0005F400U +#define EMIF1CONFIG_BASE 0x0005F480U +#define EMIF2CONFIG_BASE 0x0005F4A0U +#define ACCESSPROTECTION_BASE 0x0005F4C0U +#define MEMORYERROR_BASE 0x0005F500U +#define ROMWAITSTATE_BASE 0x0005F540U +#define FLASH0CTRL_BASE 0x0005F800U +#define FLASH0ECC_BASE 0x0005FB00U +#define DCSM_Z1OTP_BASE 0x00078000U +#define DCSM_Z2OTP_BASE 0x00078200U +#define UID_BASE 0x000703C0U +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_nmi.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_nmi.h new file mode 100644 index 0000000..efd8157 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_nmi.h @@ -0,0 +1,134 @@ +//########################################################################### +// +// FILE: hw_nmi.h +// +// TITLE: Definitions for the NMI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_NMI_H +#define HW_NMI_H + +//************************************************************************************************* +// +// The following are defines for the NMI register offsets +// +//************************************************************************************************* +#define NMI_O_CFG 0x0U // NMI Configuration Register +#define NMI_O_FLG 0x1U // NMI Flag Register (XRSn Clear) +#define NMI_O_FLGCLR 0x2U // NMI Flag Clear Register +#define NMI_O_FLGFRC 0x3U // NMI Flag Force Register +#define NMI_O_WDCNT 0x4U // NMI Watchdog Counter Register +#define NMI_O_WDPRD 0x5U // NMI Watchdog Period Register +#define NMI_O_SHDFLG 0x6U // NMI Shadow Flag Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMICFG register +// +//************************************************************************************************* +#define NMI_CFG_NMIE 0x1U // Global NMI Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLG register +// +//************************************************************************************************* +#define NMI_FLG_NMIINT 0x1U // NMI Interrupt Flag +#define NMI_FLG_CLOCKFAIL 0x2U // Clock Fail Interrupt Flag +#define NMI_FLG_RAMUNCERR 0x4U // RAM Uncorrectable Error NMI Flag +#define NMI_FLG_FLUNCERR 0x8U // Flash Uncorrectable Error NMI Flag +#define NMI_FLG_CPU1HWBISTERR 0x10U // HW BIST Error NMI Flag +#define NMI_FLG_CPU2HWBISTERR 0x20U // HW BIST Error NMI Flag +#define NMI_FLG_PIEVECTERR 0x40U // PIE Vector Fetch Error Flag +#define NMI_FLG_CLBNMI 0x100U // Configurable Logic Block NMI Flag +#define NMI_FLG_CPU2WDRSN 0x200U // CPU2 WDRSn Reset Indication Flag +#define NMI_FLG_CPU2NMIWDRSN 0x400U // CPU2 NMIWDRSn Reset Indication Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLGCLR register +// +//************************************************************************************************* +#define NMI_FLGCLR_NMIINT 0x1U // NMIINT Flag Clear +#define NMI_FLGCLR_CLOCKFAIL 0x2U // CLOCKFAIL Flag Clear +#define NMI_FLGCLR_RAMUNCERR 0x4U // RAMUNCERR Flag Clear +#define NMI_FLGCLR_FLUNCERR 0x8U // FLUNCERR Flag Clear +#define NMI_FLGCLR_CPU1HWBISTERR 0x10U // CPU1HWBISTERR Flag Clear +#define NMI_FLGCLR_CPU2HWBISTERR 0x20U // CPU2HWBISTERR Flag Clear +#define NMI_FLGCLR_PIEVECTERR 0x40U // PIEVECTERR Flag Clear +#define NMI_FLGCLR_CLBNMI 0x100U // CLBNMI Flag Clear +#define NMI_FLGCLR_CPU2WDRSN 0x200U // CPU2WDRSn Flag Clear +#define NMI_FLGCLR_CPU2NMIWDRSN 0x400U // CPU2NMIWDRSn Flag Clear +#define NMI_FLGCLR_OVF 0x800U // OVF Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLGFRC register +// +//************************************************************************************************* +#define NMI_FLGFRC_CLOCKFAIL 0x2U // CLOCKFAIL Flag Force +#define NMI_FLGFRC_RAMUNCERR 0x4U // RAMUNCERR Flag Force +#define NMI_FLGFRC_FLUNCERR 0x8U // FLUNCERR Flag Force +#define NMI_FLGFRC_CPU1HWBISTERR 0x10U // CPU1HWBISTERR Flag Force +#define NMI_FLGFRC_CPU2HWBISTERR 0x20U // CPU2HWBISTERR Flag Force +#define NMI_FLGFRC_PIEVECTERR 0x40U // PIEVECTERR Flag Force +#define NMI_FLGFRC_CLBNMI 0x100U // CLBNMI Flag Force +#define NMI_FLGFRC_CPU2WDRSN 0x200U // CPU2WDRSn Flag Force +#define NMI_FLGFRC_CPU2NMIWDRSN 0x400U // CPU2NMIWDRSn Flag Force +#define NMI_FLGFRC_OVF 0x800U // OVF Flag Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMISHDFLG register +// +//************************************************************************************************* +#define NMI_SHDFLG_CLOCKFAIL 0x2U // Shadow CLOCKFAIL Flag +#define NMI_SHDFLG_RAMUNCERR 0x4U // Shadow RAMUNCERR Flag +#define NMI_SHDFLG_FLUNCERR 0x8U // Shadow FLUNCERR Flag +#define NMI_SHDFLG_CPU1HWBISTERR 0x10U // Shadow CPU1HWBISTERR Flag +#define NMI_SHDFLG_CPU2HWBISTERR 0x20U // Shadow CPU2HWBISTERR Flag +#define NMI_SHDFLG_PIEVECTERR 0x40U // Shadow PIEVECTERR Flag +#define NMI_SHDFLG_CLBNMI 0x100U // Shadow CLBNMI Flag +#define NMI_SHDFLG_CPU2WDRSN 0x200U // Shadow CPU2WDRSn Flag +#define NMI_SHDFLG_CPU2NMIWDRSN 0x400U // Shadow CPU2NMIWDRSn Flag +#define NMI_SHDFLG_OVF 0x800U // Shadow OVF Flag + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_otp.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_otp.h new file mode 100644 index 0000000..d074499 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_otp.h @@ -0,0 +1,63 @@ +//########################################################################### +// +// FILE: hw_otp.h +// +// TITLE: Definitions for the OTP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_OTP_H +#define HW_OTP_H + +//************************************************************************************************* +// +// The following are defines for the OTP register offsets +// +//************************************************************************************************* +#define OTP_O_UID_PSRAND0 0x0U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND1 0x2U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND2 0x4U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND3 0x6U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND4 0x8U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND5 0xAU // UID Psuedo-random 160 bit number +#define OTP_O_UID_UNIQUE 0xCU // UID UID Unique 32 bit number +#define OTP_O_UID_CHECKSUM 0xEU // UID Checksum + + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_outputxbar.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_outputxbar.h new file mode 100644 index 0000000..30a10e9 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_outputxbar.h @@ -0,0 +1,1340 @@ +//########################################################################### +// +// FILE: hw_outputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_OUTPUTXBAR_H +#define HW_OUTPUTXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_OUTPUT1MUX0TO15CFG 0x0U // Output X-BAR Mux Configuration for Output 1 +#define XBAR_O_OUTPUT1MUX16TO31CFG 0x2U // Output X-BAR Mux Configuration for Output 1 +#define XBAR_O_OUTPUT2MUX0TO15CFG 0x4U // Output X-BAR Mux Configuration for Output 2 +#define XBAR_O_OUTPUT2MUX16TO31CFG 0x6U // Output X-BAR Mux Configuration for Output 2 +#define XBAR_O_OUTPUT3MUX0TO15CFG 0x8U // Output X-BAR Mux Configuration for Output 3 +#define XBAR_O_OUTPUT3MUX16TO31CFG 0xAU // Output X-BAR Mux Configuration for Output 3 +#define XBAR_O_OUTPUT4MUX0TO15CFG 0xCU // Output X-BAR Mux Configuration for Output 4 +#define XBAR_O_OUTPUT4MUX16TO31CFG 0xEU // Output X-BAR Mux Configuration for Output 4 +#define XBAR_O_OUTPUT5MUX0TO15CFG 0x10U // Output X-BAR Mux Configuration for Output 5 +#define XBAR_O_OUTPUT5MUX16TO31CFG 0x12U // Output X-BAR Mux Configuration for Output 5 +#define XBAR_O_OUTPUT6MUX0TO15CFG 0x14U // Output X-BAR Mux Configuration for Output 6 +#define XBAR_O_OUTPUT6MUX16TO31CFG 0x16U // Output X-BAR Mux Configuration for Output 6 +#define XBAR_O_OUTPUT7MUX0TO15CFG 0x18U // Output X-BAR Mux Configuration for Output 7 +#define XBAR_O_OUTPUT7MUX16TO31CFG 0x1AU // Output X-BAR Mux Configuration for Output 7 +#define XBAR_O_OUTPUT8MUX0TO15CFG 0x1CU // Output X-BAR Mux Configuration for Output 8 +#define XBAR_O_OUTPUT8MUX16TO31CFG 0x1EU // Output X-BAR Mux Configuration for Output 8 +#define XBAR_O_OUTPUT1MUXENABLE 0x20U // Output X-BAR Mux Enable for Output 1 +#define XBAR_O_OUTPUT2MUXENABLE 0x22U // Output X-BAR Mux Enable for Output 2 +#define XBAR_O_OUTPUT3MUXENABLE 0x24U // Output X-BAR Mux Enable for Output 3 +#define XBAR_O_OUTPUT4MUXENABLE 0x26U // Output X-BAR Mux Enable for Output 4 +#define XBAR_O_OUTPUT5MUXENABLE 0x28U // Output X-BAR Mux Enable for Output 5 +#define XBAR_O_OUTPUT6MUXENABLE 0x2AU // Output X-BAR Mux Enable for Output 6 +#define XBAR_O_OUTPUT7MUXENABLE 0x2CU // Output X-BAR Mux Enable for Output 7 +#define XBAR_O_OUTPUT8MUXENABLE 0x2EU // Output X-BAR Mux Enable for Output 8 +#define XBAR_O_OUTPUTLATCH 0x30U // Output X-BAR Output Latch +#define XBAR_O_OUTPUTLATCHCLR 0x32U // Output X-BAR Output Latch Clear +#define XBAR_O_OUTPUTLATCHFRC 0x34U // Output X-BAR Output Latch Clear +#define XBAR_O_OUTPUTLATCHENABLE 0x36U // Output X-BAR Output Latch Enable +#define XBAR_O_OUTPUTINV 0x38U // Output X-BAR Output Inversion +#define XBAR_O_OUTPUTLOCK 0x3EU // Output X-BAR Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT1 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT1 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT2 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT2 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT3 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT3 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT4 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT4 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT5 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT5 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT6 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT6 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT7 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT7 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT8 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT8 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT1 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT2 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT3 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT4 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT5 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT6 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT7 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCH register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCH_OUTPUT1 0x1U // Records the OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT2 0x2U // Records the OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT3 0x4U // Records the OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT4 0x8U // Records the OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT5 0x10U // Records the OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT6 0x20U // Records the OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT7 0x40U // Records the OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT8 0x80U // Records the OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHCLR register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHCLR_OUTPUT1 0x1U // Clears the Output-Latch for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT2 0x2U // Clears the Output-Latch for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT3 0x4U // Clears the Output-Latch for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT4 0x8U // Clears the Output-Latch for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT5 0x10U // Clears the Output-Latch for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT6 0x20U // Clears the Output-Latch for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT7 0x40U // Clears the Output-Latch for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT8 0x80U // Clears the Output-Latch for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHFRC register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHFRC_OUTPUT1 0x1U // Sets the Output-Latch for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT2 0x2U // Sets the Output-Latch for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT3 0x4U // Sets the Output-Latch for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT4 0x8U // Sets the Output-Latch for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT5 0x10U // Sets the Output-Latch for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT6 0x20U // Sets the Output-Latch for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT7 0x40U // Sets the Output-Latch for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT8 0x80U // Sets the Output-Latch for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHENABLE_OUTPUT1 0x1U // Selects the output latch to drive OUTPUT1 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT2 0x2U // Selects the output latch to drive OUTPUT2 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT3 0x4U // Selects the output latch to drive OUTPUT3 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT4 0x8U // Selects the output latch to drive OUTPUT4 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT5 0x10U // Selects the output latch to drive OUTPUT5 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT6 0x20U // Selects the output latch to drive OUTPUT6 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT7 0x40U // Selects the output latch to drive OUTPUT7 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT8 0x80U // Selects the output latch to drive OUTPUT8 for + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTINV register +// +//************************************************************************************************* +#define XBAR_OUTPUTINV_OUTPUT1 0x1U // Selects polarity for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT2 0x2U // Selects polarity for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT3 0x4U // Selects polarity for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT4 0x8U // Selects polarity for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT5 0x10U // Selects polarity for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT6 0x20U // Selects polarity for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT7 0x40U // Selects polarity for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT8 0x80U // Selects polarity for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLOCK register +// +//************************************************************************************************* +#define XBAR_OUTPUTLOCK_LOCK 0x1U // Locks the configuration for OUTPUT-XBAR +#define XBAR_OUTPUTLOCK_KEY_S 16U +#define XBAR_OUTPUTLOCK_KEY_M 0xFFFF0000U // Write Protection KEY + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_pie.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_pie.h new file mode 100644 index 0000000..9a4f09f --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_pie.h @@ -0,0 +1,636 @@ +//########################################################################### +// +// FILE: hw_pie.h +// +// TITLE: Definitions for the PIE registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_PIE_H +#define HW_PIE_H + +//************************************************************************************************* +// +// The following are defines for the PIE register offsets +// +//************************************************************************************************* +#define PIE_O_CTRL 0x0U // ePIE Control Register +#define PIE_O_ACK 0x1U // Interrupt Acknowledge Register +#define PIE_O_IER1 0x2U // Interrupt Group 1 Enable Register +#define PIE_O_IFR1 0x3U // Interrupt Group 1 Flag Register +#define PIE_O_IER2 0x4U // Interrupt Group 2 Enable Register +#define PIE_O_IFR2 0x5U // Interrupt Group 2 Flag Register +#define PIE_O_IER3 0x6U // Interrupt Group 3 Enable Register +#define PIE_O_IFR3 0x7U // Interrupt Group 3 Flag Register +#define PIE_O_IER4 0x8U // Interrupt Group 4 Enable Register +#define PIE_O_IFR4 0x9U // Interrupt Group 4 Flag Register +#define PIE_O_IER5 0xAU // Interrupt Group 5 Enable Register +#define PIE_O_IFR5 0xBU // Interrupt Group 5 Flag Register +#define PIE_O_IER6 0xCU // Interrupt Group 6 Enable Register +#define PIE_O_IFR6 0xDU // Interrupt Group 6 Flag Register +#define PIE_O_IER7 0xEU // Interrupt Group 7 Enable Register +#define PIE_O_IFR7 0xFU // Interrupt Group 7 Flag Register +#define PIE_O_IER8 0x10U // Interrupt Group 8 Enable Register +#define PIE_O_IFR8 0x11U // Interrupt Group 8 Flag Register +#define PIE_O_IER9 0x12U // Interrupt Group 9 Enable Register +#define PIE_O_IFR9 0x13U // Interrupt Group 9 Flag Register +#define PIE_O_IER10 0x14U // Interrupt Group 10 Enable Register +#define PIE_O_IFR10 0x15U // Interrupt Group 10 Flag Register +#define PIE_O_IER11 0x16U // Interrupt Group 11 Enable Register +#define PIE_O_IFR11 0x17U // Interrupt Group 11 Flag Register +#define PIE_O_IER12 0x18U // Interrupt Group 12 Enable Register +#define PIE_O_IFR12 0x19U // Interrupt Group 12 Flag Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIECTRL register +// +//************************************************************************************************* +#define PIE_CTRL_ENPIE 0x1U // PIE Enable +#define PIE_CTRL_PIEVECT_S 1U +#define PIE_CTRL_PIEVECT_M 0xFFFEU // PIE Vector Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEACK register +// +//************************************************************************************************* +#define PIE_ACK_ACK1 0x1U // Acknowledge PIE Interrupt Group 1 +#define PIE_ACK_ACK2 0x2U // Acknowledge PIE Interrupt Group 2 +#define PIE_ACK_ACK3 0x4U // Acknowledge PIE Interrupt Group 3 +#define PIE_ACK_ACK4 0x8U // Acknowledge PIE Interrupt Group 4 +#define PIE_ACK_ACK5 0x10U // Acknowledge PIE Interrupt Group 5 +#define PIE_ACK_ACK6 0x20U // Acknowledge PIE Interrupt Group 6 +#define PIE_ACK_ACK7 0x40U // Acknowledge PIE Interrupt Group 7 +#define PIE_ACK_ACK8 0x80U // Acknowledge PIE Interrupt Group 8 +#define PIE_ACK_ACK9 0x100U // Acknowledge PIE Interrupt Group 9 +#define PIE_ACK_ACK10 0x200U // Acknowledge PIE Interrupt Group 10 +#define PIE_ACK_ACK11 0x400U // Acknowledge PIE Interrupt Group 11 +#define PIE_ACK_ACK12 0x800U // Acknowledge PIE Interrupt Group 12 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER1 register +// +//************************************************************************************************* +#define PIE_IER1_INTX1 0x1U // Enable for Interrupt 1.1 +#define PIE_IER1_INTX2 0x2U // Enable for Interrupt 1.2 +#define PIE_IER1_INTX3 0x4U // Enable for Interrupt 1.3 +#define PIE_IER1_INTX4 0x8U // Enable for Interrupt 1.4 +#define PIE_IER1_INTX5 0x10U // Enable for Interrupt 1.5 +#define PIE_IER1_INTX6 0x20U // Enable for Interrupt 1.6 +#define PIE_IER1_INTX7 0x40U // Enable for Interrupt 1.7 +#define PIE_IER1_INTX8 0x80U // Enable for Interrupt 1.8 +#define PIE_IER1_INTX9 0x100U // Enable for Interrupt 1.9 +#define PIE_IER1_INTX10 0x200U // Enable for Interrupt 1.10 +#define PIE_IER1_INTX11 0x400U // Enable for Interrupt 1.11 +#define PIE_IER1_INTX12 0x800U // Enable for Interrupt 1.12 +#define PIE_IER1_INTX13 0x1000U // Enable for Interrupt 1.13 +#define PIE_IER1_INTX14 0x2000U // Enable for Interrupt 1.14 +#define PIE_IER1_INTX15 0x4000U // Enable for Interrupt 1.15 +#define PIE_IER1_INTX16 0x8000U // Enable for Interrupt 1.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR1 register +// +//************************************************************************************************* +#define PIE_IFR1_INTX1 0x1U // Flag for Interrupt 1.1 +#define PIE_IFR1_INTX2 0x2U // Flag for Interrupt 1.2 +#define PIE_IFR1_INTX3 0x4U // Flag for Interrupt 1.3 +#define PIE_IFR1_INTX4 0x8U // Flag for Interrupt 1.4 +#define PIE_IFR1_INTX5 0x10U // Flag for Interrupt 1.5 +#define PIE_IFR1_INTX6 0x20U // Flag for Interrupt 1.6 +#define PIE_IFR1_INTX7 0x40U // Flag for Interrupt 1.7 +#define PIE_IFR1_INTX8 0x80U // Flag for Interrupt 1.8 +#define PIE_IFR1_INTX9 0x100U // Flag for Interrupt 1.9 +#define PIE_IFR1_INTX10 0x200U // Flag for Interrupt 1.10 +#define PIE_IFR1_INTX11 0x400U // Flag for Interrupt 1.11 +#define PIE_IFR1_INTX12 0x800U // Flag for Interrupt 1.12 +#define PIE_IFR1_INTX13 0x1000U // Flag for Interrupt 1.13 +#define PIE_IFR1_INTX14 0x2000U // Flag for Interrupt 1.14 +#define PIE_IFR1_INTX15 0x4000U // Flag for Interrupt 1.15 +#define PIE_IFR1_INTX16 0x8000U // Flag for Interrupt 1.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER2 register +// +//************************************************************************************************* +#define PIE_IER2_INTX1 0x1U // Enable for Interrupt 2.1 +#define PIE_IER2_INTX2 0x2U // Enable for Interrupt 2.2 +#define PIE_IER2_INTX3 0x4U // Enable for Interrupt 2.3 +#define PIE_IER2_INTX4 0x8U // Enable for Interrupt 2.4 +#define PIE_IER2_INTX5 0x10U // Enable for Interrupt 2.5 +#define PIE_IER2_INTX6 0x20U // Enable for Interrupt 2.6 +#define PIE_IER2_INTX7 0x40U // Enable for Interrupt 2.7 +#define PIE_IER2_INTX8 0x80U // Enable for Interrupt 2.8 +#define PIE_IER2_INTX9 0x100U // Enable for Interrupt 2.9 +#define PIE_IER2_INTX10 0x200U // Enable for Interrupt 2.10 +#define PIE_IER2_INTX11 0x400U // Enable for Interrupt 2.11 +#define PIE_IER2_INTX12 0x800U // Enable for Interrupt 2.12 +#define PIE_IER2_INTX13 0x1000U // Enable for Interrupt 2.13 +#define PIE_IER2_INTX14 0x2000U // Enable for Interrupt 2.14 +#define PIE_IER2_INTX15 0x4000U // Enable for Interrupt 2.15 +#define PIE_IER2_INTX16 0x8000U // Enable for Interrupt 2.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR2 register +// +//************************************************************************************************* +#define PIE_IFR2_INTX1 0x1U // Flag for Interrupt 2.1 +#define PIE_IFR2_INTX2 0x2U // Flag for Interrupt 2.2 +#define PIE_IFR2_INTX3 0x4U // Flag for Interrupt 2.3 +#define PIE_IFR2_INTX4 0x8U // Flag for Interrupt 2.4 +#define PIE_IFR2_INTX5 0x10U // Flag for Interrupt 2.5 +#define PIE_IFR2_INTX6 0x20U // Flag for Interrupt 2.6 +#define PIE_IFR2_INTX7 0x40U // Flag for Interrupt 2.7 +#define PIE_IFR2_INTX8 0x80U // Flag for Interrupt 2.8 +#define PIE_IFR2_INTX9 0x100U // Flag for Interrupt 2.9 +#define PIE_IFR2_INTX10 0x200U // Flag for Interrupt 2.10 +#define PIE_IFR2_INTX11 0x400U // Flag for Interrupt 2.11 +#define PIE_IFR2_INTX12 0x800U // Flag for Interrupt 2.12 +#define PIE_IFR2_INTX13 0x1000U // Flag for Interrupt 2.13 +#define PIE_IFR2_INTX14 0x2000U // Flag for Interrupt 2.14 +#define PIE_IFR2_INTX15 0x4000U // Flag for Interrupt 2.15 +#define PIE_IFR2_INTX16 0x8000U // Flag for Interrupt 2.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER3 register +// +//************************************************************************************************* +#define PIE_IER3_INTX1 0x1U // Enable for Interrupt 3.1 +#define PIE_IER3_INTX2 0x2U // Enable for Interrupt 3.2 +#define PIE_IER3_INTX3 0x4U // Enable for Interrupt 3.3 +#define PIE_IER3_INTX4 0x8U // Enable for Interrupt 3.4 +#define PIE_IER3_INTX5 0x10U // Enable for Interrupt 3.5 +#define PIE_IER3_INTX6 0x20U // Enable for Interrupt 3.6 +#define PIE_IER3_INTX7 0x40U // Enable for Interrupt 3.7 +#define PIE_IER3_INTX8 0x80U // Enable for Interrupt 3.8 +#define PIE_IER3_INTX9 0x100U // Enable for Interrupt 3.9 +#define PIE_IER3_INTX10 0x200U // Enable for Interrupt 3.10 +#define PIE_IER3_INTX11 0x400U // Enable for Interrupt 3.11 +#define PIE_IER3_INTX12 0x800U // Enable for Interrupt 3.12 +#define PIE_IER3_INTX13 0x1000U // Enable for Interrupt 3.13 +#define PIE_IER3_INTX14 0x2000U // Enable for Interrupt 3.14 +#define PIE_IER3_INTX15 0x4000U // Enable for Interrupt 3.15 +#define PIE_IER3_INTX16 0x8000U // Enable for Interrupt 3.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR3 register +// +//************************************************************************************************* +#define PIE_IFR3_INTX1 0x1U // Flag for Interrupt 3.1 +#define PIE_IFR3_INTX2 0x2U // Flag for Interrupt 3.2 +#define PIE_IFR3_INTX3 0x4U // Flag for Interrupt 3.3 +#define PIE_IFR3_INTX4 0x8U // Flag for Interrupt 3.4 +#define PIE_IFR3_INTX5 0x10U // Flag for Interrupt 3.5 +#define PIE_IFR3_INTX6 0x20U // Flag for Interrupt 3.6 +#define PIE_IFR3_INTX7 0x40U // Flag for Interrupt 3.7 +#define PIE_IFR3_INTX8 0x80U // Flag for Interrupt 3.8 +#define PIE_IFR3_INTX9 0x100U // Flag for Interrupt 3.9 +#define PIE_IFR3_INTX10 0x200U // Flag for Interrupt 3.10 +#define PIE_IFR3_INTX11 0x400U // Flag for Interrupt 3.11 +#define PIE_IFR3_INTX12 0x800U // Flag for Interrupt 3.12 +#define PIE_IFR3_INTX13 0x1000U // Flag for Interrupt 3.13 +#define PIE_IFR3_INTX14 0x2000U // Flag for Interrupt 3.14 +#define PIE_IFR3_INTX15 0x4000U // Flag for Interrupt 3.15 +#define PIE_IFR3_INTX16 0x8000U // Flag for Interrupt 3.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER4 register +// +//************************************************************************************************* +#define PIE_IER4_INTX1 0x1U // Enable for Interrupt 4.1 +#define PIE_IER4_INTX2 0x2U // Enable for Interrupt 4.2 +#define PIE_IER4_INTX3 0x4U // Enable for Interrupt 4.3 +#define PIE_IER4_INTX4 0x8U // Enable for Interrupt 4.4 +#define PIE_IER4_INTX5 0x10U // Enable for Interrupt 4.5 +#define PIE_IER4_INTX6 0x20U // Enable for Interrupt 4.6 +#define PIE_IER4_INTX7 0x40U // Enable for Interrupt 4.7 +#define PIE_IER4_INTX8 0x80U // Enable for Interrupt 4.8 +#define PIE_IER4_INTX9 0x100U // Enable for Interrupt 4.9 +#define PIE_IER4_INTX10 0x200U // Enable for Interrupt 4.10 +#define PIE_IER4_INTX11 0x400U // Enable for Interrupt 4.11 +#define PIE_IER4_INTX12 0x800U // Enable for Interrupt 4.12 +#define PIE_IER4_INTX13 0x1000U // Enable for Interrupt 4.13 +#define PIE_IER4_INTX14 0x2000U // Enable for Interrupt 4.14 +#define PIE_IER4_INTX15 0x4000U // Enable for Interrupt 4.15 +#define PIE_IER4_INTX16 0x8000U // Enable for Interrupt 4.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR4 register +// +//************************************************************************************************* +#define PIE_IFR4_INTX1 0x1U // Flag for Interrupt 4.1 +#define PIE_IFR4_INTX2 0x2U // Flag for Interrupt 4.2 +#define PIE_IFR4_INTX3 0x4U // Flag for Interrupt 4.3 +#define PIE_IFR4_INTX4 0x8U // Flag for Interrupt 4.4 +#define PIE_IFR4_INTX5 0x10U // Flag for Interrupt 4.5 +#define PIE_IFR4_INTX6 0x20U // Flag for Interrupt 4.6 +#define PIE_IFR4_INTX7 0x40U // Flag for Interrupt 4.7 +#define PIE_IFR4_INTX8 0x80U // Flag for Interrupt 4.8 +#define PIE_IFR4_INTX9 0x100U // Flag for Interrupt 4.9 +#define PIE_IFR4_INTX10 0x200U // Flag for Interrupt 4.10 +#define PIE_IFR4_INTX11 0x400U // Flag for Interrupt 4.11 +#define PIE_IFR4_INTX12 0x800U // Flag for Interrupt 4.12 +#define PIE_IFR4_INTX13 0x1000U // Flag for Interrupt 4.13 +#define PIE_IFR4_INTX14 0x2000U // Flag for Interrupt 4.14 +#define PIE_IFR4_INTX15 0x4000U // Flag for Interrupt 4.15 +#define PIE_IFR4_INTX16 0x8000U // Flag for Interrupt 4.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER5 register +// +//************************************************************************************************* +#define PIE_IER5_INTX1 0x1U // Enable for Interrupt 5.1 +#define PIE_IER5_INTX2 0x2U // Enable for Interrupt 5.2 +#define PIE_IER5_INTX3 0x4U // Enable for Interrupt 5.3 +#define PIE_IER5_INTX4 0x8U // Enable for Interrupt 5.4 +#define PIE_IER5_INTX5 0x10U // Enable for Interrupt 5.5 +#define PIE_IER5_INTX6 0x20U // Enable for Interrupt 5.6 +#define PIE_IER5_INTX7 0x40U // Enable for Interrupt 5.7 +#define PIE_IER5_INTX8 0x80U // Enable for Interrupt 5.8 +#define PIE_IER5_INTX9 0x100U // Enable for Interrupt 5.9 +#define PIE_IER5_INTX10 0x200U // Enable for Interrupt 5.10 +#define PIE_IER5_INTX11 0x400U // Enable for Interrupt 5.11 +#define PIE_IER5_INTX12 0x800U // Enable for Interrupt 5.12 +#define PIE_IER5_INTX13 0x1000U // Enable for Interrupt 5.13 +#define PIE_IER5_INTX14 0x2000U // Enable for Interrupt 5.14 +#define PIE_IER5_INTX15 0x4000U // Enable for Interrupt 5.15 +#define PIE_IER5_INTX16 0x8000U // Enable for Interrupt 5.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR5 register +// +//************************************************************************************************* +#define PIE_IFR5_INTX1 0x1U // Flag for Interrupt 5.1 +#define PIE_IFR5_INTX2 0x2U // Flag for Interrupt 5.2 +#define PIE_IFR5_INTX3 0x4U // Flag for Interrupt 5.3 +#define PIE_IFR5_INTX4 0x8U // Flag for Interrupt 5.4 +#define PIE_IFR5_INTX5 0x10U // Flag for Interrupt 5.5 +#define PIE_IFR5_INTX6 0x20U // Flag for Interrupt 5.6 +#define PIE_IFR5_INTX7 0x40U // Flag for Interrupt 5.7 +#define PIE_IFR5_INTX8 0x80U // Flag for Interrupt 5.8 +#define PIE_IFR5_INTX9 0x100U // Flag for Interrupt 5.9 +#define PIE_IFR5_INTX10 0x200U // Flag for Interrupt 5.10 +#define PIE_IFR5_INTX11 0x400U // Flag for Interrupt 5.11 +#define PIE_IFR5_INTX12 0x800U // Flag for Interrupt 5.12 +#define PIE_IFR5_INTX13 0x1000U // Flag for Interrupt 5.13 +#define PIE_IFR5_INTX14 0x2000U // Flag for Interrupt 5.14 +#define PIE_IFR5_INTX15 0x4000U // Flag for Interrupt 5.15 +#define PIE_IFR5_INTX16 0x8000U // Flag for Interrupt 5.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER6 register +// +//************************************************************************************************* +#define PIE_IER6_INTX1 0x1U // Enable for Interrupt 6.1 +#define PIE_IER6_INTX2 0x2U // Enable for Interrupt 6.2 +#define PIE_IER6_INTX3 0x4U // Enable for Interrupt 6.3 +#define PIE_IER6_INTX4 0x8U // Enable for Interrupt 6.4 +#define PIE_IER6_INTX5 0x10U // Enable for Interrupt 6.5 +#define PIE_IER6_INTX6 0x20U // Enable for Interrupt 6.6 +#define PIE_IER6_INTX7 0x40U // Enable for Interrupt 6.7 +#define PIE_IER6_INTX8 0x80U // Enable for Interrupt 6.8 +#define PIE_IER6_INTX9 0x100U // Enable for Interrupt 6.9 +#define PIE_IER6_INTX10 0x200U // Enable for Interrupt 6.10 +#define PIE_IER6_INTX11 0x400U // Enable for Interrupt 6.11 +#define PIE_IER6_INTX12 0x800U // Enable for Interrupt 6.12 +#define PIE_IER6_INTX13 0x1000U // Enable for Interrupt 6.13 +#define PIE_IER6_INTX14 0x2000U // Enable for Interrupt 6.14 +#define PIE_IER6_INTX15 0x4000U // Enable for Interrupt 6.15 +#define PIE_IER6_INTX16 0x8000U // Enable for Interrupt 6.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR6 register +// +//************************************************************************************************* +#define PIE_IFR6_INTX1 0x1U // Flag for Interrupt 6.1 +#define PIE_IFR6_INTX2 0x2U // Flag for Interrupt 6.2 +#define PIE_IFR6_INTX3 0x4U // Flag for Interrupt 6.3 +#define PIE_IFR6_INTX4 0x8U // Flag for Interrupt 6.4 +#define PIE_IFR6_INTX5 0x10U // Flag for Interrupt 6.5 +#define PIE_IFR6_INTX6 0x20U // Flag for Interrupt 6.6 +#define PIE_IFR6_INTX7 0x40U // Flag for Interrupt 6.7 +#define PIE_IFR6_INTX8 0x80U // Flag for Interrupt 6.8 +#define PIE_IFR6_INTX9 0x100U // Flag for Interrupt 6.9 +#define PIE_IFR6_INTX10 0x200U // Flag for Interrupt 6.10 +#define PIE_IFR6_INTX11 0x400U // Flag for Interrupt 6.11 +#define PIE_IFR6_INTX12 0x800U // Flag for Interrupt 6.12 +#define PIE_IFR6_INTX13 0x1000U // Flag for Interrupt 6.13 +#define PIE_IFR6_INTX14 0x2000U // Flag for Interrupt 6.14 +#define PIE_IFR6_INTX15 0x4000U // Flag for Interrupt 6.15 +#define PIE_IFR6_INTX16 0x8000U // Flag for Interrupt 6.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER7 register +// +//************************************************************************************************* +#define PIE_IER7_INTX1 0x1U // Enable for Interrupt 7.1 +#define PIE_IER7_INTX2 0x2U // Enable for Interrupt 7.2 +#define PIE_IER7_INTX3 0x4U // Enable for Interrupt 7.3 +#define PIE_IER7_INTX4 0x8U // Enable for Interrupt 7.4 +#define PIE_IER7_INTX5 0x10U // Enable for Interrupt 7.5 +#define PIE_IER7_INTX6 0x20U // Enable for Interrupt 7.6 +#define PIE_IER7_INTX7 0x40U // Enable for Interrupt 7.7 +#define PIE_IER7_INTX8 0x80U // Enable for Interrupt 7.8 +#define PIE_IER7_INTX9 0x100U // Enable for Interrupt 7.9 +#define PIE_IER7_INTX10 0x200U // Enable for Interrupt 7.10 +#define PIE_IER7_INTX11 0x400U // Enable for Interrupt 7.11 +#define PIE_IER7_INTX12 0x800U // Enable for Interrupt 7.12 +#define PIE_IER7_INTX13 0x1000U // Enable for Interrupt 7.13 +#define PIE_IER7_INTX14 0x2000U // Enable for Interrupt 7.14 +#define PIE_IER7_INTX15 0x4000U // Enable for Interrupt 7.15 +#define PIE_IER7_INTX16 0x8000U // Enable for Interrupt 7.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR7 register +// +//************************************************************************************************* +#define PIE_IFR7_INTX1 0x1U // Flag for Interrupt 7.1 +#define PIE_IFR7_INTX2 0x2U // Flag for Interrupt 7.2 +#define PIE_IFR7_INTX3 0x4U // Flag for Interrupt 7.3 +#define PIE_IFR7_INTX4 0x8U // Flag for Interrupt 7.4 +#define PIE_IFR7_INTX5 0x10U // Flag for Interrupt 7.5 +#define PIE_IFR7_INTX6 0x20U // Flag for Interrupt 7.6 +#define PIE_IFR7_INTX7 0x40U // Flag for Interrupt 7.7 +#define PIE_IFR7_INTX8 0x80U // Flag for Interrupt 7.8 +#define PIE_IFR7_INTX9 0x100U // Flag for Interrupt 7.9 +#define PIE_IFR7_INTX10 0x200U // Flag for Interrupt 7.10 +#define PIE_IFR7_INTX11 0x400U // Flag for Interrupt 7.11 +#define PIE_IFR7_INTX12 0x800U // Flag for Interrupt 7.12 +#define PIE_IFR7_INTX13 0x1000U // Flag for Interrupt 7.13 +#define PIE_IFR7_INTX14 0x2000U // Flag for Interrupt 7.14 +#define PIE_IFR7_INTX15 0x4000U // Flag for Interrupt 7.15 +#define PIE_IFR7_INTX16 0x8000U // Flag for Interrupt 7.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER8 register +// +//************************************************************************************************* +#define PIE_IER8_INTX1 0x1U // Enable for Interrupt 8.1 +#define PIE_IER8_INTX2 0x2U // Enable for Interrupt 8.2 +#define PIE_IER8_INTX3 0x4U // Enable for Interrupt 8.3 +#define PIE_IER8_INTX4 0x8U // Enable for Interrupt 8.4 +#define PIE_IER8_INTX5 0x10U // Enable for Interrupt 8.5 +#define PIE_IER8_INTX6 0x20U // Enable for Interrupt 8.6 +#define PIE_IER8_INTX7 0x40U // Enable for Interrupt 8.7 +#define PIE_IER8_INTX8 0x80U // Enable for Interrupt 8.8 +#define PIE_IER8_INTX9 0x100U // Enable for Interrupt 8.9 +#define PIE_IER8_INTX10 0x200U // Enable for Interrupt 8.10 +#define PIE_IER8_INTX11 0x400U // Enable for Interrupt 8.11 +#define PIE_IER8_INTX12 0x800U // Enable for Interrupt 8.12 +#define PIE_IER8_INTX13 0x1000U // Enable for Interrupt 8.13 +#define PIE_IER8_INTX14 0x2000U // Enable for Interrupt 8.14 +#define PIE_IER8_INTX15 0x4000U // Enable for Interrupt 8.15 +#define PIE_IER8_INTX16 0x8000U // Enable for Interrupt 8.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR8 register +// +//************************************************************************************************* +#define PIE_IFR8_INTX1 0x1U // Flag for Interrupt 8.1 +#define PIE_IFR8_INTX2 0x2U // Flag for Interrupt 8.2 +#define PIE_IFR8_INTX3 0x4U // Flag for Interrupt 8.3 +#define PIE_IFR8_INTX4 0x8U // Flag for Interrupt 8.4 +#define PIE_IFR8_INTX5 0x10U // Flag for Interrupt 8.5 +#define PIE_IFR8_INTX6 0x20U // Flag for Interrupt 8.6 +#define PIE_IFR8_INTX7 0x40U // Flag for Interrupt 8.7 +#define PIE_IFR8_INTX8 0x80U // Flag for Interrupt 8.8 +#define PIE_IFR8_INTX9 0x100U // Flag for Interrupt 8.9 +#define PIE_IFR8_INTX10 0x200U // Flag for Interrupt 8.10 +#define PIE_IFR8_INTX11 0x400U // Flag for Interrupt 8.11 +#define PIE_IFR8_INTX12 0x800U // Flag for Interrupt 8.12 +#define PIE_IFR8_INTX13 0x1000U // Flag for Interrupt 8.13 +#define PIE_IFR8_INTX14 0x2000U // Flag for Interrupt 8.14 +#define PIE_IFR8_INTX15 0x4000U // Flag for Interrupt 8.15 +#define PIE_IFR8_INTX16 0x8000U // Flag for Interrupt 8.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER9 register +// +//************************************************************************************************* +#define PIE_IER9_INTX1 0x1U // Enable for Interrupt 9.1 +#define PIE_IER9_INTX2 0x2U // Enable for Interrupt 9.2 +#define PIE_IER9_INTX3 0x4U // Enable for Interrupt 9.3 +#define PIE_IER9_INTX4 0x8U // Enable for Interrupt 9.4 +#define PIE_IER9_INTX5 0x10U // Enable for Interrupt 9.5 +#define PIE_IER9_INTX6 0x20U // Enable for Interrupt 9.6 +#define PIE_IER9_INTX7 0x40U // Enable for Interrupt 9.7 +#define PIE_IER9_INTX8 0x80U // Enable for Interrupt 9.8 +#define PIE_IER9_INTX9 0x100U // Enable for Interrupt 9.9 +#define PIE_IER9_INTX10 0x200U // Enable for Interrupt 9.10 +#define PIE_IER9_INTX11 0x400U // Enable for Interrupt 9.11 +#define PIE_IER9_INTX12 0x800U // Enable for Interrupt 9.12 +#define PIE_IER9_INTX13 0x1000U // Enable for Interrupt 9.13 +#define PIE_IER9_INTX14 0x2000U // Enable for Interrupt 9.14 +#define PIE_IER9_INTX15 0x4000U // Enable for Interrupt 9.15 +#define PIE_IER9_INTX16 0x8000U // Enable for Interrupt 9.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR9 register +// +//************************************************************************************************* +#define PIE_IFR9_INTX1 0x1U // Flag for Interrupt 9.1 +#define PIE_IFR9_INTX2 0x2U // Flag for Interrupt 9.2 +#define PIE_IFR9_INTX3 0x4U // Flag for Interrupt 9.3 +#define PIE_IFR9_INTX4 0x8U // Flag for Interrupt 9.4 +#define PIE_IFR9_INTX5 0x10U // Flag for Interrupt 9.5 +#define PIE_IFR9_INTX6 0x20U // Flag for Interrupt 9.6 +#define PIE_IFR9_INTX7 0x40U // Flag for Interrupt 9.7 +#define PIE_IFR9_INTX8 0x80U // Flag for Interrupt 9.8 +#define PIE_IFR9_INTX9 0x100U // Flag for Interrupt 9.9 +#define PIE_IFR9_INTX10 0x200U // Flag for Interrupt 9.10 +#define PIE_IFR9_INTX11 0x400U // Flag for Interrupt 9.11 +#define PIE_IFR9_INTX12 0x800U // Flag for Interrupt 9.12 +#define PIE_IFR9_INTX13 0x1000U // Flag for Interrupt 9.13 +#define PIE_IFR9_INTX14 0x2000U // Flag for Interrupt 9.14 +#define PIE_IFR9_INTX15 0x4000U // Flag for Interrupt 9.15 +#define PIE_IFR9_INTX16 0x8000U // Flag for Interrupt 9.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER10 register +// +//************************************************************************************************* +#define PIE_IER10_INTX1 0x1U // Enable for Interrupt 10.1 +#define PIE_IER10_INTX2 0x2U // Enable for Interrupt 10.2 +#define PIE_IER10_INTX3 0x4U // Enable for Interrupt 10.3 +#define PIE_IER10_INTX4 0x8U // Enable for Interrupt 10.4 +#define PIE_IER10_INTX5 0x10U // Enable for Interrupt 10.5 +#define PIE_IER10_INTX6 0x20U // Enable for Interrupt 10.6 +#define PIE_IER10_INTX7 0x40U // Enable for Interrupt 10.7 +#define PIE_IER10_INTX8 0x80U // Enable for Interrupt 10.8 +#define PIE_IER10_INTX9 0x100U // Enable for Interrupt 10.9 +#define PIE_IER10_INTX10 0x200U // Enable for Interrupt 10.10 +#define PIE_IER10_INTX11 0x400U // Enable for Interrupt 10.11 +#define PIE_IER10_INTX12 0x800U // Enable for Interrupt 10.12 +#define PIE_IER10_INTX13 0x1000U // Enable for Interrupt 10.13 +#define PIE_IER10_INTX14 0x2000U // Enable for Interrupt 10.14 +#define PIE_IER10_INTX15 0x4000U // Enable for Interrupt 10.15 +#define PIE_IER10_INTX16 0x8000U // Enable for Interrupt 10.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR10 register +// +//************************************************************************************************* +#define PIE_IFR10_INTX1 0x1U // Flag for Interrupt 10.1 +#define PIE_IFR10_INTX2 0x2U // Flag for Interrupt 10.2 +#define PIE_IFR10_INTX3 0x4U // Flag for Interrupt 10.3 +#define PIE_IFR10_INTX4 0x8U // Flag for Interrupt 10.4 +#define PIE_IFR10_INTX5 0x10U // Flag for Interrupt 10.5 +#define PIE_IFR10_INTX6 0x20U // Flag for Interrupt 10.6 +#define PIE_IFR10_INTX7 0x40U // Flag for Interrupt 10.7 +#define PIE_IFR10_INTX8 0x80U // Flag for Interrupt 10.8 +#define PIE_IFR10_INTX9 0x100U // Flag for Interrupt 10.9 +#define PIE_IFR10_INTX10 0x200U // Flag for Interrupt 10.10 +#define PIE_IFR10_INTX11 0x400U // Flag for Interrupt 10.11 +#define PIE_IFR10_INTX12 0x800U // Flag for Interrupt 10.12 +#define PIE_IFR10_INTX13 0x1000U // Flag for Interrupt 10.13 +#define PIE_IFR10_INTX14 0x2000U // Flag for Interrupt 10.14 +#define PIE_IFR10_INTX15 0x4000U // Flag for Interrupt 10.15 +#define PIE_IFR10_INTX16 0x8000U // Flag for Interrupt 10.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER11 register +// +//************************************************************************************************* +#define PIE_IER11_INTX1 0x1U // Enable for Interrupt 11.1 +#define PIE_IER11_INTX2 0x2U // Enable for Interrupt 11.2 +#define PIE_IER11_INTX3 0x4U // Enable for Interrupt 11.3 +#define PIE_IER11_INTX4 0x8U // Enable for Interrupt 11.4 +#define PIE_IER11_INTX5 0x10U // Enable for Interrupt 11.5 +#define PIE_IER11_INTX6 0x20U // Enable for Interrupt 11.6 +#define PIE_IER11_INTX7 0x40U // Enable for Interrupt 11.7 +#define PIE_IER11_INTX8 0x80U // Enable for Interrupt 11.8 +#define PIE_IER11_INTX9 0x100U // Enable for Interrupt 11.9 +#define PIE_IER11_INTX10 0x200U // Enable for Interrupt 11.10 +#define PIE_IER11_INTX11 0x400U // Enable for Interrupt 11.11 +#define PIE_IER11_INTX12 0x800U // Enable for Interrupt 11.12 +#define PIE_IER11_INTX13 0x1000U // Enable for Interrupt 11.13 +#define PIE_IER11_INTX14 0x2000U // Enable for Interrupt 11.14 +#define PIE_IER11_INTX15 0x4000U // Enable for Interrupt 11.15 +#define PIE_IER11_INTX16 0x8000U // Enable for Interrupt 11.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR11 register +// +//************************************************************************************************* +#define PIE_IFR11_INTX1 0x1U // Flag for Interrupt 11.1 +#define PIE_IFR11_INTX2 0x2U // Flag for Interrupt 11.2 +#define PIE_IFR11_INTX3 0x4U // Flag for Interrupt 11.3 +#define PIE_IFR11_INTX4 0x8U // Flag for Interrupt 11.4 +#define PIE_IFR11_INTX5 0x10U // Flag for Interrupt 11.5 +#define PIE_IFR11_INTX6 0x20U // Flag for Interrupt 11.6 +#define PIE_IFR11_INTX7 0x40U // Flag for Interrupt 11.7 +#define PIE_IFR11_INTX8 0x80U // Flag for Interrupt 11.8 +#define PIE_IFR11_INTX9 0x100U // Flag for Interrupt 11.9 +#define PIE_IFR11_INTX10 0x200U // Flag for Interrupt 11.10 +#define PIE_IFR11_INTX11 0x400U // Flag for Interrupt 11.11 +#define PIE_IFR11_INTX12 0x800U // Flag for Interrupt 11.12 +#define PIE_IFR11_INTX13 0x1000U // Flag for Interrupt 11.13 +#define PIE_IFR11_INTX14 0x2000U // Flag for Interrupt 11.14 +#define PIE_IFR11_INTX15 0x4000U // Flag for Interrupt 11.15 +#define PIE_IFR11_INTX16 0x8000U // Flag for Interrupt 11.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER12 register +// +//************************************************************************************************* +#define PIE_IER12_INTX1 0x1U // Enable for Interrupt 12.1 +#define PIE_IER12_INTX2 0x2U // Enable for Interrupt 12.2 +#define PIE_IER12_INTX3 0x4U // Enable for Interrupt 12.3 +#define PIE_IER12_INTX4 0x8U // Enable for Interrupt 12.4 +#define PIE_IER12_INTX5 0x10U // Enable for Interrupt 12.5 +#define PIE_IER12_INTX6 0x20U // Enable for Interrupt 12.6 +#define PIE_IER12_INTX7 0x40U // Enable for Interrupt 12.7 +#define PIE_IER12_INTX8 0x80U // Enable for Interrupt 12.8 +#define PIE_IER12_INTX9 0x100U // Enable for Interrupt 12.9 +#define PIE_IER12_INTX10 0x200U // Enable for Interrupt 12.10 +#define PIE_IER12_INTX11 0x400U // Enable for Interrupt 12.11 +#define PIE_IER12_INTX12 0x800U // Enable for Interrupt 12.12 +#define PIE_IER12_INTX13 0x1000U // Enable for Interrupt 12.13 +#define PIE_IER12_INTX14 0x2000U // Enable for Interrupt 12.14 +#define PIE_IER12_INTX15 0x4000U // Enable for Interrupt 12.15 +#define PIE_IER12_INTX16 0x8000U // Enable for Interrupt 12.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR12 register +// +//************************************************************************************************* +#define PIE_IFR12_INTX1 0x1U // Flag for Interrupt 12.1 +#define PIE_IFR12_INTX2 0x2U // Flag for Interrupt 12.2 +#define PIE_IFR12_INTX3 0x4U // Flag for Interrupt 12.3 +#define PIE_IFR12_INTX4 0x8U // Flag for Interrupt 12.4 +#define PIE_IFR12_INTX5 0x10U // Flag for Interrupt 12.5 +#define PIE_IFR12_INTX6 0x20U // Flag for Interrupt 12.6 +#define PIE_IFR12_INTX7 0x40U // Flag for Interrupt 12.7 +#define PIE_IFR12_INTX8 0x80U // Flag for Interrupt 12.8 +#define PIE_IFR12_INTX9 0x100U // Flag for Interrupt 12.9 +#define PIE_IFR12_INTX10 0x200U // Flag for Interrupt 12.10 +#define PIE_IFR12_INTX11 0x400U // Flag for Interrupt 12.11 +#define PIE_IFR12_INTX12 0x800U // Flag for Interrupt 12.12 +#define PIE_IFR12_INTX13 0x1000U // Flag for Interrupt 12.13 +#define PIE_IFR12_INTX14 0x2000U // Flag for Interrupt 12.14 +#define PIE_IFR12_INTX15 0x4000U // Flag for Interrupt 12.15 +#define PIE_IFR12_INTX16 0x8000U // Flag for Interrupt 12.16 + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_sci.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sci.h new file mode 100644 index 0000000..2fc9680 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sci.h @@ -0,0 +1,209 @@ +//########################################################################### +// +// FILE: hw_sci.h +// +// TITLE: Definitions for the SCI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SCI_H +#define HW_SCI_H + +//************************************************************************************************* +// +// The following are defines for the SCI register offsets +// +//************************************************************************************************* +#define SCI_O_CCR 0x0U // Communications control register +#define SCI_O_CTL1 0x1U // Control register 1 +#define SCI_O_HBAUD 0x2U // Baud rate (high) register +#define SCI_O_LBAUD 0x3U // Baud rate (low) register +#define SCI_O_CTL2 0x4U // Control register 2 +#define SCI_O_RXST 0x5U // Receive status register +#define SCI_O_RXEMU 0x6U // Receive emulation buffer register +#define SCI_O_RXBUF 0x7U // Receive data buffer +#define SCI_O_TXBUF 0x9U // Transmit data buffer +#define SCI_O_FFTX 0xAU // FIFO transmit register +#define SCI_O_FFRX 0xBU // FIFO receive register +#define SCI_O_FFCT 0xCU // FIFO control register +#define SCI_O_PRI 0xFU // SCI priority control + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICCR register +// +//************************************************************************************************* +#define SCI_CCR_SCICHAR_S 0U +#define SCI_CCR_SCICHAR_M 0x7U // Character length control +#define SCI_CCR_ADDRIDLE_MODE 0x8U // ADDR/IDLE Mode control +#define SCI_CCR_LOOPBKENA 0x10U // Loop Back enable +#define SCI_CCR_PARITYENA 0x20U // Parity enable +#define SCI_CCR_PARITY 0x40U // Even or Odd Parity +#define SCI_CCR_STOPBITS 0x80U // Number of Stop Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICTL1 register +// +//************************************************************************************************* +#define SCI_CTL1_RXENA 0x1U // SCI receiver enable +#define SCI_CTL1_TXENA 0x2U // SCI transmitter enable +#define SCI_CTL1_SLEEP 0x4U // SCI sleep +#define SCI_CTL1_TXWAKE 0x8U // Transmitter wakeup method +#define SCI_CTL1_SWRESET 0x20U // Software reset +#define SCI_CTL1_RXERRINTENA 0x40U // Receive error interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIHBAUD register +// +//************************************************************************************************* +#define SCI_HBAUD_BAUD_S 0U +#define SCI_HBAUD_BAUD_M 0xFFU // SCI 16-bit baud selection Registers SCIHBAUD + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCILBAUD register +// +//************************************************************************************************* +#define SCI_LBAUD_BAUD_S 0U +#define SCI_LBAUD_BAUD_M 0xFFU // SCI 16-bit baud selection Registers SCILBAUD + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICTL2 register +// +//************************************************************************************************* +#define SCI_CTL2_TXINTENA 0x1U // Transmit __interrupt enable +#define SCI_CTL2_RXBKINTENA 0x2U // Receiver-buffer break enable +#define SCI_CTL2_TXEMPTY 0x40U // Transmitter empty flag +#define SCI_CTL2_TXRDY 0x80U // Transmitter ready flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXST register +// +//************************************************************************************************* +#define SCI_RXST_RXWAKE 0x2U // Receiver wakeup detect flag +#define SCI_RXST_PE 0x4U // Parity error flag +#define SCI_RXST_OE 0x8U // Overrun error flag +#define SCI_RXST_FE 0x10U // Framing error flag +#define SCI_RXST_BRKDT 0x20U // Break-detect flag +#define SCI_RXST_RXRDY 0x40U // Receiver ready flag +#define SCI_RXST_RXERROR 0x80U // Receiver error flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXEMU register +// +//************************************************************************************************* +#define SCI_RXEMU_ERXDT_S 0U +#define SCI_RXEMU_ERXDT_M 0xFFU // Receive emulation buffer data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXBUF register +// +//************************************************************************************************* +#define SCI_RXBUF_SAR_S 0U +#define SCI_RXBUF_SAR_M 0xFFU // Receive Character bits +#define SCI_RXBUF_SCIFFPE 0x4000U // Receiver error flag +#define SCI_RXBUF_SCIFFFE 0x8000U // Receiver error flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCITXBUF register +// +//************************************************************************************************* +#define SCI_TXBUF_TXDT_S 0U +#define SCI_TXBUF_TXDT_M 0xFFU // Transmit data buffer + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFTX register +// +//************************************************************************************************* +#define SCI_FFTX_TXFFIL_S 0U +#define SCI_FFTX_TXFFIL_M 0x1FU // Interrupt level +#define SCI_FFTX_TXFFIENA 0x20U // Interrupt enable +#define SCI_FFTX_TXFFINTCLR 0x40U // Clear INT flag +#define SCI_FFTX_TXFFINT 0x80U // INT flag +#define SCI_FFTX_TXFFST_S 8U +#define SCI_FFTX_TXFFST_M 0x1F00U // FIFO status +#define SCI_FFTX_TXFIFORESET 0x2000U // FIFO reset +#define SCI_FFTX_SCIFFENA 0x4000U // Enhancement enable +#define SCI_FFTX_SCIRST 0x8000U // SCI reset rx/tx channels + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFRX register +// +//************************************************************************************************* +#define SCI_FFRX_RXFFIL_S 0U +#define SCI_FFRX_RXFFIL_M 0x1FU // Interrupt level +#define SCI_FFRX_RXFFIENA 0x20U // Interrupt enable +#define SCI_FFRX_RXFFINTCLR 0x40U // Clear INT flag +#define SCI_FFRX_RXFFINT 0x80U // INT flag +#define SCI_FFRX_RXFFST_S 8U +#define SCI_FFRX_RXFFST_M 0x1F00U // FIFO status +#define SCI_FFRX_RXFIFORESET 0x2000U // FIFO reset +#define SCI_FFRX_RXFFOVRCLR 0x4000U // Clear overflow +#define SCI_FFRX_RXFFOVF 0x8000U // FIFO overflow + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFCT register +// +//************************************************************************************************* +#define SCI_FFCT_FFTXDLY_S 0U +#define SCI_FFCT_FFTXDLY_M 0xFFU // FIFO transmit delay +#define SCI_FFCT_CDC 0x2000U // Auto baud mode enable +#define SCI_FFCT_ABDCLR 0x4000U // Auto baud clear +#define SCI_FFCT_ABD 0x8000U // Auto baud detect + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIPRI register +// +//************************************************************************************************* +#define SCI_PRI_FREESOFT_S 3U +#define SCI_PRI_FREESOFT_M 0x18U // Emulation modes + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_sdfm.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sdfm.h new file mode 100644 index 0000000..d2ba146 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sdfm.h @@ -0,0 +1,431 @@ +//########################################################################### +// +// FILE: hw_sdfm.h +// +// TITLE: Definitions for the SDFM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SDFM_H +#define HW_SDFM_H + +//************************************************************************************************* +// +// The following are defines for the SDFM register offsets +// +//************************************************************************************************* +#define SDFM_O_SDIFLG 0x0U // Interrupt Flag Register +#define SDFM_O_SDIFLGCLR 0x2U // Interrupt Flag Clear Register +#define SDFM_O_SDCTL 0x4U // SD Control Register +#define SDFM_O_SDMFILEN 0x6U // SD Master Filter Enable +#define SDFM_O_SDCTLPARM1 0x10U // Control Parameter Register for Ch1 +#define SDFM_O_SDDFPARM1 0x11U // Data Filter Parameter Register for Ch1 +#define SDFM_O_SDDPARM1 0x12U // Integer Parameter Register for Ch1 +#define SDFM_O_SDCMPH1 0x13U // High-level Threshold Register for Ch1 +#define SDFM_O_SDCMPL1 0x14U // Low-level Threshold Register for Ch1 +#define SDFM_O_SDCPARM1 0x15U // Comparator Parameter Register for Ch1 +#define SDFM_O_SDDATA1 0x16U // Filter Data Register (16 or 32bit) for Ch1 +#define SDFM_O_SDCTLPARM2 0x20U // Control Parameter Register for Ch2 +#define SDFM_O_SDDFPARM2 0x21U // Data Filter Parameter Register for Ch2 +#define SDFM_O_SDDPARM2 0x22U // Integer Parameter Register for Ch2 +#define SDFM_O_SDCMPH2 0x23U // High-level Threshold Register for Ch2 +#define SDFM_O_SDCMPL2 0x24U // Low-level Threshold Register for Ch2 +#define SDFM_O_SDCPARM2 0x25U // Comparator Parameter Register for Ch2 +#define SDFM_O_SDDATA2 0x26U // Filter Data Register (16 or 32bit) for Ch2 +#define SDFM_O_SDCTLPARM3 0x30U // Control Parameter Register for Ch3 +#define SDFM_O_SDDFPARM3 0x31U // Data Filter Parameter Register for Ch3 +#define SDFM_O_SDDPARM3 0x32U // Integer Parameter Register for Ch3 +#define SDFM_O_SDCMPH3 0x33U // High-level Threshold Register for Ch3 +#define SDFM_O_SDCMPL3 0x34U // Low-level Threshold Register for Ch3 +#define SDFM_O_SDCPARM3 0x35U // Comparator Parameter Register for Ch3 +#define SDFM_O_SDDATA3 0x36U // Filter Data Register (16 or 32bit) for Ch3 +#define SDFM_O_SDCTLPARM4 0x40U // Control Parameter Register for Ch4 +#define SDFM_O_SDDFPARM4 0x41U // Data Filter Parameter Register for Ch4 +#define SDFM_O_SDDPARM4 0x42U // Integer Parameter Register for Ch4 +#define SDFM_O_SDCMPH4 0x43U // High-level Threshold Register for Ch4 +#define SDFM_O_SDCMPL4 0x44U // Low-level Threshold Register for Ch4 +#define SDFM_O_SDCPARM4 0x45U // Comparator Parameter Register for Ch4 +#define SDFM_O_SDDATA4 0x46U // Filter Data Register (16 or 32bit) for Ch4 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDIFLG register +// +//************************************************************************************************* +#define SDFM_SDIFLG_IFH1 0x1U // High-level Interrupt flag Filter 1 +#define SDFM_SDIFLG_IFL1 0x2U // Low-Level Interrupt flag Filter 1 +#define SDFM_SDIFLG_IFH2 0x4U // High-level Interrupt flag Filter 2 +#define SDFM_SDIFLG_IFL2 0x8U // Low-Level Interrupt flag Filter 2 +#define SDFM_SDIFLG_IFH3 0x10U // High-level Interrupt flag Filter 3 +#define SDFM_SDIFLG_IFL3 0x20U // Low-Level Interrupt flag Filter 3 +#define SDFM_SDIFLG_IFH4 0x40U // High-level Interrupt flag Filter 4 +#define SDFM_SDIFLG_IFL4 0x80U // Low-Level Interrupt flag Filter 4 +#define SDFM_SDIFLG_MF1 0x100U // Modulator Failure for Filter 1 +#define SDFM_SDIFLG_MF2 0x200U // Modulator Failure for Filter 2 +#define SDFM_SDIFLG_MF3 0x400U // Modulator Failure for Filter 3 +#define SDFM_SDIFLG_MF4 0x800U // Modulator Failure for Filter 4 +#define SDFM_SDIFLG_AF1 0x1000U // Acknowledge flag for Filter 1 +#define SDFM_SDIFLG_AF2 0x2000U // Acknowledge flag for Filter 2 +#define SDFM_SDIFLG_AF3 0x4000U // Acknowledge flag for Filter 3 +#define SDFM_SDIFLG_AF4 0x8000U // Acknowledge flag for Filter 4 +#define SDFM_SDIFLG_MIF 0x80000000U // Master Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDIFLGCLR register +// +//************************************************************************************************* +#define SDFM_SDIFLGCLR_IFH1 0x1U // High-level Interrupt flag Filter 1 +#define SDFM_SDIFLGCLR_IFL1 0x2U // Low-Level Interrupt flag Filter 1 +#define SDFM_SDIFLGCLR_IFH2 0x4U // High-level Interrupt flag Filter 2 +#define SDFM_SDIFLGCLR_IFL2 0x8U // Low-Level Interrupt flag Filter 2 +#define SDFM_SDIFLGCLR_IFH3 0x10U // High-level Interrupt flag Filter 3 +#define SDFM_SDIFLGCLR_IFL3 0x20U // Low-Level Interrupt flag Filter 3 +#define SDFM_SDIFLGCLR_IFH4 0x40U // High-level Interrupt flag Filter 4 +#define SDFM_SDIFLGCLR_IFL4 0x80U // Low-Level Interrupt flag Filter 4 +#define SDFM_SDIFLGCLR_MF1 0x100U // Modulator Failure for Filter 1 +#define SDFM_SDIFLGCLR_MF2 0x200U // Modulator Failure for Filter 2 +#define SDFM_SDIFLGCLR_MF3 0x400U // Modulator Failure for Filter 3 +#define SDFM_SDIFLGCLR_MF4 0x800U // Modulator Failure for Filter 4 +#define SDFM_SDIFLGCLR_AF1 0x1000U // Acknowledge flag for Filter 1 +#define SDFM_SDIFLGCLR_AF2 0x2000U // Acknowledge flag for Filter 2 +#define SDFM_SDIFLGCLR_AF3 0x4000U // Acknowledge flag for Filter 3 +#define SDFM_SDIFLGCLR_AF4 0x8000U // Acknowledge flag for Filter 4 +#define SDFM_SDIFLGCLR_MIF 0x80000000U // Master Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTL register +// +//************************************************************************************************* +#define SDFM_SDCTL_MIE 0x2000U // Master Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDMFILEN register +// +//************************************************************************************************* +#define SDFM_SDMFILEN_MFE 0x800U // Master Filter Enable. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM1 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM1_MOD_S 0U +#define SDFM_SDCTLPARM1_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM1 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM1_DOSR_S 0U +#define SDFM_SDDFPARM1_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM1_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM1_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM1_SST_S 10U +#define SDFM_SDDFPARM1_SST_M 0xC00U // Data Filter Structure (DataFast/1/2/3) +#define SDFM_SDDFPARM1_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM1 register +// +//************************************************************************************************* +#define SDFM_SDDPARM1_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM1_SH_S 11U +#define SDFM_SDDPARM1_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH1 register +// +//************************************************************************************************* +#define SDFM_SDCMPH1_HLT_S 0U +#define SDFM_SDCMPH1_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL1 register +// +//************************************************************************************************* +#define SDFM_SDCMPL1_LLT_S 0U +#define SDFM_SDCMPL1_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM1 register +// +//************************************************************************************************* +#define SDFM_SDCPARM1_COSR_S 0U +#define SDFM_SDCPARM1_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM1_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM1_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM1_CS1_CS0_S 7U +#define SDFM_SDCPARM1_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM1_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA1 register +// +//************************************************************************************************* +#define SDFM_SDDATA1_DATA16_S 0U +#define SDFM_SDDATA1_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA1_DATA32HI_S 16U +#define SDFM_SDDATA1_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM2 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM2_MOD_S 0U +#define SDFM_SDCTLPARM2_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM2 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM2_DOSR_S 0U +#define SDFM_SDDFPARM2_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM2_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM2_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM2_SST_S 10U +#define SDFM_SDDFPARM2_SST_M 0xC00U // Data Filter Structure (SincFast/1/2/3) +#define SDFM_SDDFPARM2_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM2 register +// +//************************************************************************************************* +#define SDFM_SDDPARM2_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM2_SH_S 11U +#define SDFM_SDDPARM2_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH2 register +// +//************************************************************************************************* +#define SDFM_SDCMPH2_HLT_S 0U +#define SDFM_SDCMPH2_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL2 register +// +//************************************************************************************************* +#define SDFM_SDCMPL2_LLT_S 0U +#define SDFM_SDCMPL2_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM2 register +// +//************************************************************************************************* +#define SDFM_SDCPARM2_COSR_S 0U +#define SDFM_SDCPARM2_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM2_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM2_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM2_CS1_CS0_S 7U +#define SDFM_SDCPARM2_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM2_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA2 register +// +//************************************************************************************************* +#define SDFM_SDDATA2_DATA16_S 0U +#define SDFM_SDDATA2_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA2_DATA32HI_S 16U +#define SDFM_SDDATA2_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM3 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM3_MOD_S 0U +#define SDFM_SDCTLPARM3_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM3 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM3_DOSR_S 0U +#define SDFM_SDDFPARM3_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM3_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM3_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM3_SST_S 10U +#define SDFM_SDDFPARM3_SST_M 0xC00U // Data filter structure (SincFast/1/2/3) +#define SDFM_SDDFPARM3_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM3 register +// +//************************************************************************************************* +#define SDFM_SDDPARM3_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM3_SH_S 11U +#define SDFM_SDDPARM3_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH3 register +// +//************************************************************************************************* +#define SDFM_SDCMPH3_HLT_S 0U +#define SDFM_SDCMPH3_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL3 register +// +//************************************************************************************************* +#define SDFM_SDCMPL3_LLT_S 0U +#define SDFM_SDCMPL3_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM3 register +// +//************************************************************************************************* +#define SDFM_SDCPARM3_COSR_S 0U +#define SDFM_SDCPARM3_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM3_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM3_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM3_CS1_CS0_S 7U +#define SDFM_SDCPARM3_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM3_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA3 register +// +//************************************************************************************************* +#define SDFM_SDDATA3_DATA16_S 0U +#define SDFM_SDDATA3_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA3_DATA32HI_S 16U +#define SDFM_SDDATA3_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM4 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM4_MOD_S 0U +#define SDFM_SDCTLPARM4_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM4 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM4_DOSR_S 0U +#define SDFM_SDDFPARM4_DOSR_M 0xFFU // SINC Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM4_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM4_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM4_SST_S 10U +#define SDFM_SDDFPARM4_SST_M 0xC00U // Data filter structure (SincFast/1/2/3) +#define SDFM_SDDFPARM4_SDSYNCEN 0x1000U // SINC FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM4 register +// +//************************************************************************************************* +#define SDFM_SDDPARM4_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM4_SH_S 11U +#define SDFM_SDDPARM4_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH4 register +// +//************************************************************************************************* +#define SDFM_SDCMPH4_HLT_S 0U +#define SDFM_SDCMPH4_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL4 register +// +//************************************************************************************************* +#define SDFM_SDCMPL4_LLT_S 0U +#define SDFM_SDCMPL4_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM4 register +// +//************************************************************************************************* +#define SDFM_SDCPARM4_COSR_S 0U +#define SDFM_SDCPARM4_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM4_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM4_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM4_CS1_CS0_S 7U +#define SDFM_SDCPARM4_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM4_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA4 register +// +//************************************************************************************************* +#define SDFM_SDDATA4_DATA16_S 0U +#define SDFM_SDDATA4_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA4_DATA32HI_S 16U +#define SDFM_SDDATA4_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_spi.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_spi.h new file mode 100644 index 0000000..c4907aa --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_spi.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_spi.h +// +// TITLE: Definitions for the SPI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SPI_H +#define HW_SPI_H + +//************************************************************************************************* +// +// The following are defines for the SPI register offsets +// +//************************************************************************************************* +#define SPI_O_CCR 0x0U // SPI Configuration Control Register +#define SPI_O_CTL 0x1U // SPI Operation Control Register +#define SPI_O_STS 0x2U // SPI Status Register +#define SPI_O_BRR 0x4U // SPI Baud Rate Register +#define SPI_O_RXEMU 0x6U // SPI Emulation Buffer Register +#define SPI_O_RXBUF 0x7U // SPI Serial Input Buffer Register +#define SPI_O_TXBUF 0x8U // SPI Serial Output Buffer Register +#define SPI_O_DAT 0x9U // SPI Serial Data Register +#define SPI_O_FFTX 0xAU // SPI FIFO Transmit Register +#define SPI_O_FFRX 0xBU // SPI FIFO Receive Register +#define SPI_O_FFCT 0xCU // SPI FIFO Control Register +#define SPI_O_PRI 0xFU // SPI Priority Control Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPICCR register +// +//************************************************************************************************* +#define SPI_CCR_SPICHAR_S 0U +#define SPI_CCR_SPICHAR_M 0xFU // Character Length Control +#define SPI_CCR_SPILBK 0x10U // SPI Loopback +#define SPI_CCR_HS_MODE 0x20U // High Speed mode control +#define SPI_CCR_CLKPOLARITY 0x40U // Shift Clock Polarity +#define SPI_CCR_SPISWRESET 0x80U // SPI Software Reset + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPICTL register +// +//************************************************************************************************* +#define SPI_CTL_SPIINTENA 0x1U // SPI Interupt Enable +#define SPI_CTL_TALK 0x2U // Master/Slave Transmit Enable +#define SPI_CTL_MASTER_SLAVE 0x4U // SPI Network Mode Control +#define SPI_CTL_CLK_PHASE 0x8U // SPI Clock Phase +#define SPI_CTL_OVERRUNINTENA 0x10U // Overrun Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPISTS register +// +//************************************************************************************************* +#define SPI_STS_BUFFULL_FLAG 0x20U // SPI Transmit Buffer Full Flag +#define SPI_STS_INT_FLAG 0x40U // SPI Interrupt Flag +#define SPI_STS_OVERRUN_FLAG 0x80U // SPI Receiver Overrun Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIBRR register +// +//************************************************************************************************* +#define SPI_BRR_SPI_BIT_RATE_S 0U +#define SPI_BRR_SPI_BIT_RATE_M 0x7FU // SPI Bit Rate Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFTX register +// +//************************************************************************************************* +#define SPI_FFTX_TXFFIL_S 0U +#define SPI_FFTX_TXFFIL_M 0x1FU // TXFIFO Interrupt Level +#define SPI_FFTX_TXFFIENA 0x20U // TXFIFO Interrupt Enable +#define SPI_FFTX_TXFFINTCLR 0x40U // TXFIFO Interrupt Clear +#define SPI_FFTX_TXFFINT 0x80U // TXFIFO Interrupt Flag +#define SPI_FFTX_TXFFST_S 8U +#define SPI_FFTX_TXFFST_M 0x1F00U // Transmit FIFO Status +#define SPI_FFTX_TXFIFO 0x2000U // TXFIFO Reset +#define SPI_FFTX_SPIFFENA 0x4000U // FIFO Enhancements Enable +#define SPI_FFTX_SPIRST 0x8000U // SPI Reset + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFRX register +// +//************************************************************************************************* +#define SPI_FFRX_RXFFIL_S 0U +#define SPI_FFRX_RXFFIL_M 0x1FU // RXFIFO Interrupt Level +#define SPI_FFRX_RXFFIENA 0x20U // RXFIFO Interrupt Enable +#define SPI_FFRX_RXFFINTCLR 0x40U // RXFIFO Interupt Clear +#define SPI_FFRX_RXFFINT 0x80U // RXFIFO Interrupt Flag +#define SPI_FFRX_RXFFST_S 8U +#define SPI_FFRX_RXFFST_M 0x1F00U // Receive FIFO Status +#define SPI_FFRX_RXFIFORESET 0x2000U // RXFIFO Reset +#define SPI_FFRX_RXFFOVFCLR 0x4000U // Receive FIFO Overflow Clear +#define SPI_FFRX_RXFFOVF 0x8000U // Receive FIFO Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFCT register +// +//************************************************************************************************* +#define SPI_FFCT_TXDLY_S 0U +#define SPI_FFCT_TXDLY_M 0xFFU // FIFO Transmit Delay Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIPRI register +// +//************************************************************************************************* +#define SPI_PRI_TRIWIRE 0x1U // 3-wire mode select bit +#define SPI_PRI_STEINV 0x2U // SPISTE inversion bit +#define SPI_PRI_FREE 0x10U // Free emulation mode +#define SPI_PRI_SOFT 0x20U // Soft emulation mode + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_sysctl.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sysctl.h new file mode 100644 index 0000000..11df8d3 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_sysctl.h @@ -0,0 +1,1428 @@ +//########################################################################### +// +// FILE: hw_sysctl.h +// +// TITLE: Definitions for the SYSCTL registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SYSCTL_H +#define HW_SYSCTL_H + +//************************************************************************************************* +// +// The following are defines for the SYSCTL register offsets +// +//************************************************************************************************* +#define SYSCTL_O_DEVCFGLOCK1 0x0U // Lock bit for CPUSELx registers +#define SYSCTL_O_PARTIDL 0x8U // Lower 32-bit of Device PART Identification Number +#define SYSCTL_O_PARTIDH 0xAU // Upper 32-bit of Device PART Identification Number +#define SYSCTL_O_REVID 0xCU // Device Revision Number +#define SYSCTL_O_DC0 0x10U // Device Capability: Device Information +#define SYSCTL_O_DC1 0x12U // Device Capability: Processing Block Customization +#define SYSCTL_O_DC2 0x14U // Device Capability: EMIF Customization +#define SYSCTL_O_DC3 0x16U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC4 0x18U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC5 0x1AU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC6 0x1CU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC7 0x1EU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC8 0x20U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC9 0x22U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC10 0x24U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC11 0x26U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC12 0x28U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC13 0x2AU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC14 0x2CU // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC15 0x2EU // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC17 0x32U // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC18 0x34U // Device Capability: CPU1 Lx SRAM Customization +#define SYSCTL_O_DC19 0x36U // Device Capability: CPU2 Lx SRAM Customization +#define SYSCTL_O_DC20 0x38U // Device Capability: GSx SRAM Customization +#define SYSCTL_O_PERCNF1 0x60U // Peripheral Configuration register +#define SYSCTL_O_FUSEERR 0x74U // e-Fuse error Status register +#define SYSCTL_O_SOFTPRES0 0x82U // Processing Block Software Reset register +#define SYSCTL_O_SOFTPRES1 0x84U // EMIF Software Reset register +#define SYSCTL_O_SOFTPRES2 0x86U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES3 0x88U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES4 0x8AU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES6 0x8EU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES7 0x90U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES8 0x92U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES9 0x94U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES11 0x98U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES13 0x9CU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES14 0x9EU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES16 0xA2U // Peripheral Software Reset register +#define SYSCTL_O_CPUSEL0 0xD6U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL1 0xD8U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL2 0xDAU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL4 0xDEU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL5 0xE0U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL6 0xE2U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL7 0xE4U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL8 0xE6U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL9 0xE8U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL11 0xECU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL12 0xEEU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL14 0xF2U // CPU Select register for common peripherals +#define SYSCTL_O_CPU2RESCTL 0x122U // CPU2 Reset Control Register +#define SYSCTL_O_RSTSTAT 0x124U // Reset Status register for secondary C28x CPUs +#define SYSCTL_O_LPMSTAT 0x125U // LPM Status Register for secondary C28x CPUs +#define SYSCTL_O_SYSDBGCTL 0x12CU // System Debug Control register + +#define SYSCTL_O_CLKSEM 0x0U // Clock Control Semaphore Register +#define SYSCTL_O_CLKCFGLOCK1 0x2U // Lock bit for CLKCFG registers +#define SYSCTL_O_CLKSRCCTL1 0x8U // Clock Source Control register-1 +#define SYSCTL_O_CLKSRCCTL2 0xAU // Clock Source Control register-2 +#define SYSCTL_O_CLKSRCCTL3 0xCU // Clock Source Control register-3 +#define SYSCTL_O_SYSPLLCTL1 0xEU // SYSPLL Control register-1 +#define SYSCTL_O_SYSPLLMULT 0x14U // SYSPLL Multiplier register +#define SYSCTL_O_SYSPLLSTS 0x16U // SYSPLL Status register +#define SYSCTL_O_AUXPLLCTL1 0x18U // AUXPLL Control register-1 +#define SYSCTL_O_AUXPLLMULT 0x1EU // AUXPLL Multiplier register +#define SYSCTL_O_AUXPLLSTS 0x20U // AUXPLL Status register +#define SYSCTL_O_SYSCLKDIVSEL 0x22U // System Clock Divider Select register +#define SYSCTL_O_AUXCLKDIVSEL 0x24U // Auxillary Clock Divider Select register +#define SYSCTL_O_PERCLKDIVSEL 0x26U // Peripheral Clock Divider Selet register +#define SYSCTL_O_XCLKOUTDIVSEL 0x28U // XCLKOUT Divider Select register +#define SYSCTL_O_LOSPCP 0x2CU // Low Speed Clock Source Prescalar +#define SYSCTL_O_MCDCR 0x2EU // Missing Clock Detect Control Register +#define SYSCTL_O_X1CNT 0x30U // 10-bit Counter on X1 Clock + +#define SYSCTL_O_CPUSYSLOCK1 0x0U // Lock bit for CPUSYS registers +#define SYSCTL_O_HIBBOOTMODE 0x6U // HIB Boot Mode Register +#define SYSCTL_O_IORESTOREADDR 0x8U // IORestore() routine Address Register +#define SYSCTL_O_PIEVERRADDR 0xAU // PIE Vector Fetch Error Address register +#define SYSCTL_O_PCLKCR0 0x22U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR1 0x24U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR2 0x26U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR3 0x28U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR4 0x2AU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR6 0x2EU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR7 0x30U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR8 0x32U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR9 0x34U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR10 0x36U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR11 0x38U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR12 0x3AU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR13 0x3CU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR14 0x3EU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR16 0x42U // Peripheral Clock Gating Registers +#define SYSCTL_O_SECMSEL 0x74U // Secondary Master Select register for common + // peripherals: Selects between CLA & DMA +#define SYSCTL_O_LPMCR 0x76U // LPM Control Register +#define SYSCTL_O_GPIOLPMSEL0 0x78U // GPIO LPM Wakeup select registers +#define SYSCTL_O_GPIOLPMSEL1 0x7AU // GPIO LPM Wakeup select registers +#define SYSCTL_O_TMR2CLKCTL 0x7CU // Timer2 Clock Measurement functionality control register +#define SYSCTL_O_RESC 0x80U // Reset Cause register + +#define SYSCTL_O_SCSR 0x22U // System Control & Status Register +#define SYSCTL_O_WDCNTR 0x23U // Watchdog Counter Register +#define SYSCTL_O_WDKEY 0x25U // Watchdog Reset Key Register +#define SYSCTL_O_WDCR 0x29U // Watchdog Control Register +#define SYSCTL_O_WDWCR 0x2AU // Watchdog Windowed Control Register + +#define SYSCTL_O_CLA1TASKSRCSELLOCK 0x0U // CLA1 Task Trigger Source Select Lock Register +#define SYSCTL_O_DMACHSRCSELLOCK 0x4U // DMA Channel Triger Source Select Lock Register +#define SYSCTL_O_CLA1TASKSRCSEL1 0x6U // CLA1 Task Trigger Source Select Register-1 +#define SYSCTL_O_CLA1TASKSRCSEL2 0x8U // CLA1 Task Trigger Source Select Register-2 +#define SYSCTL_O_DMACHSRCSEL1 0x16U // DMA Channel Trigger Source Select Register-1 +#define SYSCTL_O_DMACHSRCSEL2 0x18U // DMA Channel Trigger Source Select Register-2 + +#define SYSCTL_O_SYNCSELECT 0x0U // Sync Input and Output Select Register +#define SYSCTL_O_ADCSOCOUTSELECT 0x2U // External ADC (Off Chip) SOC Select Register +#define SYSCTL_O_SYNCSOCLOCK 0x4U // SYNCSEL and EXTADCSOC Select Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DEVCFGLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_DEVCFGLOCK1_CPUSEL0 0x1U // Lock bit for CPUSEL0 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL1 0x2U // Lock bit for CPUSEL1 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL2 0x4U // Lock bit for CPUSEL2 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL3 0x8U // Lock bit for CPUSEL3 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL4 0x10U // Lock bit for CPUSEL4 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL5 0x20U // Lock bit for CPUSEL5 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL6 0x40U // Lock bit for CPUSEL6 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL7 0x80U // Lock bit for CPUSEL7 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL8 0x100U // Lock bit for CPUSEL8 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL9 0x200U // Lock bit for CPUSEL9 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL10 0x400U // Lock bit for CPUSEL10 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL11 0x800U // Lock bit for CPUSEL11 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL12 0x1000U // Lock bit for CPUSEL12 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL13 0x2000U // Lock bit for CPUSEL13 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL14 0x4000U // Lock bit for CPUSEL14 register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PARTIDL register +// +//************************************************************************************************* +#define SYSCTL_PARTIDL_QUAL_S 6U +#define SYSCTL_PARTIDL_QUAL_M 0xC0U // Qualification Status +#define SYSCTL_PARTIDL_PIN_COUNT_S 8U +#define SYSCTL_PARTIDL_PIN_COUNT_M 0x700U // Device Pin Count +#define SYSCTL_PARTIDL_INSTASPIN_S 13U +#define SYSCTL_PARTIDL_INSTASPIN_M 0x6000U // Motorware feature set +#define SYSCTL_PARTIDL_FLASH_SIZE_S 16U +#define SYSCTL_PARTIDL_FLASH_SIZE_M 0xFF0000U // Flash size in KB +#define SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_S 28U +#define SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_M 0xF0000000U // Revision of the PARTID format + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PARTIDH register +// +//************************************************************************************************* +#define SYSCTL_PARTIDH_FAMILY_S 8U +#define SYSCTL_PARTIDH_FAMILY_M 0xFF00U // Device family +#define SYSCTL_PARTIDH_PARTNO_S 16U +#define SYSCTL_PARTIDH_PARTNO_M 0xFF0000U // Device part number +#define SYSCTL_PARTIDH_DEVICE_CLASS_ID_S 24U +#define SYSCTL_PARTIDH_DEVICE_CLASS_ID_M 0xFF000000U // Device class ID + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC0 register +// +//************************************************************************************************* +#define SYSCTL_DC0_SINGLE_CORE 0x1U // Single Core vs Dual Core + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC1 register +// +//************************************************************************************************* +#define SYSCTL_DC1_CPU1_FPU_TMU 0x1U // CPU1's FPU1+TMU1 +#define SYSCTL_DC1_CPU2_FPU_TMU 0x2U // CPU2's FPU2+TMU2 +#define SYSCTL_DC1_CPU1_VCU 0x4U // CPU1's VCU +#define SYSCTL_DC1_CPU2_VCU 0x8U // CPU2's VCU +#define SYSCTL_DC1_CPU1_CLA1 0x40U // CPU1.CLA1 +#define SYSCTL_DC1_CPU2_CLA1 0x100U // CPU2.CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC2 register +// +//************************************************************************************************* +#define SYSCTL_DC2_EMIF1 0x1U // EMIF1 +#define SYSCTL_DC2_EMIF2 0x2U // EMIF2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC3 register +// +//************************************************************************************************* +#define SYSCTL_DC3_EPWM1 0x1U // EPWM1 +#define SYSCTL_DC3_EPWM2 0x2U // EPWM2 +#define SYSCTL_DC3_EPWM3 0x4U // EPWM3 +#define SYSCTL_DC3_EPWM4 0x8U // EPWM4 +#define SYSCTL_DC3_EPWM5 0x10U // EPWM5 +#define SYSCTL_DC3_EPWM6 0x20U // EPWM6 +#define SYSCTL_DC3_EPWM7 0x40U // EPWM7 +#define SYSCTL_DC3_EPWM8 0x80U // EPWM8 +#define SYSCTL_DC3_EPWM9 0x100U // EPWM9 +#define SYSCTL_DC3_EPWM10 0x200U // EPWM10 +#define SYSCTL_DC3_EPWM11 0x400U // EPWM11 +#define SYSCTL_DC3_EPWM12 0x800U // EPWM12 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC4 register +// +//************************************************************************************************* +#define SYSCTL_DC4_ECAP1 0x1U // ECAP1 +#define SYSCTL_DC4_ECAP2 0x2U // ECAP2 +#define SYSCTL_DC4_ECAP3 0x4U // ECAP3 +#define SYSCTL_DC4_ECAP4 0x8U // ECAP4 +#define SYSCTL_DC4_ECAP5 0x10U // ECAP5 +#define SYSCTL_DC4_ECAP6 0x20U // ECAP6 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC5 register +// +//************************************************************************************************* +#define SYSCTL_DC5_EQEP1 0x1U // EQEP1 +#define SYSCTL_DC5_EQEP2 0x2U // EQEP2 +#define SYSCTL_DC5_EQEP3 0x4U // EQEP3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC6 register +// +//************************************************************************************************* +#define SYSCTL_DC6_CLB1 0x1U // CLB1 +#define SYSCTL_DC6_CLB2 0x2U // CLB2 +#define SYSCTL_DC6_CLB3 0x4U // CLB3 +#define SYSCTL_DC6_CLB4 0x8U // CLB4 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC7 register +// +//************************************************************************************************* +#define SYSCTL_DC7_SD1 0x1U // SD1 +#define SYSCTL_DC7_SD2 0x2U // SD2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC8 register +// +//************************************************************************************************* +#define SYSCTL_DC8_SCI_A 0x1U // SCI_A +#define SYSCTL_DC8_SCI_B 0x2U // SCI_B +#define SYSCTL_DC8_SCI_C 0x4U // SCI_C +#define SYSCTL_DC8_SCI_D 0x8U // SCI_D + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC9 register +// +//************************************************************************************************* +#define SYSCTL_DC9_SPI_A 0x1U // SPI_A +#define SYSCTL_DC9_SPI_B 0x2U // SPI_B +#define SYSCTL_DC9_SPI_C 0x4U // SPI_C + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC10 register +// +//************************************************************************************************* +#define SYSCTL_DC10_I2C_A 0x1U // I2C_A +#define SYSCTL_DC10_I2C_B 0x2U // I2C_B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC11 register +// +//************************************************************************************************* +#define SYSCTL_DC11_CAN_A 0x1U // CAN_A +#define SYSCTL_DC11_CAN_B 0x2U // CAN_B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC12 register +// +//************************************************************************************************* +#define SYSCTL_DC12_MCBSP_A 0x1U // McBSP_A +#define SYSCTL_DC12_MCBSP_B 0x2U // McBSP_B +#define SYSCTL_DC12_USB_A_S 16U +#define SYSCTL_DC12_USB_A_M 0x30000U // Decides the capability of the USB_A Module + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC13 register +// +//************************************************************************************************* +#define SYSCTL_DC13_UPP_A 0x1U // uPP_A + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC14 register +// +//************************************************************************************************* +#define SYSCTL_DC14_ADC_A 0x1U // ADC_A +#define SYSCTL_DC14_ADC_B 0x2U // ADC_B +#define SYSCTL_DC14_ADC_C 0x4U // ADC_C +#define SYSCTL_DC14_ADC_D 0x8U // ADC_D + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC15 register +// +//************************************************************************************************* +#define SYSCTL_DC15_CMPSS1 0x1U // CMPSS1 +#define SYSCTL_DC15_CMPSS2 0x2U // CMPSS2 +#define SYSCTL_DC15_CMPSS3 0x4U // CMPSS3 +#define SYSCTL_DC15_CMPSS4 0x8U // CMPSS4 +#define SYSCTL_DC15_CMPSS5 0x10U // CMPSS5 +#define SYSCTL_DC15_CMPSS6 0x20U // CMPSS6 +#define SYSCTL_DC15_CMPSS7 0x40U // CMPSS7 +#define SYSCTL_DC15_CMPSS8 0x80U // CMPSS8 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC17 register +// +//************************************************************************************************* +#define SYSCTL_DC17_DAC_A 0x10000U // Buffered-DAC_A +#define SYSCTL_DC17_DAC_B 0x20000U // Buffered-DAC_B +#define SYSCTL_DC17_DAC_C 0x40000U // Buffered-DAC_C + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC18 register +// +//************************************************************************************************* +#define SYSCTL_DC18_LS0_1 0x1U // LS0_1 +#define SYSCTL_DC18_LS1_1 0x2U // LS1_1 +#define SYSCTL_DC18_LS2_1 0x4U // LS2_1 +#define SYSCTL_DC18_LS3_1 0x8U // LS3_1 +#define SYSCTL_DC18_LS4_1 0x10U // LS4_1 +#define SYSCTL_DC18_LS5_1 0x20U // LS5_1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC19 register +// +//************************************************************************************************* +#define SYSCTL_DC19_LS0_2 0x1U // LS0_2 +#define SYSCTL_DC19_LS1_2 0x2U // LS1_2 +#define SYSCTL_DC19_LS2_2 0x4U // LS2_2 +#define SYSCTL_DC19_LS3_2 0x8U // LS3_2 +#define SYSCTL_DC19_LS4_2 0x10U // LS4_2 +#define SYSCTL_DC19_LS5_2 0x20U // LS5_2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC20 register +// +//************************************************************************************************* +#define SYSCTL_DC20_GS0 0x1U // GS0 +#define SYSCTL_DC20_GS1 0x2U // GS1 +#define SYSCTL_DC20_GS2 0x4U // GS2 +#define SYSCTL_DC20_GS3 0x8U // GS3 +#define SYSCTL_DC20_GS4 0x10U // GS4 +#define SYSCTL_DC20_GS5 0x20U // GS5 +#define SYSCTL_DC20_GS6 0x40U // GS6 +#define SYSCTL_DC20_GS7 0x80U // GS7 +#define SYSCTL_DC20_GS8 0x100U // GS8 +#define SYSCTL_DC20_GS9 0x200U // GS9 +#define SYSCTL_DC20_GS10 0x400U // GS10 +#define SYSCTL_DC20_GS11 0x800U // GS11 +#define SYSCTL_DC20_GS12 0x1000U // GS12 +#define SYSCTL_DC20_GS13 0x2000U // GS13 +#define SYSCTL_DC20_GS14 0x4000U // GS14 +#define SYSCTL_DC20_GS15 0x8000U // GS15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCNF1 register +// +//************************************************************************************************* +#define SYSCTL_PERCNF1_ADC_A_MODE 0x1U // ADC_A mode setting bit +#define SYSCTL_PERCNF1_ADC_B_MODE 0x2U // ADC_B mode setting bit +#define SYSCTL_PERCNF1_ADC_C_MODE 0x4U // ADC_C mode setting bit +#define SYSCTL_PERCNF1_ADC_D_MODE 0x8U // ADC_D mode setting bit +#define SYSCTL_PERCNF1_USB_A_PHY 0x10000U // USB_A_PHY + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FUSEERR register +// +//************************************************************************************************* +#define SYSCTL_FUSEERR_ALERR_S 0U +#define SYSCTL_FUSEERR_ALERR_M 0x1FU // Efuse Autoload Error Status +#define SYSCTL_FUSEERR_ERR 0x20U // Efuse Self Test Error Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES0 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES0_CPU1_CLA1 0x1U // CPU1_CLA1 software reset bit +#define SYSCTL_SOFTPRES0_CPU2_CLA1 0x4U // CPU2_CLA1 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES1 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES1_EMIF1 0x1U // EMIF1 software reset bit +#define SYSCTL_SOFTPRES1_EMIF2 0x2U // EMIF2 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES2 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES2_EPWM1 0x1U // EPWM1 software reset bit +#define SYSCTL_SOFTPRES2_EPWM2 0x2U // EPWM2 software reset bit +#define SYSCTL_SOFTPRES2_EPWM3 0x4U // EPWM3 software reset bit +#define SYSCTL_SOFTPRES2_EPWM4 0x8U // EPWM4 software reset bit +#define SYSCTL_SOFTPRES2_EPWM5 0x10U // EPWM5 software reset bit +#define SYSCTL_SOFTPRES2_EPWM6 0x20U // EPWM6 software reset bit +#define SYSCTL_SOFTPRES2_EPWM7 0x40U // EPWM7 software reset bit +#define SYSCTL_SOFTPRES2_EPWM8 0x80U // EPWM8 software reset bit +#define SYSCTL_SOFTPRES2_EPWM9 0x100U // EPWM9 software reset bit +#define SYSCTL_SOFTPRES2_EPWM10 0x200U // EPWM10 software reset bit +#define SYSCTL_SOFTPRES2_EPWM11 0x400U // EPWM11 software reset bit +#define SYSCTL_SOFTPRES2_EPWM12 0x800U // EPWM12 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES3 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES3_ECAP1 0x1U // ECAP1 software reset bit +#define SYSCTL_SOFTPRES3_ECAP2 0x2U // ECAP2 software reset bit +#define SYSCTL_SOFTPRES3_ECAP3 0x4U // ECAP3 software reset bit +#define SYSCTL_SOFTPRES3_ECAP4 0x8U // ECAP4 software reset bit +#define SYSCTL_SOFTPRES3_ECAP5 0x10U // ECAP5 software reset bit +#define SYSCTL_SOFTPRES3_ECAP6 0x20U // ECAP6 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES4 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES4_EQEP1 0x1U // EQEP1 software reset bit +#define SYSCTL_SOFTPRES4_EQEP2 0x2U // EQEP2 software reset bit +#define SYSCTL_SOFTPRES4_EQEP3 0x4U // EQEP3 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES6 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES6_SD1 0x1U // SD1 software reset bit +#define SYSCTL_SOFTPRES6_SD2 0x2U // SD2 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES7 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES7_SCI_A 0x1U // SCI_A software reset bit +#define SYSCTL_SOFTPRES7_SCI_B 0x2U // SCI_B software reset bit +#define SYSCTL_SOFTPRES7_SCI_C 0x4U // SCI_C software reset bit +#define SYSCTL_SOFTPRES7_SCI_D 0x8U // SCI_D software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES8 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES8_SPI_A 0x1U // SPI_A software reset bit +#define SYSCTL_SOFTPRES8_SPI_B 0x2U // SPI_B software reset bit +#define SYSCTL_SOFTPRES8_SPI_C 0x4U // SPI_C software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES9 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES9_I2C_A 0x1U // I2C_A software reset bit +#define SYSCTL_SOFTPRES9_I2C_B 0x2U // I2C_B software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES11 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES11_MCBSP_A 0x1U // McBSP_A software reset bit +#define SYSCTL_SOFTPRES11_MCBSP_B 0x2U // McBSP_B software reset bit +#define SYSCTL_SOFTPRES11_USB_A 0x10000U // USB_A software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES13 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES13_ADC_A 0x1U // ADC_A software reset bit +#define SYSCTL_SOFTPRES13_ADC_B 0x2U // ADC_B software reset bit +#define SYSCTL_SOFTPRES13_ADC_C 0x4U // ADC_C software reset bit +#define SYSCTL_SOFTPRES13_ADC_D 0x8U // ADC_D software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES14 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES14_CMPSS1 0x1U // CMPSS1 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS2 0x2U // CMPSS2 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS3 0x4U // CMPSS3 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS4 0x8U // CMPSS4 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS5 0x10U // CMPSS5 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS6 0x20U // CMPSS6 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS7 0x40U // CMPSS7 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS8 0x80U // CMPSS8 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES16 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES16_DAC_A 0x10000U // Buffered_DAC_A software reset bit +#define SYSCTL_SOFTPRES16_DAC_B 0x20000U // Buffered_DAC_B software reset bit +#define SYSCTL_SOFTPRES16_DAC_C 0x40000U // Buffered_DAC_C software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL0 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL0_EPWM1 0x1U // EPWM1 CPU select bit +#define SYSCTL_CPUSEL0_EPWM2 0x2U // EPWM2 CPU select bit +#define SYSCTL_CPUSEL0_EPWM3 0x4U // EPWM3 CPU select bit +#define SYSCTL_CPUSEL0_EPWM4 0x8U // EPWM4 CPU select bit +#define SYSCTL_CPUSEL0_EPWM5 0x10U // EPWM5 CPU select bit +#define SYSCTL_CPUSEL0_EPWM6 0x20U // EPWM6 CPU select bit +#define SYSCTL_CPUSEL0_EPWM7 0x40U // EPWM7 CPU select bit +#define SYSCTL_CPUSEL0_EPWM8 0x80U // EPWM8 CPU select bit +#define SYSCTL_CPUSEL0_EPWM9 0x100U // EPWM9 CPU select bit +#define SYSCTL_CPUSEL0_EPWM10 0x200U // EPWM10 CPU select bit +#define SYSCTL_CPUSEL0_EPWM11 0x400U // EPWM11 CPU select bit +#define SYSCTL_CPUSEL0_EPWM12 0x800U // EPWM12 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL1 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL1_ECAP1 0x1U // ECAP1 CPU select bit +#define SYSCTL_CPUSEL1_ECAP2 0x2U // ECAP2 CPU select bit +#define SYSCTL_CPUSEL1_ECAP3 0x4U // ECAP3 CPU select bit +#define SYSCTL_CPUSEL1_ECAP4 0x8U // ECAP4 CPU select bit +#define SYSCTL_CPUSEL1_ECAP5 0x10U // ECAP5 CPU select bit +#define SYSCTL_CPUSEL1_ECAP6 0x20U // ECAP6 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL2 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL2_EQEP1 0x1U // EQEP1 CPU select bit +#define SYSCTL_CPUSEL2_EQEP2 0x2U // EQEP2 CPU select bit +#define SYSCTL_CPUSEL2_EQEP3 0x4U // EQEP3 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL4 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL4_SD1 0x1U // SD1 CPU select bit +#define SYSCTL_CPUSEL4_SD2 0x2U // SD2 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL5 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL5_SCI_A 0x1U // SCI_A CPU select bit +#define SYSCTL_CPUSEL5_SCI_B 0x2U // SCI_B CPU select bit +#define SYSCTL_CPUSEL5_SCI_C 0x4U // SCI_C CPU select bit +#define SYSCTL_CPUSEL5_SCI_D 0x8U // SCI_D CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL6 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL6_SPI_A 0x1U // SPI_A CPU select bit +#define SYSCTL_CPUSEL6_SPI_B 0x2U // SPI_B CPU select bit +#define SYSCTL_CPUSEL6_SPI_C 0x4U // SPI_C CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL7 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL7_I2C_A 0x1U // I2C_A CPU select bit +#define SYSCTL_CPUSEL7_I2C_B 0x2U // I2C_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL8 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL8_CAN_A 0x1U // CAN_A CPU select bit +#define SYSCTL_CPUSEL8_CAN_B 0x2U // CAN_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL9 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL9_MCBSP_A 0x1U // McBSP_A CPU select bit +#define SYSCTL_CPUSEL9_MCBSP_B 0x2U // McBSP_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL11 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL11_ADC_A 0x1U // ADC_A CPU select bit +#define SYSCTL_CPUSEL11_ADC_B 0x2U // ADC_B CPU select bit +#define SYSCTL_CPUSEL11_ADC_C 0x4U // ADC_C CPU select bit +#define SYSCTL_CPUSEL11_ADC_D 0x8U // ADC_D CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL12 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL12_CMPSS1 0x1U // CMPSS1 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS2 0x2U // CMPSS2 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS3 0x4U // CMPSS3 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS4 0x8U // CMPSS4 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS5 0x10U // CMPSS5 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS6 0x20U // CMPSS6 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS7 0x40U // CMPSS7 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS8 0x80U // CMPSS8 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL14 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL14_DAC_A 0x10000U // Buffered_DAC_A CPU select bit +#define SYSCTL_CPUSEL14_DAC_B 0x20000U // Buffered_DAC_B CPU select bit +#define SYSCTL_CPUSEL14_DAC_C 0x40000U // Buffered_DAC_C CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPU2RESCTL register +// +//************************************************************************************************* +#define SYSCTL_CPU2RESCTL_RESET 0x1U // CPU2 Reset Control bit +#define SYSCTL_CPU2RESCTL_KEY_S 16U +#define SYSCTL_CPU2RESCTL_KEY_M 0xFFFF0000U // Key Qualifier for writes to this register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RSTSTAT register +// +//************************************************************************************************* +#define SYSCTL_RSTSTAT_CPU2RES 0x1U // CPU2 Reset Status bit +#define SYSCTL_RSTSTAT_CPU2NMIWDRST 0x2U // Indicates whether a CPU2.NMIWD reset was issued + // to CPU2 +#define SYSCTL_RSTSTAT_CPU2HWBISTRST0 0x4U // Indicates whether a HWBIST reset was issued to + // CPU2 +#define SYSCTL_RSTSTAT_CPU2HWBISTRST1 0x8U // Indicates whether a HWBIST reset was issued to + // CPU2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LPMSTAT register +// +//************************************************************************************************* +#define SYSCTL_LPMSTAT_CPU2LPMSTAT_S 0U +#define SYSCTL_LPMSTAT_CPU2LPMSTAT_M 0x3U // CPU2 LPM Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSDBGCTL register +// +//************************************************************************************************* +#define SYSCTL_SYSDBGCTL_BIT_0 0x1U // Used in PLL startup. Only reset by POR. + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSEM register +// +//************************************************************************************************* +#define SYSCTL_CLKSEM_SEM_S 0U +#define SYSCTL_CLKSEM_SEM_M 0x3U // Semaphore for CLKCFG Ownership by CPU1 or CPU2 +#define SYSCTL_CLKSEM_KEY_S 16U +#define SYSCTL_CLKSEM_KEY_M 0xFFFF0000U // Key Qualifier for writes to this register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKCFGLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL1 0x1U // Lock bit for CLKSRCCTL1 register +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL2 0x2U // Lock bit for CLKSRCCTL2 register +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL3 0x4U // Lock bit for CLKSRCCTL3 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL1 0x8U // Lock bit for SYSPLLCTL1 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL2 0x10U // Lock bit for SYSPLLCTL2 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL3 0x20U // Lock bit for SYSPLLCTL3 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLMULT 0x40U // Lock bit for SYSPLLMULT register +#define SYSCTL_CLKCFGLOCK1_AUXPLLCTL1 0x80U // Lock bit for AUXPLLCTL1 register +#define SYSCTL_CLKCFGLOCK1_AUXPLLMULT 0x400U // Lock bit for AUXPLLMULT register +#define SYSCTL_CLKCFGLOCK1_SYSCLKDIVSEL 0x800U // Lock bit for SYSCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_AUXCLKDIVSEL 0x1000U // Lock bit for AUXCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_PERCLKDIVSEL 0x2000U // Lock bit for PERCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_LOSPCP 0x8000U // Lock bit for LOSPCP register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL1 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_S 0U +#define SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M 0x3U // OSCCLK Source Select Bit +#define SYSCTL_CLKSRCCTL1_INTOSC2OFF 0x8U // Internal Oscillator 2 Off Bit +#define SYSCTL_CLKSRCCTL1_XTALOFF 0x10U // Crystal (External) Oscillator Off Bit +#define SYSCTL_CLKSRCCTL1_WDHALTI 0x20U // Watchdog HALT Mode Ignore Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL2 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S 0U +#define SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M 0x3U // AUXOSCCLK Source Select Bit +#define SYSCTL_CLKSRCCTL2_CANABCLKSEL_S 2U +#define SYSCTL_CLKSRCCTL2_CANABCLKSEL_M 0xCU // CANA Bit Clock Source Select Bit +#define SYSCTL_CLKSRCCTL2_CANBBCLKSEL_S 4U +#define SYSCTL_CLKSRCCTL2_CANBBCLKSEL_M 0x30U // CANB Bit Clock Source Select Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL3 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL3_XCLKOUTSEL_S 0U +#define SYSCTL_CLKSRCCTL3_XCLKOUTSEL_M 0x7U // XCLKOUT Source Select Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLCTL1 register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLCTL1_PLLEN 0x1U // SYSPLL enable/disable bit +#define SYSCTL_SYSPLLCTL1_PLLCLKEN 0x2U // SYSPLL bypassed or included in the PLLSYSCLK path + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLMULT register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLMULT_IMULT_S 0U +#define SYSCTL_SYSPLLMULT_IMULT_M 0x7FU // SYSPLL Integer Multiplier +#define SYSCTL_SYSPLLMULT_FMULT_S 8U +#define SYSCTL_SYSPLLMULT_FMULT_M 0x300U // SYSPLL Fractional Multiplier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLSTS register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLSTS_LOCKS 0x1U // SYSPLL Lock Status Bit +#define SYSCTL_SYSPLLSTS_SLIPS 0x2U // SYSPLL Slip Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLCTL1 register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLCTL1_PLLEN 0x1U // AUXPLL enable/disable bit +#define SYSCTL_AUXPLLCTL1_PLLCLKEN 0x2U // AUXPLL bypassed or included in the AUXPLLCLK path + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLMULT register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLMULT_IMULT_S 0U +#define SYSCTL_AUXPLLMULT_IMULT_M 0x7FU // AUXPLL Integer Multiplier +#define SYSCTL_AUXPLLMULT_FMULT_S 8U +#define SYSCTL_AUXPLLMULT_FMULT_M 0x300U // AUXPLL Fractional Multiplier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLSTS register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLSTS_LOCKS 0x1U // AUXPLL Lock Status Bit +#define SYSCTL_AUXPLLSTS_SLIPS 0x2U // AUXPLL Slip Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_S 0U +#define SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M 0x3FU // PLLSYSCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_S 0U +#define SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M 0x3U // AUXPLLCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_S 0U +#define SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_M 0x3U // EPWM Clock Divide Select +#define SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV 0x10U // EMIF1 Clock Divide Select +#define SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV 0x40U // EMIF2 Clock Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCLKOUTDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_S 0U +#define SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_M 0x3U // XCLKOUT Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LOSPCP register +// +//************************************************************************************************* +#define SYSCTL_LOSPCP_LSPCLKDIV_S 0U +#define SYSCTL_LOSPCP_LSPCLKDIV_M 0x7U // LSPCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCDCR register +// +//************************************************************************************************* +#define SYSCTL_MCDCR_MCLKSTS 0x1U // Missing Clock Status Bit +#define SYSCTL_MCDCR_MCLKCLR 0x2U // Missing Clock Clear Bit +#define SYSCTL_MCDCR_MCLKOFF 0x4U // Missing Clock Detect Off Bit +#define SYSCTL_MCDCR_OSCOFF 0x8U // Oscillator Clock Off Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the X1CNT register +// +//************************************************************************************************* +#define SYSCTL_X1CNT_X1CNT_S 0U +#define SYSCTL_X1CNT_X1CNT_M 0x3FFU // X1 Counter + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSYSLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_CPUSYSLOCK1_HIBBOOTMODE 0x1U // Lock bit for HIBBOOTMODE register +#define SYSCTL_CPUSYSLOCK1_IORESTOREADDR 0x2U // Lock bit for IORESTOREADDR Register +#define SYSCTL_CPUSYSLOCK1_PIEVERRADDR 0x4U // Lock bit for PIEVERRADDR Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR0 0x8U // Lock bit for PCLKCR0 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR1 0x10U // Lock bit for PCLKCR1 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR2 0x20U // Lock bit for PCLKCR2 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR3 0x40U // Lock bit for PCLKCR3 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR4 0x80U // Lock bit for PCLKCR4 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR5 0x100U // Lock bit for PCLKCR5 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR6 0x200U // Lock bit for PCLKCR6 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR7 0x400U // Lock bit for PCLKCR7 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR8 0x800U // Lock bit for PCLKCR8 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR9 0x1000U // Lock bit for PCLKCR9 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR10 0x2000U // Lock bit for PCLKCR10 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR11 0x4000U // Lock bit for PCLKCR11 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR12 0x8000U // Lock bit for PCLKCR12 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR13 0x10000U // Lock bit for PCLKCR13 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR14 0x20000U // Lock bit for PCLKCR14 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR15 0x40000U // Lock bit for PCLKCR15 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR16 0x80000U // Lock bit for PCLKCR16 Register +#define SYSCTL_CPUSYSLOCK1_SECMSEL 0x100000U // Lock bit for SECMSEL Register +#define SYSCTL_CPUSYSLOCK1_LPMCR 0x200000U // Lock bit for LPMCR Register +#define SYSCTL_CPUSYSLOCK1_GPIOLPMSEL0 0x400000U // Lock bit for GPIOLPMSEL0 Register +#define SYSCTL_CPUSYSLOCK1_GPIOLPMSEL1 0x800000U // Lock bit for GPIOLPMSEL1 Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IORESTOREADDR register +// +//************************************************************************************************* +#define SYSCTL_IORESTOREADDR_ADDR_S 0U +#define SYSCTL_IORESTOREADDR_ADDR_M 0x3FFFFFU // restoreIO() routine address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEVERRADDR register +// +//************************************************************************************************* +#define SYSCTL_PIEVERRADDR_ADDR_S 0U +#define SYSCTL_PIEVERRADDR_ADDR_M 0x3FFFFFU // PIE Vector Fetch Error Handler Routine Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR0 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR0_CLA1 0x1U // CLA1 Clock Enable Bit +#define SYSCTL_PCLKCR0_DMA 0x4U // DMA Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER0 0x8U // CPUTIMER0 Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER1 0x10U // CPUTIMER1 Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER2 0x20U // CPUTIMER2 Clock Enable bit +#define SYSCTL_PCLKCR0_HRPWM 0x10000U // HRPWM Clock Enable Bit +#define SYSCTL_PCLKCR0_TBCLKSYNC 0x40000U // EPWM Time Base Clock sync +#define SYSCTL_PCLKCR0_GTBCLKSYNC 0x80000U // EPWM Time Base Clock Global sync + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR1 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR1_EMIF1 0x1U // EMIF1 Clock Enable bit +#define SYSCTL_PCLKCR1_EMIF2 0x2U // EMIF2 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR2 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR2_EPWM1 0x1U // EPWM1 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM2 0x2U // EPWM2 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM3 0x4U // EPWM3 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM4 0x8U // EPWM4 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM5 0x10U // EPWM5 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM6 0x20U // EPWM6 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM7 0x40U // EPWM7 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM8 0x80U // EPWM8 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM9 0x100U // EPWM9 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM10 0x200U // EPWM10 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM11 0x400U // EPWM11 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM12 0x800U // EPWM12 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR3 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR3_ECAP1 0x1U // ECAP1 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP2 0x2U // ECAP2 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP3 0x4U // ECAP3 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP4 0x8U // ECAP4 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP5 0x10U // ECAP5 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP6 0x20U // ECAP6 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR4 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR4_EQEP1 0x1U // EQEP1 Clock Enable bit +#define SYSCTL_PCLKCR4_EQEP2 0x2U // EQEP2 Clock Enable bit +#define SYSCTL_PCLKCR4_EQEP3 0x4U // EQEP3 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR6 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR6_SD1 0x1U // SD1 Clock Enable bit +#define SYSCTL_PCLKCR6_SD2 0x2U // SD2 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR7 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR7_SCI_A 0x1U // SCI_A Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_B 0x2U // SCI_B Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_C 0x4U // SCI_C Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_D 0x8U // SCI_D Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR8 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR8_SPI_A 0x1U // SPI_A Clock Enable bit +#define SYSCTL_PCLKCR8_SPI_B 0x2U // SPI_B Clock Enable bit +#define SYSCTL_PCLKCR8_SPI_C 0x4U // SPI_C Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR9 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR9_I2C_A 0x1U // I2C_A Clock Enable bit +#define SYSCTL_PCLKCR9_I2C_B 0x2U // I2C_B Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR10 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR10_CAN_A 0x1U // CAN_A Clock Enable bit +#define SYSCTL_PCLKCR10_CAN_B 0x2U // CAN_B Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR11 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR11_MCBSP_A 0x1U // McBSP_A Clock Enable bit +#define SYSCTL_PCLKCR11_MCBSP_B 0x2U // McBSP_B Clock Enable bit +#define SYSCTL_PCLKCR11_USB_A 0x10000U // USB_A Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR12 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR12_UPP_A 0x1U // uPP_A Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR13 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR13_ADC_A 0x1U // ADC_A Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_B 0x2U // ADC_B Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_C 0x4U // ADC_C Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_D 0x8U // ADC_D Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR14 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR14_CMPSS1 0x1U // CMPSS1 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS2 0x2U // CMPSS2 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS3 0x4U // CMPSS3 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS4 0x8U // CMPSS4 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS5 0x10U // CMPSS5 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS6 0x20U // CMPSS6 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS7 0x40U // CMPSS7 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS8 0x80U // CMPSS8 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR16 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR16_DAC_A 0x10000U // Buffered_DAC_A Clock Enable Bit +#define SYSCTL_PCLKCR16_DAC_B 0x20000U // Buffered_DAC_B Clock Enable Bit +#define SYSCTL_PCLKCR16_DAC_C 0x40000U // Buffered_DAC_C Clock Enable Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SECMSEL register +// +//************************************************************************************************* +#define SYSCTL_SECMSEL_PF1SEL_S 0U +#define SYSCTL_SECMSEL_PF1SEL_M 0x3U // Secondary Master Select for VBUS32_1 Bridge +#define SYSCTL_SECMSEL_PF2SEL_S 2U +#define SYSCTL_SECMSEL_PF2SEL_M 0xCU // Secondary Master Select for VBUS32_2 Bridge + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LPMCR register +// +//************************************************************************************************* +#define SYSCTL_LPMCR_LPM_S 0U +#define SYSCTL_LPMCR_LPM_M 0x3U // Low Power Mode setting +#define SYSCTL_LPMCR_QUALSTDBY_S 2U +#define SYSCTL_LPMCR_QUALSTDBY_M 0xFCU // STANDBY Wakeup Pin Qualification Setting +#define SYSCTL_LPMCR_WDINTE 0x8000U // Enable for WDINT wakeup from STANDBY +#define SYSCTL_LPMCR_M0M1MODE_S 16U +#define SYSCTL_LPMCR_M0M1MODE_M 0x30000U // Configuration for M0 and M1 mode during HIB +#define SYSCTL_LPMCR_IOISODIS 0x80000000U // IO Isolation Disable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPIOLPMSEL0 register +// +//************************************************************************************************* +#define SYSCTL_GPIOLPMSEL0_GPIO0 0x1U // GPIO0 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO1 0x2U // GPIO1 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO2 0x4U // GPIO2 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO3 0x8U // GPIO3 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO4 0x10U // GPIO4 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO5 0x20U // GPIO5 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO6 0x40U // GPIO6 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO7 0x80U // GPIO7 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO8 0x100U // GPIO8 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO9 0x200U // GPIO9 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO10 0x400U // GPIO10 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO11 0x800U // GPIO11 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO12 0x1000U // GPIO12 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO13 0x2000U // GPIO13 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO14 0x4000U // GPIO14 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO15 0x8000U // GPIO15 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO16 0x10000U // GPIO16 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO17 0x20000U // GPIO17 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO18 0x40000U // GPIO18 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO19 0x80000U // GPIO19 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO20 0x100000U // GPIO20 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO21 0x200000U // GPIO21 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO22 0x400000U // GPIO22 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO23 0x800000U // GPIO23 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO24 0x1000000U // GPIO24 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO25 0x2000000U // GPIO25 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO26 0x4000000U // GPIO26 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO27 0x8000000U // GPIO27 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO28 0x10000000U // GPIO28 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO29 0x20000000U // GPIO29 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO30 0x40000000U // GPIO30 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO31 0x80000000U // GPIO31 Enable for LPM Wakeup + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPIOLPMSEL1 register +// +//************************************************************************************************* +#define SYSCTL_GPIOLPMSEL1_GPIO32 0x1U // GPIO32 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO33 0x2U // GPIO33 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO34 0x4U // GPIO34 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO35 0x8U // GPIO35 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO36 0x10U // GPIO36 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO37 0x20U // GPIO37 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO38 0x40U // GPIO38 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO39 0x80U // GPIO39 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO40 0x100U // GPIO40 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO41 0x200U // GPIO41 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO42 0x400U // GPIO42 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO43 0x800U // GPIO43 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO44 0x1000U // GPIO44 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO45 0x2000U // GPIO45 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO46 0x4000U // GPIO46 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO47 0x8000U // GPIO47 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO48 0x10000U // GPIO48 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO49 0x20000U // GPIO49 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO50 0x40000U // GPIO50 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO51 0x80000U // GPIO51 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO52 0x100000U // GPIO52 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO53 0x200000U // GPIO53 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO54 0x400000U // GPIO54 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO55 0x800000U // GPIO55 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO56 0x1000000U // GPIO56 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO57 0x2000000U // GPIO57 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO58 0x4000000U // GPIO58 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO59 0x8000000U // GPIO59 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO60 0x10000000U // GPIO60 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO61 0x20000000U // GPIO61 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO62 0x40000000U // GPIO62 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO63 0x80000000U // GPIO63 Enable for LPM Wakeup + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TMR2CLKCTL register +// +//************************************************************************************************* +#define SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_S 0U +#define SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M 0x7U // CPU Timer 2 Clock Source Select Bit +#define SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_S 3U +#define SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M 0x38U // CPU Timer 2 Clock Pre-Scale Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RESC register +// +//************************************************************************************************* +#define SYSCTL_RESC_POR 0x1U // POR Reset Cause Indication Bit +#define SYSCTL_RESC_XRSN 0x2U // XRSn Reset Cause Indication Bit +#define SYSCTL_RESC_WDRSN 0x4U // WDRSn Reset Cause Indication Bit +#define SYSCTL_RESC_NMIWDRSN 0x8U // NMIWDRSn Reset Cause Indication Bit +#define SYSCTL_RESC_HWBISTN 0x20U // HWBISTn Reset Cause Indication Bit +#define SYSCTL_RESC_HIBRESETN 0x40U // HIBRESETn Reset Cause Indication Bit +#define SYSCTL_RESC_SCCRESETN 0x100U // SCCRESETn Reset Cause Indication Bit +#define SYSCTL_RESC_XRSN_PIN_STATUS 0x40000000U // XRSN Pin Status +#define SYSCTL_RESC_TRSTN_PIN_STATUS 0x80000000U // TRSTn Status + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCSR register +// +//************************************************************************************************* +#define SYSCTL_SCSR_WDOVERRIDE 0x1U // WD Override for WDDIS bit +#define SYSCTL_SCSR_WDENINT 0x2U // WD Interrupt Enable +#define SYSCTL_SCSR_WDINTS 0x4U // WD Interrupt Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDCNTR register +// +//************************************************************************************************* +#define SYSCTL_WDCNTR_WDCNTR_S 0U +#define SYSCTL_WDCNTR_WDCNTR_M 0xFFU // WD Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDKEY register +// +//************************************************************************************************* +#define SYSCTL_WDKEY_WDKEY_S 0U +#define SYSCTL_WDKEY_WDKEY_M 0xFFU // WD KEY + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDCR register +// +//************************************************************************************************* +#define SYSCTL_WDCR_WDPS_S 0U +#define SYSCTL_WDCR_WDPS_M 0x7U // WD Clock Prescalar +#define SYSCTL_WDCR_WDCHK_S 3U +#define SYSCTL_WDCR_WDCHK_M 0x38U // WD Check Bits +#define SYSCTL_WDCR_WDDIS 0x40U // WD Disable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDWCR register +// +//************************************************************************************************* +#define SYSCTL_WDWCR_MIN_S 0U +#define SYSCTL_WDWCR_MIN_M 0xFFU // WD Min Threshold setting for Windowed Watchdog + // functionality +#define SYSCTL_WDWCR_FIRSTKEY 0x100U // First Key Detect Flag + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSELLOCK register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSELLOCK_CLA1TASKSRCSEL1 0x1U // CLA1TASKSRCSEL1 Register Lock bit +#define SYSCTL_CLA1TASKSRCSELLOCK_CLA1TASKSRCSEL2 0x2U // CLA1TASKSRCSEL2 Register Lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSELLOCK register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSELLOCK_DMACHSRCSEL1 0x1U // DMACHSRCSEL1 Register Lock bit +#define SYSCTL_DMACHSRCSELLOCK_DMACHSRCSEL2 0x2U // DMACHSRCSEL2 Register Lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSEL1 register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSEL1_TASK1_S 0U +#define SYSCTL_CLA1TASKSRCSEL1_TASK1_M 0xFFU // Selects the Trigger Source for TASK1 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK2_S 8U +#define SYSCTL_CLA1TASKSRCSEL1_TASK2_M 0xFF00U // Selects the Trigger Source for TASK2 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK3_S 16U +#define SYSCTL_CLA1TASKSRCSEL1_TASK3_M 0xFF0000U // Selects the Trigger Source for TASK3 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK4_S 24U +#define SYSCTL_CLA1TASKSRCSEL1_TASK4_M 0xFF000000U // Selects the Trigger Source for TASK4 of + // CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSEL2 register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSEL2_TASK5_S 0U +#define SYSCTL_CLA1TASKSRCSEL2_TASK5_M 0xFFU // Selects the Trigger Source for TASK5 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK6_S 8U +#define SYSCTL_CLA1TASKSRCSEL2_TASK6_M 0xFF00U // Selects the Trigger Source for TASK6 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK7_S 16U +#define SYSCTL_CLA1TASKSRCSEL2_TASK7_M 0xFF0000U // Selects the Trigger Source for TASK7 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK8_S 24U +#define SYSCTL_CLA1TASKSRCSEL2_TASK8_M 0xFF000000U // Selects the Trigger Source for TASK8 of + // CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSEL1 register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSEL1_CH1_S 0U +#define SYSCTL_DMACHSRCSEL1_CH1_M 0xFFU // Selects the Trigger and Sync Source CH1 of DMA +#define SYSCTL_DMACHSRCSEL1_CH2_S 8U +#define SYSCTL_DMACHSRCSEL1_CH2_M 0xFF00U // Selects the Trigger and Sync Source CH2 of DMA +#define SYSCTL_DMACHSRCSEL1_CH3_S 16U +#define SYSCTL_DMACHSRCSEL1_CH3_M 0xFF0000U // Selects the Trigger and Sync Source CH3 of DMA +#define SYSCTL_DMACHSRCSEL1_CH4_S 24U +#define SYSCTL_DMACHSRCSEL1_CH4_M 0xFF000000U // Selects the Trigger and Sync Source CH4 of DMA + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSEL2 register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSEL2_CH5_S 0U +#define SYSCTL_DMACHSRCSEL2_CH5_M 0xFFU // Selects the Trigger and Sync Source CH5 of DMA +#define SYSCTL_DMACHSRCSEL2_CH6_S 8U +#define SYSCTL_DMACHSRCSEL2_CH6_M 0xFF00U // Selects the Trigger and Sync Source CH6 of DMA + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYNCSELECT register +// +//************************************************************************************************* +#define SYSCTL_SYNCSELECT_EPWM4SYNCIN_S 0U +#define SYSCTL_SYNCSELECT_EPWM4SYNCIN_M 0x7U // Selects Sync Input Source for EPWM4 +#define SYSCTL_SYNCSELECT_EPWM7SYNCIN_S 3U +#define SYSCTL_SYNCSELECT_EPWM7SYNCIN_M 0x38U // Selects Sync Input Source for EPWM7 +#define SYSCTL_SYNCSELECT_EPWM10SYNCIN_S 6U +#define SYSCTL_SYNCSELECT_EPWM10SYNCIN_M 0x1C0U // Selects Sync Input Source for EPWM10 +#define SYSCTL_SYNCSELECT_ECAP1SYNCIN_S 9U +#define SYSCTL_SYNCSELECT_ECAP1SYNCIN_M 0xE00U // Selects Sync Input Source for ECAP1 +#define SYSCTL_SYNCSELECT_ECAP4SYNCIN_S 12U +#define SYSCTL_SYNCSELECT_ECAP4SYNCIN_M 0x7000U // Selects Sync Input Source for ECAP4 +#define SYSCTL_SYNCSELECT_SYNCOUT_S 27U +#define SYSCTL_SYNCSELECT_SYNCOUT_M 0x18000000U // Select Syncout Source + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOUTSELECT register +// +//************************************************************************************************* +#define SYSCTL_ADCSOCOUTSELECT_PWM1SOCAEN 0x1U // PWM1SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM2SOCAEN 0x2U // PWM2SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM3SOCAEN 0x4U // PWM3SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM4SOCAEN 0x8U // PWM4SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM5SOCAEN 0x10U // PWM5SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM6SOCAEN 0x20U // PWM6SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM7SOCAEN 0x40U // PWM7SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM8SOCAEN 0x80U // PWM8SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM9SOCAEN 0x100U // PWM9SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM10SOCAEN 0x200U // PWM10SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM11SOCAEN 0x400U // PWM11SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM12SOCAEN 0x800U // PWM12SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM1SOCBEN 0x10000U // PWM1SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM2SOCBEN 0x20000U // PWM2SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM3SOCBEN 0x40000U // PWM3SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM4SOCBEN 0x80000U // PWM4SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM5SOCBEN 0x100000U // PWM5SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM6SOCBEN 0x200000U // PWM6SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM7SOCBEN 0x400000U // PWM7SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM8SOCBEN 0x800000U // PWM8SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM9SOCBEN 0x1000000U // PWM9SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM10SOCBEN 0x2000000U // PWM10SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM11SOCBEN 0x4000000U // PWM11SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM12SOCBEN 0x8000000U // PWM12SOCBEN Enable for ADCSOCBO + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYNCSOCLOCK register +// +//************************************************************************************************* +#define SYSCTL_SYNCSOCLOCK_SYNCSELECT 0x1U // SYNCSEL Register Lock bit +#define SYSCTL_SYNCSOCLOCK_ADCSOCOUTSELECT 0x2U // ADCSOCOUTSELECT Register Lock bit + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_types.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_types.h new file mode 100644 index 0000000..8c1b32d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_types.h @@ -0,0 +1,166 @@ +//########################################################################### +// +// FILE: hw_types.h +// +// TITLE: Type definitions used in driverlib functions. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_TYPES_H +#define HW_TYPES_H + +//***************************************************************************** +// +// Macros for hardware access +// +//***************************************************************************** +#if defined(__TMS320C28XX_CLA__) + #define HWREG(x) \ + (*((volatile uint32_t *)((uintptr_t)(x)))) + #define HWREGH(x) \ + (*((volatile uint16_t *)((uintptr_t)(x)))) +#else + #define HWREG(x) \ + (*((volatile uint32_t *)(x))) + #define HWREGH(x) \ + (*((volatile uint16_t *)(x))) +#endif + +#define HWREG_BP(x) \ + __byte_peripheral_32((uint32_t *)(x)) +#define HWREGB(x) \ + __byte((int *)(x),0) + +//***************************************************************************** +// +// SUCCESS and FAILURE for API return value +// +//***************************************************************************** +#define STATUS_S_SUCCESS (0) +#define STATUS_E_FAILURE (-1) + +//***************************************************************************** +// +// Definition of 8 bit types for USB Driver code to maintain portability +// between byte and word addressable cores of C2000 Devices. +// +//***************************************************************************** +typedef uint16_t uint8_t; +typedef int16_t int8_t; + +//**************************************************************************** +// +// For checking NULL pointers +// +//**************************************************************************** +#ifndef NULL +#define NULL ((void *)0x0) +#endif + +//***************************************************************************** +// +// 32-bit & 64-bit float type +// +//***************************************************************************** +#ifndef C2000_IEEE754_TYPES +#define C2000_IEEE754_TYPES +#ifdef __TI_EABI__ +typedef float float32_t; +typedef double float64_t; +#else // TI COFF +typedef float float32_t; +typedef long double float64_t; +#endif // __TI_EABI__ +#endif // C2000_IEEE754_TYPES + + +//***************************************************************************** +// +// Emulated Bitbanded write +// +//***************************************************************************** +#define HWREGBITW(address, mask, value) \ + (*(volatile uint32_t *)(address)) = \ + ((*(volatile uint32_t *)(address)) & ~((uint32_t)1 << mask)) \ + | ((uint32_t)value << mask) + +#define HWREGBITHW(address, mask, value) \ + (*(volatile uint16_t *)(address)) = \ + ((*(volatile uint16_t *)(address)) & ~((uint16_t)1 << mask)) \ + | ((uint16_t)value << mask) + +//***************************************************************************** +// +// Emulated Bitbanded read +// +//***************************************************************************** +#define HWREGBITR(address, mask) \ + (((*(volatile uint32_t *)(address)) & ((uint32_t)1 << mask)) >> mask) + +#define HWREGBITHR(address, mask) \ + (((*(volatile uint16_t *)(address)) & ((uint16_t)1 << mask)) >> mask) + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// These are provided to satisfy static analysis tools. The #ifndef is required +// because the '&' is for a C++-style reference, and although it is the correct +// prototype, it will not build in C code. +// +//***************************************************************************** +#if(defined(__TMS320C28XX__) || defined(__TMS320C28XX_CLA__)) +#else +extern int16_t &__byte(int16_t *array, uint16_t byte_index); +extern uint32_t &__byte_peripheral_32(uint32_t *x); +#endif + +// +// C++ Bool Compatibility +// +#if defined(__cplusplus) +typedef bool _Bool; +#endif + +/* To fix Misra-C errors */ +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#endif // HW_TYPES_H diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_upp.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_upp.h new file mode 100644 index 0000000..9f73e9b --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_upp.h @@ -0,0 +1,306 @@ +//########################################################################### +// +// FILE: hw_upp.h +// +// TITLE: Definitions for the UPP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_UPP_H +#define HW_UPP_H + +//************************************************************************************************* +// +// The following are defines for the UPP register offsets +// +//************************************************************************************************* +#define UPP_O_PID 0x0U // Peripheral ID Register +#define UPP_O_PERCTL 0x2U // Peripheral Control Register +#define UPP_O_CHCTL 0x8U // General Control Register +#define UPP_O_IFCFG 0xAU // Interface Configuration Register +#define UPP_O_IFIVAL 0xCU // Interface Idle Value Register +#define UPP_O_THCFG 0xEU // Threshold Configuration Register +#define UPP_O_RAWINTST 0x10U // Raw Interrupt Status Register +#define UPP_O_ENINTST 0x12U // Enable Interrupt Status Register +#define UPP_O_INTENSET 0x14U // Interrupt Enable Set Register +#define UPP_O_INTENCLR 0x16U // Interrupt Enable Clear Register +#define UPP_O_CHIDESC0 0x20U // DMA Channel I Descriptor 0 Register +#define UPP_O_CHIDESC1 0x22U // DMA Channel I Descriptor 1 Register +#define UPP_O_CHIDESC2 0x24U // DMA Channel I Descriptor 2 Register +#define UPP_O_CHIST0 0x28U // DMA Channel I Status 0 Register +#define UPP_O_CHIST1 0x2AU // DMA Channel I Status 1 Register +#define UPP_O_CHIST2 0x2CU // DMA Channel I Status 2 Register +#define UPP_O_CHQDESC0 0x30U // DMA Channel Q Descriptor 0 Register +#define UPP_O_CHQDESC1 0x32U // DMA Channel Q Descriptor 1 Register +#define UPP_O_CHQDESC2 0x34U // DMA Channel Q Descriptor 2 Register +#define UPP_O_CHQST0 0x38U // DMA Channel Q Status 0 Register +#define UPP_O_CHQST1 0x3AU // DMA Channel Q Status 1 Register +#define UPP_O_CHQST2 0x3CU // DMA Channel Q Status 2 Register +#define UPP_O_GINTEN 0x40U // Global Peripheral Interrupt Enable Register +#define UPP_O_GINTFLG 0x42U // Global Peripheral Interrupt Flag Register +#define UPP_O_GINTCLR 0x44U // Global Peripheral Interrupt Clear Register +#define UPP_O_DLYCTL 0x46U // IO clock data skew control Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCTL register +// +//************************************************************************************************* +#define UPP_PERCTL_FREE 0x1U // Emulation control. +#define UPP_PERCTL_SOFT 0x2U // Emulation control. +#define UPP_PERCTL_RTEMU 0x4U // Realtime emulation control. +#define UPP_PERCTL_PEREN 0x8U // Peripheral Enable +#define UPP_PERCTL_SOFTRST 0x10U // Software Reset +#define UPP_PERCTL_DMAST 0x80U // DMA Burst transaction status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHCTL register +// +//************************************************************************************************* +#define UPP_CHCTL_MODE_S 0U +#define UPP_CHCTL_MODE_M 0x3U // Operating mode +#define UPP_CHCTL_SDRTXILA 0x8U // SDR TX Interleve mode +#define UPP_CHCTL_DEMUXA 0x10U // DDR de-multiplexing mode +#define UPP_CHCTL_DRA 0x10000U // Data rate + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IFCFG register +// +//************************************************************************************************* +#define UPP_IFCFG_STARTPOLA 0x1U // Polarity of START(SELECT) signal +#define UPP_IFCFG_ENAPOLA 0x2U // Polarity of ENABLE(WRITE) signal +#define UPP_IFCFG_WAITPOLA 0x4U // Polarity of WAIT signal. +#define UPP_IFCFG_STARTA 0x8U // Enable Usage of START (SELECT) signal +#define UPP_IFCFG_ENAA 0x10U // Enable Usage of ENABLE (WRITE) signal +#define UPP_IFCFG_WAITA 0x20U // Enable Usage of WAIT signal +#define UPP_IFCFG_CLKDIVA_S 8U +#define UPP_IFCFG_CLKDIVA_M 0xF00U // Clock divider for tx mode +#define UPP_IFCFG_CLKINVA 0x1000U // Clock inversion +#define UPP_IFCFG_TRISENA 0x2000U // Pin Tri-state Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IFIVAL register +// +//************************************************************************************************* +#define UPP_IFIVAL_VALA_S 0U +#define UPP_IFIVAL_VALA_M 0x1FFU // Idle Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the THCFG register +// +//************************************************************************************************* +#define UPP_THCFG_RDSIZEI_S 0U +#define UPP_THCFG_RDSIZEI_M 0x3U // DMA Read Threshold for DMA Channel I +#define UPP_THCFG_RDSIZEQ_S 8U +#define UPP_THCFG_RDSIZEQ_M 0x300U // DMA Read Threshold for DMA Channel Q +#define UPP_THCFG_TXSIZEA_S 16U +#define UPP_THCFG_TXSIZEA_M 0x30000U // I/O Transmit Threshold Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAWINTST register +// +//************************************************************************************************* +#define UPP_RAWINTST_DPEI 0x1U // Interrupt raw status for DMA programming error +#define UPP_RAWINTST_UOEI 0x2U // Interrupt raw status for DMA under-run or over-run +#define UPP_RAWINTST_EOWI 0x8U // Interrupt raw status for end-of window condition +#define UPP_RAWINTST_EOLI 0x10U // Interrupt raw status for end-of-line condition +#define UPP_RAWINTST_DPEQ 0x100U // Interrupt raw status for DMA programming error +#define UPP_RAWINTST_UOEQ 0x200U // Interrupt raw status for DMA under-run or over-run +#define UPP_RAWINTST_EOWQ 0x800U // Interrupt raw status for end-of window condition +#define UPP_RAWINTST_EOLQ 0x1000U // Interrupt raw status for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ENINTST register +// +//************************************************************************************************* +#define UPP_ENINTST_DPEI 0x1U // Interrupt enable status for DMA programming error +#define UPP_ENINTST_UOEI 0x2U // Interrupt enable status for DMA under-run or over-run +#define UPP_ENINTST_EOWI 0x8U // Interrupt enable status for end-of window condition +#define UPP_ENINTST_EOLI 0x10U // Interrupt enable status for end-of-line condition +#define UPP_ENINTST_DPEQ 0x100U // Interrupt enable status for DMA programming error +#define UPP_ENINTST_UOEQ 0x200U // Interrupt enable status for DMA under-run or over-run +#define UPP_ENINTST_EOWQ 0x800U // Interrupt enable status for end-of window condition +#define UPP_ENINTST_EOLQ 0x1000U // Interrupt enable status for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTENSET register +// +//************************************************************************************************* +#define UPP_INTENSET_DPEI 0x1U // Interrupt enable for DMA programming error +#define UPP_INTENSET_UOEI 0x2U // Interrupt enable for DMA under-run or over-run +#define UPP_INTENSET_EOWI 0x8U // Interrupt enable for end-of window condition +#define UPP_INTENSET_EOLI 0x10U // Interrupt enable for end-of-line condition +#define UPP_INTENSET_DPEQ 0x100U // Interrupt enable for DMA programming error +#define UPP_INTENSET_UOEQ 0x200U // Interrupt enable for DMA under-run or over-run +#define UPP_INTENSET_EOWQ 0x800U // Interrupt enable for end-of window condition +#define UPP_INTENSET_EOLQ 0x1000U // Interrupt enable for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTENCLR register +// +//************************************************************************************************* +#define UPP_INTENCLR_DPEI 0x1U // Interrupt clear for DMA programming error +#define UPP_INTENCLR_UOEI 0x2U // Interrupt clear for DMA under-run or over-run +#define UPP_INTENCLR_EOWI 0x8U // Interrupt clear for end-of window condition +#define UPP_INTENCLR_EOLI 0x10U // Interrupt clear for end-of-line condition +#define UPP_INTENCLR_DPEQ 0x100U // Interrupt clear for DMA programming error +#define UPP_INTENCLR_UOEQ 0x200U // Interrupt clear for DMA under-run or over-run +#define UPP_INTENCLR_EOWQ 0x800U // Interrupt clear for end-of window condition +#define UPP_INTENCLR_EOLQ 0x1000U // Interrupt clear for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIDESC1 register +// +//************************************************************************************************* +#define UPP_CHIDESC1_BCNT_S 0U +#define UPP_CHIDESC1_BCNT_M 0xFFFFU // Number of bytes in a line for DMA Channel I + // transfer. +#define UPP_CHIDESC1_LCNT_S 16U +#define UPP_CHIDESC1_LCNT_M 0xFFFF0000U // Number of lines in a window for DMA Channel I + // transfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIDESC2 register +// +//************************************************************************************************* +#define UPP_CHIDESC2_LOFFSET_S 0U +#define UPP_CHIDESC2_LOFFSET_M 0xFFFFU // Current start address to next start address offset. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIST1 register +// +//************************************************************************************************* +#define UPP_CHIST1_BCNT_S 0U +#define UPP_CHIST1_BCNT_M 0xFFFFU // Current byte number. +#define UPP_CHIST1_LCNT_S 16U +#define UPP_CHIST1_LCNT_M 0xFFFF0000U // Current line number. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIST2 register +// +//************************************************************************************************* +#define UPP_CHIST2_ACT 0x1U // Status of DMA descriptor. +#define UPP_CHIST2_PEND 0x2U // Status of DMA. +#define UPP_CHIST2_WM_S 4U +#define UPP_CHIST2_WM_M 0xF0U // Watermark for FIFO block count for DMA Channel I tranfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQDESC1 register +// +//************************************************************************************************* +#define UPP_CHQDESC1_BCNT_S 0U +#define UPP_CHQDESC1_BCNT_M 0xFFFFU // Number of bytes in a line for DMA Channel Q + // transfer. +#define UPP_CHQDESC1_LCNT_S 16U +#define UPP_CHQDESC1_LCNT_M 0xFFFF0000U // Number of lines in a window for DMA Channel Q + // transfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQDESC2 register +// +//************************************************************************************************* +#define UPP_CHQDESC2_LOFFSET_S 0U +#define UPP_CHQDESC2_LOFFSET_M 0xFFFFU // Current start address to next start address offset. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQST1 register +// +//************************************************************************************************* +#define UPP_CHQST1_BCNT_S 0U +#define UPP_CHQST1_BCNT_M 0xFFFFU // Current byte number. +#define UPP_CHQST1_LCNT_S 16U +#define UPP_CHQST1_LCNT_M 0xFFFF0000U // Current line number. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQST2 register +// +//************************************************************************************************* +#define UPP_CHQST2_ACT 0x1U // Status of DMA descriptor. +#define UPP_CHQST2_PEND 0x2U // Status of DMA. +#define UPP_CHQST2_WM_S 4U +#define UPP_CHQST2_WM_M 0xF0U // Watermark for FIFO block count for DMA Channel Q tranfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTEN register +// +//************************************************************************************************* +#define UPP_GINTEN_GINTEN 0x1U // Global Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTFLG register +// +//************************************************************************************************* +#define UPP_GINTFLG_GINTFLG 0x1U // Global Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTCLR register +// +//************************************************************************************************* +#define UPP_GINTCLR_GINTCLR 0x1U // Global Interrupt Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DLYCTL register +// +//************************************************************************************************* +#define UPP_DLYCTL_DLYDIS 0x1U // IO dealy control disable. +#define UPP_DLYCTL_DLYCTL_S 1U +#define UPP_DLYCTL_DLYCTL_M 0x6U // IO delay control. + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_usb.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_usb.h new file mode 100644 index 0000000..27907eb --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_usb.h @@ -0,0 +1,4614 @@ +//########################################################################### +// +// FILE: hw_usb.h +// +// TITLE: Definitions for the USB registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_USB_H +#define HW_USB_H + +//***************************************************************************** +// +// The following are defines for the Univeral Serial Bus register offsets. +// +//***************************************************************************** +#define USB_O_FADDR 0x00000000 // USB Device Functional Address +#define USB_O_POWER 0x00000001 // USB Power +#define USB_O_TXIS 0x00000002 // USB Transmit Interrupt Status +#define USB_O_RXIS 0x00000004 // USB Receive Interrupt Status +#define USB_O_TXIE 0x00000006 // USB Transmit Interrupt Enable +#define USB_O_RXIE 0x00000008 // USB Receive Interrupt Enable +#define USB_O_IS 0x0000000A // USB General Interrupt Status +#define USB_O_IE 0x0000000B // USB Interrupt Enable +#define USB_O_FRAME 0x0000000C // USB Frame Value +#define USB_O_EPIDX 0x0000000E // USB Endpoint Index +#define USB_O_TEST 0x0000000F // USB Test Mode +#define USB_O_FIFO0 0x00000020 // USB FIFO Endpoint 0 +#define USB_O_FIFO1 0x00000024 // USB FIFO Endpoint 1 +#define USB_O_FIFO2 0x00000028 // USB FIFO Endpoint 2 +#define USB_O_FIFO3 0x0000002C // USB FIFO Endpoint 3 +#define USB_O_FIFO4 0x00000030 // USB FIFO Endpoint 4 +#define USB_O_FIFO5 0x00000034 // USB FIFO Endpoint 5 +#define USB_O_FIFO6 0x00000038 // USB FIFO Endpoint 6 +#define USB_O_FIFO7 0x0000003C // USB FIFO Endpoint 7 +#define USB_O_FIFO8 0x00000040 // USB FIFO Endpoint 8 +#define USB_O_FIFO9 0x00000044 // USB FIFO Endpoint 9 +#define USB_O_FIFO10 0x00000048 // USB FIFO Endpoint 10 +#define USB_O_FIFO11 0x0000004C // USB FIFO Endpoint 11 +#define USB_O_FIFO12 0x00000050 // USB FIFO Endpoint 12 +#define USB_O_FIFO13 0x00000054 // USB FIFO Endpoint 13 +#define USB_O_FIFO14 0x00000058 // USB FIFO Endpoint 14 +#define USB_O_FIFO15 0x0000005C // USB FIFO Endpoint 15 +#define USB_O_DEVCTL 0x00000060 // USB Device Control +#define USB_O_TXFIFOSZ 0x00000062 // USB Transmit Dynamic FIFO Sizing +#define USB_O_RXFIFOSZ 0x00000063 // USB Receive Dynamic FIFO Sizing +#define USB_O_TXFIFOADD 0x00000064 // USB Transmit FIFO Start Address +#define USB_O_RXFIFOADD 0x00000066 // USB Receive FIFO Start Address +#define USB_O_CONTIM 0x0000007A // USB Connect Timing +#define USB_O_VPLEN 0x0000007B // USB OTG VBUS Pulse Timing +#define USB_O_FSEOF 0x0000007D // USB Full-Speed Last Transaction + // to End of Frame Timing +#define USB_O_LSEOF 0x0000007E // USB Low-Speed Last Transaction + // to End of Frame Timing +#define USB_O_TXFUNCADDR0 0x00000080 // USB Transmit Functional Address + // Endpoint 0 +#define USB_O_TXHUBADDR0 0x00000082 // USB Transmit Hub Address + // Endpoint 0 +#define USB_O_TXHUBPORT0 0x00000083 // USB Transmit Hub Port Endpoint 0 +#define USB_O_TXFUNCADDR1 0x00000088 // USB Transmit Functional Address + // Endpoint 1 +#define USB_O_TXHUBADDR1 0x0000008A // USB Transmit Hub Address + // Endpoint 1 +#define USB_O_TXHUBPORT1 0x0000008B // USB Transmit Hub Port Endpoint 1 +#define USB_O_RXFUNCADDR1 0x0000008C // USB Receive Functional Address + // Endpoint 1 +#define USB_O_RXHUBADDR1 0x0000008E // USB Receive Hub Address Endpoint + // 1 +#define USB_O_RXHUBPORT1 0x0000008F // USB Receive Hub Port Endpoint 1 +#define USB_O_TXFUNCADDR2 0x00000090 // USB Transmit Functional Address + // Endpoint 2 +#define USB_O_TXHUBADDR2 0x00000092 // USB Transmit Hub Address + // Endpoint 2 +#define USB_O_TXHUBPORT2 0x00000093 // USB Transmit Hub Port Endpoint 2 +#define USB_O_RXFUNCADDR2 0x00000094 // USB Receive Functional Address + // Endpoint 2 +#define USB_O_RXHUBADDR2 0x00000096 // USB Receive Hub Address Endpoint + // 2 +#define USB_O_RXHUBPORT2 0x00000097 // USB Receive Hub Port Endpoint 2 +#define USB_O_TXFUNCADDR3 0x00000098 // USB Transmit Functional Address + // Endpoint 3 +#define USB_O_TXHUBADDR3 0x0000009A // USB Transmit Hub Address + // Endpoint 3 +#define USB_O_TXHUBPORT3 0x0000009B // USB Transmit Hub Port Endpoint 3 +#define USB_O_RXFUNCADDR3 0x0000009C // USB Receive Functional Address + // Endpoint 3 +#define USB_O_RXHUBADDR3 0x0000009E // USB Receive Hub Address Endpoint + // 3 +#define USB_O_RXHUBPORT3 0x0000009F // USB Receive Hub Port Endpoint 3 +#define USB_O_TXFUNCADDR4 0x000000A0 // USB Transmit Functional Address + // Endpoint 4 +#define USB_O_TXHUBADDR4 0x000000A2 // USB Transmit Hub Address + // Endpoint 4 +#define USB_O_TXHUBPORT4 0x000000A3 // USB Transmit Hub Port Endpoint 4 +#define USB_O_RXFUNCADDR4 0x000000A4 // USB Receive Functional Address + // Endpoint 4 +#define USB_O_RXHUBADDR4 0x000000A6 // USB Receive Hub Address Endpoint + // 4 +#define USB_O_RXHUBPORT4 0x000000A7 // USB Receive Hub Port Endpoint 4 +#define USB_O_TXFUNCADDR5 0x000000A8 // USB Transmit Functional Address + // Endpoint 5 +#define USB_O_TXHUBADDR5 0x000000AA // USB Transmit Hub Address + // Endpoint 5 +#define USB_O_TXHUBPORT5 0x000000AB // USB Transmit Hub Port Endpoint 5 +#define USB_O_RXFUNCADDR5 0x000000AC // USB Receive Functional Address + // Endpoint 5 +#define USB_O_RXHUBADDR5 0x000000AE // USB Receive Hub Address Endpoint + // 5 +#define USB_O_RXHUBPORT5 0x000000AF // USB Receive Hub Port Endpoint 5 +#define USB_O_TXFUNCADDR6 0x000000B0 // USB Transmit Functional Address + // Endpoint 6 +#define USB_O_TXHUBADDR6 0x000000B2 // USB Transmit Hub Address + // Endpoint 6 +#define USB_O_TXHUBPORT6 0x000000B3 // USB Transmit Hub Port Endpoint 6 +#define USB_O_RXFUNCADDR6 0x000000B4 // USB Receive Functional Address + // Endpoint 6 +#define USB_O_RXHUBADDR6 0x000000B6 // USB Receive Hub Address Endpoint + // 6 +#define USB_O_RXHUBPORT6 0x000000B7 // USB Receive Hub Port Endpoint 6 +#define USB_O_TXFUNCADDR7 0x000000B8 // USB Transmit Functional Address + // Endpoint 7 +#define USB_O_TXHUBADDR7 0x000000BA // USB Transmit Hub Address + // Endpoint 7 +#define USB_O_TXHUBPORT7 0x000000BB // USB Transmit Hub Port Endpoint 7 +#define USB_O_RXFUNCADDR7 0x000000BC // USB Receive Functional Address + // Endpoint 7 +#define USB_O_RXHUBADDR7 0x000000BE // USB Receive Hub Address Endpoint + // 7 +#define USB_O_RXHUBPORT7 0x000000BF // USB Receive Hub Port Endpoint 7 +#define USB_O_TXFUNCADDR8 0x000000C0 // USB Transmit Functional Address + // Endpoint 8 +#define USB_O_TXHUBADDR8 0x000000C2 // USB Transmit Hub Address + // Endpoint 8 +#define USB_O_TXHUBPORT8 0x000000C3 // USB Transmit Hub Port Endpoint 8 +#define USB_O_RXFUNCADDR8 0x000000C4 // USB Receive Functional Address + // Endpoint 8 +#define USB_O_RXHUBADDR8 0x000000C6 // USB Receive Hub Address Endpoint + // 8 +#define USB_O_RXHUBPORT8 0x000000C7 // USB Receive Hub Port Endpoint 8 +#define USB_O_TXFUNCADDR9 0x000000C8 // USB Transmit Functional Address + // Endpoint 9 +#define USB_O_TXHUBADDR9 0x000000CA // USB Transmit Hub Address + // Endpoint 9 +#define USB_O_TXHUBPORT9 0x000000CB // USB Transmit Hub Port Endpoint 9 +#define USB_O_RXFUNCADDR9 0x000000CC // USB Receive Functional Address + // Endpoint 9 +#define USB_O_RXHUBADDR9 0x000000CE // USB Receive Hub Address Endpoint + // 9 +#define USB_O_RXHUBPORT9 0x000000CF // USB Receive Hub Port Endpoint 9 +#define USB_O_TXFUNCADDR10 0x000000D0 // USB Transmit Functional Address + // Endpoint 10 +#define USB_O_TXHUBADDR10 0x000000D2 // USB Transmit Hub Address + // Endpoint 10 +#define USB_O_TXHUBPORT10 0x000000D3 // USB Transmit Hub Port Endpoint + // 10 +#define USB_O_RXFUNCADDR10 0x000000D4 // USB Receive Functional Address + // Endpoint 10 +#define USB_O_RXHUBADDR10 0x000000D6 // USB Receive Hub Address Endpoint + // 10 +#define USB_O_RXHUBPORT10 0x000000D7 // USB Receive Hub Port Endpoint 10 +#define USB_O_TXFUNCADDR11 0x000000D8 // USB Transmit Functional Address + // Endpoint 11 +#define USB_O_TXHUBADDR11 0x000000DA // USB Transmit Hub Address + // Endpoint 11 +#define USB_O_TXHUBPORT11 0x000000DB // USB Transmit Hub Port Endpoint + // 11 +#define USB_O_RXFUNCADDR11 0x000000DC // USB Receive Functional Address + // Endpoint 11 +#define USB_O_RXHUBADDR11 0x000000DE // USB Receive Hub Address Endpoint + // 11 +#define USB_O_RXHUBPORT11 0x000000DF // USB Receive Hub Port Endpoint 11 +#define USB_O_TXFUNCADDR12 0x000000E0 // USB Transmit Functional Address + // Endpoint 12 +#define USB_O_TXHUBADDR12 0x000000E2 // USB Transmit Hub Address + // Endpoint 12 +#define USB_O_TXHUBPORT12 0x000000E3 // USB Transmit Hub Port Endpoint + // 12 +#define USB_O_RXFUNCADDR12 0x000000E4 // USB Receive Functional Address + // Endpoint 12 +#define USB_O_RXHUBADDR12 0x000000E6 // USB Receive Hub Address Endpoint + // 12 +#define USB_O_RXHUBPORT12 0x000000E7 // USB Receive Hub Port Endpoint 12 +#define USB_O_TXFUNCADDR13 0x000000E8 // USB Transmit Functional Address + // Endpoint 13 +#define USB_O_TXHUBADDR13 0x000000EA // USB Transmit Hub Address + // Endpoint 13 +#define USB_O_TXHUBPORT13 0x000000EB // USB Transmit Hub Port Endpoint + // 13 +#define USB_O_RXFUNCADDR13 0x000000EC // USB Receive Functional Address + // Endpoint 13 +#define USB_O_RXHUBADDR13 0x000000EE // USB Receive Hub Address Endpoint + // 13 +#define USB_O_RXHUBPORT13 0x000000EF // USB Receive Hub Port Endpoint 13 +#define USB_O_TXFUNCADDR14 0x000000F0 // USB Transmit Functional Address + // Endpoint 14 +#define USB_O_TXHUBADDR14 0x000000F2 // USB Transmit Hub Address + // Endpoint 14 +#define USB_O_TXHUBPORT14 0x000000F3 // USB Transmit Hub Port Endpoint + // 14 +#define USB_O_RXFUNCADDR14 0x000000F4 // USB Receive Functional Address + // Endpoint 14 +#define USB_O_RXHUBADDR14 0x000000F6 // USB Receive Hub Address Endpoint + // 14 +#define USB_O_RXHUBPORT14 0x000000F7 // USB Receive Hub Port Endpoint 14 +#define USB_O_TXFUNCADDR15 0x000000F8 // USB Transmit Functional Address + // Endpoint 15 +#define USB_O_TXHUBADDR15 0x000000FA // USB Transmit Hub Address + // Endpoint 15 +#define USB_O_TXHUBPORT15 0x000000FB // USB Transmit Hub Port Endpoint + // 15 +#define USB_O_RXFUNCADDR15 0x000000FC // USB Receive Functional Address + // Endpoint 15 +#define USB_O_RXHUBADDR15 0x000000FE // USB Receive Hub Address Endpoint + // 15 +#define USB_O_RXHUBPORT15 0x000000FF // USB Receive Hub Port Endpoint 15 +#define USB_O_CSRL0 0x00000102 // USB Control and Status Endpoint + // 0 Low +#define USB_O_CSRH0 0x00000103 // USB Control and Status Endpoint + // 0 High +#define USB_O_COUNT0 0x00000108 // USB Receive Byte Count Endpoint + // 0 +#define USB_O_TYPE0 0x0000010A // USB Type Endpoint 0 +#define USB_O_NAKLMT 0x0000010B // USB NAK Limit +#define USB_O_TXMAXP1 0x00000110 // USB Maximum Transmit Data + // Endpoint 1 +#define USB_O_TXCSRL1 0x00000112 // USB Transmit Control and Status + // Endpoint 1 Low +#define USB_O_TXCSRH1 0x00000113 // USB Transmit Control and Status + // Endpoint 1 High +#define USB_O_RXMAXP1 0x00000114 // USB Maximum Receive Data + // Endpoint 1 +#define USB_O_RXCSRL1 0x00000116 // USB Receive Control and Status + // Endpoint 1 Low +#define USB_O_RXCSRH1 0x00000117 // USB Receive Control and Status + // Endpoint 1 High +#define USB_O_RXCOUNT1 0x00000118 // USB Receive Byte Count Endpoint + // 1 +#define USB_O_TXTYPE1 0x0000011A // USB Host Transmit Configure Type + // Endpoint 1 +#define USB_O_TXINTERVAL1 0x0000011B // USB Host Transmit Interval + // Endpoint 1 +#define USB_O_RXTYPE1 0x0000011C // USB Host Configure Receive Type + // Endpoint 1 +#define USB_O_RXINTERVAL1 0x0000011D // USB Host Receive Polling + // Interval Endpoint 1 +#define USB_O_TXMAXP2 0x00000120 // USB Maximum Transmit Data + // Endpoint 2 +#define USB_O_TXCSRL2 0x00000122 // USB Transmit Control and Status + // Endpoint 2 Low +#define USB_O_TXCSRH2 0x00000123 // USB Transmit Control and Status + // Endpoint 2 High +#define USB_O_RXMAXP2 0x00000124 // USB Maximum Receive Data + // Endpoint 2 +#define USB_O_RXCSRL2 0x00000126 // USB Receive Control and Status + // Endpoint 2 Low +#define USB_O_RXCSRH2 0x00000127 // USB Receive Control and Status + // Endpoint 2 High +#define USB_O_RXCOUNT2 0x00000128 // USB Receive Byte Count Endpoint + // 2 +#define USB_O_TXTYPE2 0x0000012A // USB Host Transmit Configure Type + // Endpoint 2 +#define USB_O_TXINTERVAL2 0x0000012B // USB Host Transmit Interval + // Endpoint 2 +#define USB_O_RXTYPE2 0x0000012C // USB Host Configure Receive Type + // Endpoint 2 +#define USB_O_RXINTERVAL2 0x0000012D // USB Host Receive Polling + // Interval Endpoint 2 +#define USB_O_TXMAXP3 0x00000130 // USB Maximum Transmit Data + // Endpoint 3 +#define USB_O_TXCSRL3 0x00000132 // USB Transmit Control and Status + // Endpoint 3 Low +#define USB_O_TXCSRH3 0x00000133 // USB Transmit Control and Status + // Endpoint 3 High +#define USB_O_RXMAXP3 0x00000134 // USB Maximum Receive Data + // Endpoint 3 +#define USB_O_RXCSRL3 0x00000136 // USB Receive Control and Status + // Endpoint 3 Low +#define USB_O_RXCSRH3 0x00000137 // USB Receive Control and Status + // Endpoint 3 High +#define USB_O_RXCOUNT3 0x00000138 // USB Receive Byte Count Endpoint + // 3 +#define USB_O_TXTYPE3 0x0000013A // USB Host Transmit Configure Type + // Endpoint 3 +#define USB_O_TXINTERVAL3 0x0000013B // USB Host Transmit Interval + // Endpoint 3 +#define USB_O_RXTYPE3 0x0000013C // USB Host Configure Receive Type + // Endpoint 3 +#define USB_O_RXINTERVAL3 0x0000013D // USB Host Receive Polling + // Interval Endpoint 3 +#define USB_O_TXMAXP4 0x00000140 // USB Maximum Transmit Data + // Endpoint 4 +#define USB_O_TXCSRL4 0x00000142 // USB Transmit Control and Status + // Endpoint 4 Low +#define USB_O_TXCSRH4 0x00000143 // USB Transmit Control and Status + // Endpoint 4 High +#define USB_O_RXMAXP4 0x00000144 // USB Maximum Receive Data + // Endpoint 4 +#define USB_O_RXCSRL4 0x00000146 // USB Receive Control and Status + // Endpoint 4 Low +#define USB_O_RXCSRH4 0x00000147 // USB Receive Control and Status + // Endpoint 4 High +#define USB_O_RXCOUNT4 0x00000148 // USB Receive Byte Count Endpoint + // 4 +#define USB_O_TXTYPE4 0x0000014A // USB Host Transmit Configure Type + // Endpoint 4 +#define USB_O_TXINTERVAL4 0x0000014B // USB Host Transmit Interval + // Endpoint 4 +#define USB_O_RXTYPE4 0x0000014C // USB Host Configure Receive Type + // Endpoint 4 +#define USB_O_RXINTERVAL4 0x0000014D // USB Host Receive Polling + // Interval Endpoint 4 +#define USB_O_TXMAXP5 0x00000150 // USB Maximum Transmit Data + // Endpoint 5 +#define USB_O_TXCSRL5 0x00000152 // USB Transmit Control and Status + // Endpoint 5 Low +#define USB_O_TXCSRH5 0x00000153 // USB Transmit Control and Status + // Endpoint 5 High +#define USB_O_RXMAXP5 0x00000154 // USB Maximum Receive Data + // Endpoint 5 +#define USB_O_RXCSRL5 0x00000156 // USB Receive Control and Status + // Endpoint 5 Low +#define USB_O_RXCSRH5 0x00000157 // USB Receive Control and Status + // Endpoint 5 High +#define USB_O_RXCOUNT5 0x00000158 // USB Receive Byte Count Endpoint + // 5 +#define USB_O_TXTYPE5 0x0000015A // USB Host Transmit Configure Type + // Endpoint 5 +#define USB_O_TXINTERVAL5 0x0000015B // USB Host Transmit Interval + // Endpoint 5 +#define USB_O_RXTYPE5 0x0000015C // USB Host Configure Receive Type + // Endpoint 5 +#define USB_O_RXINTERVAL5 0x0000015D // USB Host Receive Polling + // Interval Endpoint 5 +#define USB_O_TXMAXP6 0x00000160 // USB Maximum Transmit Data + // Endpoint 6 +#define USB_O_TXCSRL6 0x00000162 // USB Transmit Control and Status + // Endpoint 6 Low +#define USB_O_TXCSRH6 0x00000163 // USB Transmit Control and Status + // Endpoint 6 High +#define USB_O_RXMAXP6 0x00000164 // USB Maximum Receive Data + // Endpoint 6 +#define USB_O_RXCSRL6 0x00000166 // USB Receive Control and Status + // Endpoint 6 Low +#define USB_O_RXCSRH6 0x00000167 // USB Receive Control and Status + // Endpoint 6 High +#define USB_O_RXCOUNT6 0x00000168 // USB Receive Byte Count Endpoint + // 6 +#define USB_O_TXTYPE6 0x0000016A // USB Host Transmit Configure Type + // Endpoint 6 +#define USB_O_TXINTERVAL6 0x0000016B // USB Host Transmit Interval + // Endpoint 6 +#define USB_O_RXTYPE6 0x0000016C // USB Host Configure Receive Type + // Endpoint 6 +#define USB_O_RXINTERVAL6 0x0000016D // USB Host Receive Polling + // Interval Endpoint 6 +#define USB_O_TXMAXP7 0x00000170 // USB Maximum Transmit Data + // Endpoint 7 +#define USB_O_TXCSRL7 0x00000172 // USB Transmit Control and Status + // Endpoint 7 Low +#define USB_O_TXCSRH7 0x00000173 // USB Transmit Control and Status + // Endpoint 7 High +#define USB_O_RXMAXP7 0x00000174 // USB Maximum Receive Data + // Endpoint 7 +#define USB_O_RXCSRL7 0x00000176 // USB Receive Control and Status + // Endpoint 7 Low +#define USB_O_RXCSRH7 0x00000177 // USB Receive Control and Status + // Endpoint 7 High +#define USB_O_RXCOUNT7 0x00000178 // USB Receive Byte Count Endpoint + // 7 +#define USB_O_TXTYPE7 0x0000017A // USB Host Transmit Configure Type + // Endpoint 7 +#define USB_O_TXINTERVAL7 0x0000017B // USB Host Transmit Interval + // Endpoint 7 +#define USB_O_RXTYPE7 0x0000017C // USB Host Configure Receive Type + // Endpoint 7 +#define USB_O_RXINTERVAL7 0x0000017D // USB Host Receive Polling + // Interval Endpoint 7 +#define USB_O_TXMAXP8 0x00000180 // USB Maximum Transmit Data + // Endpoint 8 +#define USB_O_TXCSRL8 0x00000182 // USB Transmit Control and Status + // Endpoint 8 Low +#define USB_O_TXCSRH8 0x00000183 // USB Transmit Control and Status + // Endpoint 8 High +#define USB_O_RXMAXP8 0x00000184 // USB Maximum Receive Data + // Endpoint 8 +#define USB_O_RXCSRL8 0x00000186 // USB Receive Control and Status + // Endpoint 8 Low +#define USB_O_RXCSRH8 0x00000187 // USB Receive Control and Status + // Endpoint 8 High +#define USB_O_RXCOUNT8 0x00000188 // USB Receive Byte Count Endpoint + // 8 +#define USB_O_TXTYPE8 0x0000018A // USB Host Transmit Configure Type + // Endpoint 8 +#define USB_O_TXINTERVAL8 0x0000018B // USB Host Transmit Interval + // Endpoint 8 +#define USB_O_RXTYPE8 0x0000018C // USB Host Configure Receive Type + // Endpoint 8 +#define USB_O_RXINTERVAL8 0x0000018D // USB Host Receive Polling + // Interval Endpoint 8 +#define USB_O_TXMAXP9 0x00000190 // USB Maximum Transmit Data + // Endpoint 9 +#define USB_O_TXCSRL9 0x00000192 // USB Transmit Control and Status + // Endpoint 9 Low +#define USB_O_TXCSRH9 0x00000193 // USB Transmit Control and Status + // Endpoint 9 High +#define USB_O_RXMAXP9 0x00000194 // USB Maximum Receive Data + // Endpoint 9 +#define USB_O_RXCSRL9 0x00000196 // USB Receive Control and Status + // Endpoint 9 Low +#define USB_O_RXCSRH9 0x00000197 // USB Receive Control and Status + // Endpoint 9 High +#define USB_O_RXCOUNT9 0x00000198 // USB Receive Byte Count Endpoint + // 9 +#define USB_O_TXTYPE9 0x0000019A // USB Host Transmit Configure Type + // Endpoint 9 +#define USB_O_TXINTERVAL9 0x0000019B // USB Host Transmit Interval + // Endpoint 9 +#define USB_O_RXTYPE9 0x0000019C // USB Host Configure Receive Type + // Endpoint 9 +#define USB_O_RXINTERVAL9 0x0000019D // USB Host Receive Polling + // Interval Endpoint 9 +#define USB_O_TXMAXP10 0x000001A0 // USB Maximum Transmit Data + // Endpoint 10 +#define USB_O_TXCSRL10 0x000001A2 // USB Transmit Control and Status + // Endpoint 10 Low +#define USB_O_TXCSRH10 0x000001A3 // USB Transmit Control and Status + // Endpoint 10 High +#define USB_O_RXMAXP10 0x000001A4 // USB Maximum Receive Data + // Endpoint 10 +#define USB_O_RXCSRL10 0x000001A6 // USB Receive Control and Status + // Endpoint 10 Low +#define USB_O_RXCSRH10 0x000001A7 // USB Receive Control and Status + // Endpoint 10 High +#define USB_O_RXCOUNT10 0x000001A8 // USB Receive Byte Count Endpoint + // 10 +#define USB_O_TXTYPE10 0x000001AA // USB Host Transmit Configure Type + // Endpoint 10 +#define USB_O_TXINTERVAL10 0x000001AB // USB Host Transmit Interval + // Endpoint 10 +#define USB_O_RXTYPE10 0x000001AC // USB Host Configure Receive Type + // Endpoint 10 +#define USB_O_RXINTERVAL10 0x000001AD // USB Host Receive Polling + // Interval Endpoint 10 +#define USB_O_TXMAXP11 0x000001B0 // USB Maximum Transmit Data + // Endpoint 11 +#define USB_O_TXCSRL11 0x000001B2 // USB Transmit Control and Status + // Endpoint 11 Low +#define USB_O_TXCSRH11 0x000001B3 // USB Transmit Control and Status + // Endpoint 11 High +#define USB_O_RXMAXP11 0x000001B4 // USB Maximum Receive Data + // Endpoint 11 +#define USB_O_RXCSRL11 0x000001B6 // USB Receive Control and Status + // Endpoint 11 Low +#define USB_O_RXCSRH11 0x000001B7 // USB Receive Control and Status + // Endpoint 11 High +#define USB_O_RXCOUNT11 0x000001B8 // USB Receive Byte Count Endpoint + // 11 +#define USB_O_TXTYPE11 0x000001BA // USB Host Transmit Configure Type + // Endpoint 11 +#define USB_O_TXINTERVAL11 0x000001BB // USB Host Transmit Interval + // Endpoint 11 +#define USB_O_RXTYPE11 0x000001BC // USB Host Configure Receive Type + // Endpoint 11 +#define USB_O_RXINTERVAL11 0x000001BD // USB Host Receive Polling + // Interval Endpoint 11 +#define USB_O_TXMAXP12 0x000001C0 // USB Maximum Transmit Data + // Endpoint 12 +#define USB_O_TXCSRL12 0x000001C2 // USB Transmit Control and Status + // Endpoint 12 Low +#define USB_O_TXCSRH12 0x000001C3 // USB Transmit Control and Status + // Endpoint 12 High +#define USB_O_RXMAXP12 0x000001C4 // USB Maximum Receive Data + // Endpoint 12 +#define USB_O_RXCSRL12 0x000001C6 // USB Receive Control and Status + // Endpoint 12 Low +#define USB_O_RXCSRH12 0x000001C7 // USB Receive Control and Status + // Endpoint 12 High +#define USB_O_RXCOUNT12 0x000001C8 // USB Receive Byte Count Endpoint + // 12 +#define USB_O_TXTYPE12 0x000001CA // USB Host Transmit Configure Type + // Endpoint 12 +#define USB_O_TXINTERVAL12 0x000001CB // USB Host Transmit Interval + // Endpoint 12 +#define USB_O_RXTYPE12 0x000001CC // USB Host Configure Receive Type + // Endpoint 12 +#define USB_O_RXINTERVAL12 0x000001CD // USB Host Receive Polling + // Interval Endpoint 12 +#define USB_O_TXMAXP13 0x000001D0 // USB Maximum Transmit Data + // Endpoint 13 +#define USB_O_TXCSRL13 0x000001D2 // USB Transmit Control and Status + // Endpoint 13 Low +#define USB_O_TXCSRH13 0x000001D3 // USB Transmit Control and Status + // Endpoint 13 High +#define USB_O_RXMAXP13 0x000001D4 // USB Maximum Receive Data + // Endpoint 13 +#define USB_O_RXCSRL13 0x000001D6 // USB Receive Control and Status + // Endpoint 13 Low +#define USB_O_RXCSRH13 0x000001D7 // USB Receive Control and Status + // Endpoint 13 High +#define USB_O_RXCOUNT13 0x000001D8 // USB Receive Byte Count Endpoint + // 13 +#define USB_O_TXTYPE13 0x000001DA // USB Host Transmit Configure Type + // Endpoint 13 +#define USB_O_TXINTERVAL13 0x000001DB // USB Host Transmit Interval + // Endpoint 13 +#define USB_O_RXTYPE13 0x000001DC // USB Host Configure Receive Type + // Endpoint 13 +#define USB_O_RXINTERVAL13 0x000001DD // USB Host Receive Polling + // Interval Endpoint 13 +#define USB_O_TXMAXP14 0x000001E0 // USB Maximum Transmit Data + // Endpoint 14 +#define USB_O_TXCSRL14 0x000001E2 // USB Transmit Control and Status + // Endpoint 14 Low +#define USB_O_TXCSRH14 0x000001E3 // USB Transmit Control and Status + // Endpoint 14 High +#define USB_O_RXMAXP14 0x000001E4 // USB Maximum Receive Data + // Endpoint 14 +#define USB_O_RXCSRL14 0x000001E6 // USB Receive Control and Status + // Endpoint 14 Low +#define USB_O_RXCSRH14 0x000001E7 // USB Receive Control and Status + // Endpoint 14 High +#define USB_O_RXCOUNT14 0x000001E8 // USB Receive Byte Count Endpoint + // 14 +#define USB_O_TXTYPE14 0x000001EA // USB Host Transmit Configure Type + // Endpoint 14 +#define USB_O_TXINTERVAL14 0x000001EB // USB Host Transmit Interval + // Endpoint 14 +#define USB_O_RXTYPE14 0x000001EC // USB Host Configure Receive Type + // Endpoint 14 +#define USB_O_RXINTERVAL14 0x000001ED // USB Host Receive Polling + // Interval Endpoint 14 +#define USB_O_TXMAXP15 0x000001F0 // USB Maximum Transmit Data + // Endpoint 15 +#define USB_O_TXCSRL15 0x000001F2 // USB Transmit Control and Status + // Endpoint 15 Low +#define USB_O_TXCSRH15 0x000001F3 // USB Transmit Control and Status + // Endpoint 15 High +#define USB_O_RXMAXP15 0x000001F4 // USB Maximum Receive Data + // Endpoint 15 +#define USB_O_RXCSRL15 0x000001F6 // USB Receive Control and Status + // Endpoint 15 Low +#define USB_O_RXCSRH15 0x000001F7 // USB Receive Control and Status + // Endpoint 15 High +#define USB_O_RXCOUNT15 0x000001F8 // USB Receive Byte Count Endpoint + // 15 +#define USB_O_TXTYPE15 0x000001FA // USB Host Transmit Configure Type + // Endpoint 15 +#define USB_O_TXINTERVAL15 0x000001FB // USB Host Transmit Interval + // Endpoint 15 +#define USB_O_RXTYPE15 0x000001FC // USB Host Configure Receive Type + // Endpoint 15 +#define USB_O_RXINTERVAL15 0x000001FD // USB Host Receive Polling + // Interval Endpoint 15 +#define USB_O_RQPKTCOUNT1 0x00000304 // USB Request Packet Count in + // Block Transfer Endpoint 1 +#define USB_O_RQPKTCOUNT2 0x00000308 // USB Request Packet Count in + // Block Transfer Endpoint 2 +#define USB_O_RQPKTCOUNT3 0x0000030C // USB Request Packet Count in + // Block Transfer Endpoint 3 +#define USB_O_RQPKTCOUNT4 0x00000310 // USB Request Packet Count in + // Block Transfer Endpoint 4 +#define USB_O_RQPKTCOUNT5 0x00000314 // USB Request Packet Count in + // Block Transfer Endpoint 5 +#define USB_O_RQPKTCOUNT6 0x00000318 // USB Request Packet Count in + // Block Transfer Endpoint 6 +#define USB_O_RQPKTCOUNT7 0x0000031C // USB Request Packet Count in + // Block Transfer Endpoint 7 +#define USB_O_RQPKTCOUNT8 0x00000320 // USB Request Packet Count in + // Block Transfer Endpoint 8 +#define USB_O_RQPKTCOUNT9 0x00000324 // USB Request Packet Count in + // Block Transfer Endpoint 9 +#define USB_O_RQPKTCOUNT10 0x00000328 // USB Request Packet Count in + // Block Transfer Endpoint 10 +#define USB_O_RQPKTCOUNT11 0x0000032C // USB Request Packet Count in + // Block Transfer Endpoint 11 +#define USB_O_RQPKTCOUNT12 0x00000330 // USB Request Packet Count in + // Block Transfer Endpoint 12 +#define USB_O_RQPKTCOUNT13 0x00000334 // USB Request Packet Count in + // Block Transfer Endpoint 13 +#define USB_O_RQPKTCOUNT14 0x00000338 // USB Request Packet Count in + // Block Transfer Endpoint 14 +#define USB_O_RQPKTCOUNT15 0x0000033C // USB Request Packet Count in + // Block Transfer Endpoint 15 +#define USB_O_RXDPKTBUFDIS 0x00000340 // USB Receive Double Packet Buffer + // Disable +#define USB_O_TXDPKTBUFDIS 0x00000342 // USB Transmit Double Packet + // Buffer Disable +#define USB_O_EPC 0x00000400 // USB External Power Control +#define USB_O_EPCRIS 0x00000404 // USB External Power Control Raw + // Interrupt Status +#define USB_O_EPCIM 0x00000408 // USB External Power Control + // Interrupt Mask +#define USB_O_EPCISC 0x0000040C // USB External Power Control + // Interrupt Status and Clear +#define USB_O_DRRIS 0x00000410 // USB Device RESUME Raw Interrupt + // Status +#define USB_O_DRIM 0x00000414 // USB Device RESUME Interrupt Mask +#define USB_O_DRISC 0x00000418 // USB Device RESUME Interrupt + // Status and Clear +#define USB_O_GPCS 0x0000041C // USB General-Purpose Control and + // Status +#define USB_O_VDC 0x00000430 // USB VBUS Droop Control +#define USB_O_VDCRIS 0x00000434 // USB VBUS Droop Control Raw + // Interrupt Status +#define USB_O_VDCIM 0x00000438 // USB VBUS Droop Control Interrupt + // Mask +#define USB_O_VDCISC 0x0000043C // USB VBUS Droop Control Interrupt + // Status and Clear +#define USB_O_IDVRIS 0x00000444 // USB ID Valid Detect Raw + // Interrupt Status +#define USB_O_IDVIM 0x00000448 // USB ID Valid Detect Interrupt + // Mask +#define USB_O_IDVISC 0x0000044C // USB ID Valid Detect Interrupt + // Status and Clear +#define USB_O_DMASEL 0x00000450 // USB DMA Select +#define USB_O_PP 0x00000FC0 // USB Peripheral Properties + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FADDR register. +// +//***************************************************************************** +#define USB_FADDR_M 0x0000007F // Function Address +#define USB_FADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_POWER register. +// +//***************************************************************************** +#define USB_POWER_ISOUP 0x00000080 // Isochronous Update +#define USB_POWER_SOFTCONN 0x00000040 // Soft Connect/Disconnect +#define USB_POWER_RESET 0x00000008 // RESET Signaling +#define USB_POWER_RESUME 0x00000004 // RESUME Signaling +#define USB_POWER_SUSPEND 0x00000002 // SUSPEND Mode +#define USB_POWER_PWRDNPHY 0x00000001 // Power Down PHY + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIS register. +// +//***************************************************************************** +#define USB_TXIS_EP15 0x00008000 // TX Endpoint 15 Interrupt +#define USB_TXIS_EP14 0x00004000 // TX Endpoint 14 Interrupt +#define USB_TXIS_EP13 0x00002000 // TX Endpoint 13 Interrupt +#define USB_TXIS_EP12 0x00001000 // TX Endpoint 12 Interrupt +#define USB_TXIS_EP11 0x00000800 // TX Endpoint 11 Interrupt +#define USB_TXIS_EP10 0x00000400 // TX Endpoint 10 Interrupt +#define USB_TXIS_EP9 0x00000200 // TX Endpoint 9 Interrupt +#define USB_TXIS_EP8 0x00000100 // TX Endpoint 8 Interrupt +#define USB_TXIS_EP7 0x00000080 // TX Endpoint 7 Interrupt +#define USB_TXIS_EP6 0x00000040 // TX Endpoint 6 Interrupt +#define USB_TXIS_EP5 0x00000020 // TX Endpoint 5 Interrupt +#define USB_TXIS_EP4 0x00000010 // TX Endpoint 4 Interrupt +#define USB_TXIS_EP3 0x00000008 // TX Endpoint 3 Interrupt +#define USB_TXIS_EP2 0x00000004 // TX Endpoint 2 Interrupt +#define USB_TXIS_EP1 0x00000002 // TX Endpoint 1 Interrupt +#define USB_TXIS_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIS register. +// +//***************************************************************************** +#define USB_RXIS_EP15 0x00008000 // RX Endpoint 15 Interrupt +#define USB_RXIS_EP14 0x00004000 // RX Endpoint 14 Interrupt +#define USB_RXIS_EP13 0x00002000 // RX Endpoint 13 Interrupt +#define USB_RXIS_EP12 0x00001000 // RX Endpoint 12 Interrupt +#define USB_RXIS_EP11 0x00000800 // RX Endpoint 11 Interrupt +#define USB_RXIS_EP10 0x00000400 // RX Endpoint 10 Interrupt +#define USB_RXIS_EP9 0x00000200 // RX Endpoint 9 Interrupt +#define USB_RXIS_EP8 0x00000100 // RX Endpoint 8 Interrupt +#define USB_RXIS_EP7 0x00000080 // RX Endpoint 7 Interrupt +#define USB_RXIS_EP6 0x00000040 // RX Endpoint 6 Interrupt +#define USB_RXIS_EP5 0x00000020 // RX Endpoint 5 Interrupt +#define USB_RXIS_EP4 0x00000010 // RX Endpoint 4 Interrupt +#define USB_RXIS_EP3 0x00000008 // RX Endpoint 3 Interrupt +#define USB_RXIS_EP2 0x00000004 // RX Endpoint 2 Interrupt +#define USB_RXIS_EP1 0x00000002 // RX Endpoint 1 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIE register. +// +//***************************************************************************** +#define USB_TXIE_EP15 0x00008000 // TX Endpoint 15 Interrupt Enable +#define USB_TXIE_EP14 0x00004000 // TX Endpoint 14 Interrupt Enable +#define USB_TXIE_EP13 0x00002000 // TX Endpoint 13 Interrupt Enable +#define USB_TXIE_EP12 0x00001000 // TX Endpoint 12 Interrupt Enable +#define USB_TXIE_EP11 0x00000800 // TX Endpoint 11 Interrupt Enable +#define USB_TXIE_EP10 0x00000400 // TX Endpoint 10 Interrupt Enable +#define USB_TXIE_EP9 0x00000200 // TX Endpoint 9 Interrupt Enable +#define USB_TXIE_EP8 0x00000100 // TX Endpoint 8 Interrupt Enable +#define USB_TXIE_EP7 0x00000080 // TX Endpoint 7 Interrupt Enable +#define USB_TXIE_EP6 0x00000040 // TX Endpoint 6 Interrupt Enable +#define USB_TXIE_EP5 0x00000020 // TX Endpoint 5 Interrupt Enable +#define USB_TXIE_EP4 0x00000010 // TX Endpoint 4 Interrupt Enable +#define USB_TXIE_EP3 0x00000008 // TX Endpoint 3 Interrupt Enable +#define USB_TXIE_EP2 0x00000004 // TX Endpoint 2 Interrupt Enable +#define USB_TXIE_EP1 0x00000002 // TX Endpoint 1 Interrupt Enable +#define USB_TXIE_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + // Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIE register. +// +//***************************************************************************** +#define USB_RXIE_EP15 0x00008000 // RX Endpoint 15 Interrupt Enable +#define USB_RXIE_EP14 0x00004000 // RX Endpoint 14 Interrupt Enable +#define USB_RXIE_EP13 0x00002000 // RX Endpoint 13 Interrupt Enable +#define USB_RXIE_EP12 0x00001000 // RX Endpoint 12 Interrupt Enable +#define USB_RXIE_EP11 0x00000800 // RX Endpoint 11 Interrupt Enable +#define USB_RXIE_EP10 0x00000400 // RX Endpoint 10 Interrupt Enable +#define USB_RXIE_EP9 0x00000200 // RX Endpoint 9 Interrupt Enable +#define USB_RXIE_EP8 0x00000100 // RX Endpoint 8 Interrupt Enable +#define USB_RXIE_EP7 0x00000080 // RX Endpoint 7 Interrupt Enable +#define USB_RXIE_EP6 0x00000040 // RX Endpoint 6 Interrupt Enable +#define USB_RXIE_EP5 0x00000020 // RX Endpoint 5 Interrupt Enable +#define USB_RXIE_EP4 0x00000010 // RX Endpoint 4 Interrupt Enable +#define USB_RXIE_EP3 0x00000008 // RX Endpoint 3 Interrupt Enable +#define USB_RXIE_EP2 0x00000004 // RX Endpoint 2 Interrupt Enable +#define USB_RXIE_EP1 0x00000002 // RX Endpoint 1 Interrupt Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IS register. +// +//***************************************************************************** +#define USB_IS_VBUSERR 0x00000080 // VBUS Error +#define USB_IS_SESREQ 0x00000040 // SESSION REQUEST +#define USB_IS_DISCON 0x00000020 // Session Disconnect +#define USB_IS_CONN 0x00000010 // Session Connect +#define USB_IS_SOF 0x00000008 // Start of Frame +#define USB_IS_BABBLE 0x00000004 // Babble Detected +#define USB_IS_RESET 0x00000004 // RESET Signaling Detected +#define USB_IS_RESUME 0x00000002 // RESUME Signaling Detected +#define USB_IS_SUSPEND 0x00000001 // SUSPEND Signaling Detected + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IE register. +// +//***************************************************************************** +#define USB_IE_VBUSERR 0x00000080 // Enable VBUS Error Interrupt +#define USB_IE_SESREQ 0x00000040 // Enable Session Request +#define USB_IE_DISCON 0x00000020 // Enable Disconnect Interrupt +#define USB_IE_CONN 0x00000010 // Enable Connect Interrupt +#define USB_IE_SOF 0x00000008 // Enable Start-of-Frame Interrupt +#define USB_IE_BABBLE 0x00000004 // Enable Babble Interrupt +#define USB_IE_RESET 0x00000004 // Enable RESET Interrupt +#define USB_IE_RESUME 0x00000002 // Enable RESUME Interrupt +#define USB_IE_SUSPND 0x00000001 // Enable SUSPEND Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FRAME register. +// +//***************************************************************************** +#define USB_FRAME_M 0x000007FF // Frame Number +#define USB_FRAME_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPIDX register. +// +//***************************************************************************** +#define USB_EPIDX_EPIDX_M 0x0000000F // Endpoint Index +#define USB_EPIDX_EPIDX_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TEST register. +// +//***************************************************************************** +#define USB_TEST_FORCEH 0x00000080 // Force Host Mode +#define USB_TEST_FIFOACC 0x00000040 // FIFO Access +#define USB_TEST_FORCEFS 0x00000020 // Force Full-Speed Mode + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO0 register. +// +//***************************************************************************** +#define USB_FIFO0_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO0_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO1 register. +// +//***************************************************************************** +#define USB_FIFO1_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO1_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO2 register. +// +//***************************************************************************** +#define USB_FIFO2_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO2_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO3 register. +// +//***************************************************************************** +#define USB_FIFO3_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO3_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO4 register. +// +//***************************************************************************** +#define USB_FIFO4_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO4_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO5 register. +// +//***************************************************************************** +#define USB_FIFO5_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO5_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO6 register. +// +//***************************************************************************** +#define USB_FIFO6_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO6_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO7 register. +// +//***************************************************************************** +#define USB_FIFO7_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO7_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO8 register. +// +//***************************************************************************** +#define USB_FIFO8_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO8_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO9 register. +// +//***************************************************************************** +#define USB_FIFO9_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO9_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO10 register. +// +//***************************************************************************** +#define USB_FIFO10_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO10_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO11 register. +// +//***************************************************************************** +#define USB_FIFO11_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO11_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO12 register. +// +//***************************************************************************** +#define USB_FIFO12_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO12_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO13 register. +// +//***************************************************************************** +#define USB_FIFO13_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO13_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO14 register. +// +//***************************************************************************** +#define USB_FIFO14_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO14_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO15 register. +// +//***************************************************************************** +#define USB_FIFO15_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO15_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DEVCTL register. +// +//***************************************************************************** +#define USB_DEVCTL_DEV 0x00000080 // Device Mode +#define USB_DEVCTL_FSDEV 0x00000040 // Full-Speed Device Detected +#define USB_DEVCTL_LSDEV 0x00000020 // Low-Speed Device Detected +#define USB_DEVCTL_VBUS_M 0x00000018 // VBUS Level +#define USB_DEVCTL_VBUS_NONE 0x00000000 // Below SessionEnd +#define USB_DEVCTL_VBUS_SEND 0x00000008 // Above SessionEnd, below AValid +#define USB_DEVCTL_VBUS_AVALID 0x00000010 // Above AValid, below VBUSValid +#define USB_DEVCTL_VBUS_VALID 0x00000018 // Above VBUSValid +#define USB_DEVCTL_HOST 0x00000004 // Host Mode +#define USB_DEVCTL_HOSTREQ 0x00000002 // Host Request +#define USB_DEVCTL_SESSION 0x00000001 // Session Start/End + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOSZ register. +// +//***************************************************************************** +#define USB_TXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_TXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_TXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_TXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_TXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_TXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_TXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_TXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_TXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_TXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_TXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOSZ register. +// +//***************************************************************************** +#define USB_RXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_RXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_RXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_RXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_RXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_RXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_RXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_RXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_RXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_RXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_RXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOADD +// register. +// +//***************************************************************************** +#define USB_TXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_TXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOADD +// register. +// +//***************************************************************************** +#define USB_RXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_RXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CONTIM register. +// +//***************************************************************************** +#define USB_CONTIM_WTCON_M 0x000000F0 // Connect Wait +#define USB_CONTIM_WTID_M 0x0000000F // Wait ID +#define USB_CONTIM_WTCON_S 4 +#define USB_CONTIM_WTID_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VPLEN register. +// +//***************************************************************************** +#define USB_VPLEN_VPLEN_M 0x000000FF // VBUS Pulse Length +#define USB_VPLEN_VPLEN_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FSEOF register. +// +//***************************************************************************** +#define USB_FSEOF_FSEOFG_M 0x000000FF // Full-Speed End-of-Frame Gap +#define USB_FSEOF_FSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LSEOF register. +// +//***************************************************************************** +#define USB_LSEOF_LSEOFG_M 0x000000FF // Low-Speed End-of-Frame Gap +#define USB_LSEOF_LSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR0 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR0_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR0 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR0_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT0 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT0_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT0_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR8 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR8_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR8 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR8_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT8 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT8_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT8_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR8 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR8_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR8 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR8_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT8 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT8_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT8_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR9 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR9_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR9 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR9_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT9 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT9_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT9_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR9 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR9_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR9 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR9_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT9 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT9_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT9_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR10 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR10_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR10 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR10_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT10 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT10_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT10_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR10 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR10_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR10 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR10_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT10 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT10_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT10_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR11 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR11_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR11 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR11_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT11 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT11_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT11_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR11 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR11_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR11 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR11_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT11 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT11_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT11_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR12 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR12_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR12 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR12_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT12 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT12_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT12_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR12 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR12_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR12 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR12_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT12 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT12_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT12_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR13 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR13_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR13 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR13_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT13 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT13_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT13_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR13 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR13_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR13 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR13_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT13 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT13_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT13_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR14 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR14_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR14 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR14_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT14 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT14_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT14_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR14 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR14_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR14 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR14_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT14 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT14_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT14_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR15 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR15_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR15 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR15_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT15 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT15_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT15_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR15 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR15_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR15 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR15_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT15 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT15_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT15_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRL0 register. +// +//***************************************************************************** +#define USB_CSRL0_NAKTO 0x00000080 // NAK Timeout +#define USB_CSRL0_SETENDC 0x00000080 // Setup End Clear +#define USB_CSRL0_STATUS 0x00000040 // STATUS Packet +#define USB_CSRL0_RXRDYC 0x00000040 // RXRDY Clear +#define USB_CSRL0_REQPKT 0x00000020 // Request Packet +#define USB_CSRL0_STALL 0x00000020 // Send Stall +#define USB_CSRL0_SETEND 0x00000010 // Setup End +#define USB_CSRL0_ERROR 0x00000010 // Error +#define USB_CSRL0_DATAEND 0x00000008 // Data End +#define USB_CSRL0_SETUP 0x00000008 // Setup Packet +#define USB_CSRL0_STALLED 0x00000004 // Endpoint Stalled +#define USB_CSRL0_TXRDY 0x00000002 // Transmit Packet Ready +#define USB_CSRL0_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRH0 register. +// +//***************************************************************************** +#define USB_CSRH0_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_CSRH0_DT 0x00000002 // Data Toggle +#define USB_CSRH0_FLUSH 0x00000001 // Flush FIFO + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_COUNT0 register. +// +//***************************************************************************** +#define USB_COUNT0_COUNT_M 0x0000007F // FIFO Count +#define USB_COUNT0_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TYPE0 register. +// +//***************************************************************************** +#define USB_TYPE0_SPEED_M 0x000000C0 // Operating Speed +#define USB_TYPE0_SPEED_FULL 0x00000080 // Full +#define USB_TYPE0_SPEED_LOW 0x000000C0 // Low + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_NAKLMT register. +// +//***************************************************************************** +#define USB_NAKLMT_NAKLMT_M 0x0000001F // EP0 NAK Limit +#define USB_NAKLMT_NAKLMT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP1 register. +// +//***************************************************************************** +#define USB_TXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL1 register. +// +//***************************************************************************** +#define USB_TXCSRL1_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL1_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL1_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL1_STALL 0x00000010 // Send STALL +#define USB_TXCSRL1_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL1_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL1_ERROR 0x00000004 // Error +#define USB_TXCSRL1_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL1_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL1_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH1 register. +// +//***************************************************************************** +#define USB_TXCSRH1_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH1_MODE 0x00000020 // Mode +#define USB_TXCSRH1_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH1_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH1_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH1_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH1_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP1 register. +// +//***************************************************************************** +#define USB_RXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL1 register. +// +//***************************************************************************** +#define USB_RXCSRL1_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL1_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL1_STALL 0x00000020 // Send STALL +#define USB_RXCSRL1_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL1_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL1_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL1_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL1_OVER 0x00000004 // Overrun +#define USB_RXCSRL1_ERROR 0x00000004 // Error +#define USB_RXCSRL1_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL1_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH1 register. +// +//***************************************************************************** +#define USB_RXCSRH1_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH1_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH1_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH1_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH1_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH1_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH1_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH1_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT1 register. +// +//***************************************************************************** +#define USB_RXCOUNT1_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT1_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE1 register. +// +//***************************************************************************** +#define USB_TXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL1_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL1_TXPOLL_S \ + 0 +#define USB_TXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE1 register. +// +//***************************************************************************** +#define USB_RXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL1_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL1_TXPOLL_S \ + 0 +#define USB_RXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP2 register. +// +//***************************************************************************** +#define USB_TXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL2 register. +// +//***************************************************************************** +#define USB_TXCSRL2_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL2_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL2_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL2_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL2_STALL 0x00000010 // Send STALL +#define USB_TXCSRL2_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL2_ERROR 0x00000004 // Error +#define USB_TXCSRL2_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL2_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL2_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH2 register. +// +//***************************************************************************** +#define USB_TXCSRH2_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH2_MODE 0x00000020 // Mode +#define USB_TXCSRH2_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH2_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH2_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH2_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH2_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP2 register. +// +//***************************************************************************** +#define USB_RXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL2 register. +// +//***************************************************************************** +#define USB_RXCSRL2_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL2_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL2_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL2_STALL 0x00000020 // Send STALL +#define USB_RXCSRL2_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL2_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL2_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL2_ERROR 0x00000004 // Error +#define USB_RXCSRL2_OVER 0x00000004 // Overrun +#define USB_RXCSRL2_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL2_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH2 register. +// +//***************************************************************************** +#define USB_RXCSRH2_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH2_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH2_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH2_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH2_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH2_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH2_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH2_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT2 register. +// +//***************************************************************************** +#define USB_RXCOUNT2_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT2_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE2 register. +// +//***************************************************************************** +#define USB_TXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL2_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL2_NAKLMT_S \ + 0 +#define USB_TXINTERVAL2_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE2 register. +// +//***************************************************************************** +#define USB_RXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL2_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL2_TXPOLL_S \ + 0 +#define USB_RXINTERVAL2_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP3 register. +// +//***************************************************************************** +#define USB_TXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL3 register. +// +//***************************************************************************** +#define USB_TXCSRL3_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL3_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL3_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL3_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL3_STALL 0x00000010 // Send STALL +#define USB_TXCSRL3_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL3_ERROR 0x00000004 // Error +#define USB_TXCSRL3_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL3_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL3_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH3 register. +// +//***************************************************************************** +#define USB_TXCSRH3_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH3_MODE 0x00000020 // Mode +#define USB_TXCSRH3_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH3_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH3_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH3_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH3_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP3 register. +// +//***************************************************************************** +#define USB_RXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL3 register. +// +//***************************************************************************** +#define USB_RXCSRL3_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL3_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL3_STALL 0x00000020 // Send STALL +#define USB_RXCSRL3_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL3_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL3_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL3_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL3_ERROR 0x00000004 // Error +#define USB_RXCSRL3_OVER 0x00000004 // Overrun +#define USB_RXCSRL3_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL3_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH3 register. +// +//***************************************************************************** +#define USB_RXCSRH3_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH3_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH3_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH3_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH3_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH3_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH3_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH3_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT3 register. +// +//***************************************************************************** +#define USB_RXCOUNT3_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT3_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE3 register. +// +//***************************************************************************** +#define USB_TXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL3_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL3_TXPOLL_S \ + 0 +#define USB_TXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE3 register. +// +//***************************************************************************** +#define USB_RXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL3_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL3_TXPOLL_S \ + 0 +#define USB_RXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP4 register. +// +//***************************************************************************** +#define USB_TXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL4 register. +// +//***************************************************************************** +#define USB_TXCSRL4_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL4_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL4_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL4_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL4_STALL 0x00000010 // Send STALL +#define USB_TXCSRL4_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL4_ERROR 0x00000004 // Error +#define USB_TXCSRL4_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL4_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL4_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH4 register. +// +//***************************************************************************** +#define USB_TXCSRH4_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH4_MODE 0x00000020 // Mode +#define USB_TXCSRH4_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH4_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH4_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH4_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH4_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP4 register. +// +//***************************************************************************** +#define USB_RXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL4 register. +// +//***************************************************************************** +#define USB_RXCSRL4_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL4_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL4_STALL 0x00000020 // Send STALL +#define USB_RXCSRL4_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL4_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL4_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL4_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL4_OVER 0x00000004 // Overrun +#define USB_RXCSRL4_ERROR 0x00000004 // Error +#define USB_RXCSRL4_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL4_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH4 register. +// +//***************************************************************************** +#define USB_RXCSRH4_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH4_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH4_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH4_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH4_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH4_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH4_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH4_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT4 register. +// +//***************************************************************************** +#define USB_RXCOUNT4_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE4 register. +// +//***************************************************************************** +#define USB_TXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL4_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL4_NAKLMT_S \ + 0 +#define USB_TXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE4 register. +// +//***************************************************************************** +#define USB_RXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL4_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL4_NAKLMT_S \ + 0 +#define USB_RXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP5 register. +// +//***************************************************************************** +#define USB_TXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL5 register. +// +//***************************************************************************** +#define USB_TXCSRL5_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL5_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL5_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL5_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL5_STALL 0x00000010 // Send STALL +#define USB_TXCSRL5_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL5_ERROR 0x00000004 // Error +#define USB_TXCSRL5_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL5_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL5_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH5 register. +// +//***************************************************************************** +#define USB_TXCSRH5_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH5_MODE 0x00000020 // Mode +#define USB_TXCSRH5_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH5_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH5_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH5_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH5_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP5 register. +// +//***************************************************************************** +#define USB_RXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL5 register. +// +//***************************************************************************** +#define USB_RXCSRL5_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL5_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL5_STALL 0x00000020 // Send STALL +#define USB_RXCSRL5_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL5_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL5_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL5_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL5_ERROR 0x00000004 // Error +#define USB_RXCSRL5_OVER 0x00000004 // Overrun +#define USB_RXCSRL5_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL5_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH5 register. +// +//***************************************************************************** +#define USB_RXCSRH5_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH5_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH5_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH5_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH5_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH5_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH5_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH5_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT5 register. +// +//***************************************************************************** +#define USB_RXCOUNT5_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE5 register. +// +//***************************************************************************** +#define USB_TXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL5_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL5_NAKLMT_S \ + 0 +#define USB_TXINTERVAL5_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE5 register. +// +//***************************************************************************** +#define USB_RXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL5_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL5_TXPOLL_S \ + 0 +#define USB_RXINTERVAL5_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP6 register. +// +//***************************************************************************** +#define USB_TXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL6 register. +// +//***************************************************************************** +#define USB_TXCSRL6_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL6_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL6_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL6_STALL 0x00000010 // Send STALL +#define USB_TXCSRL6_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL6_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL6_ERROR 0x00000004 // Error +#define USB_TXCSRL6_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL6_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL6_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH6 register. +// +//***************************************************************************** +#define USB_TXCSRH6_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH6_MODE 0x00000020 // Mode +#define USB_TXCSRH6_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH6_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH6_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH6_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH6_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP6 register. +// +//***************************************************************************** +#define USB_RXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL6 register. +// +//***************************************************************************** +#define USB_RXCSRL6_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL6_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL6_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL6_STALL 0x00000020 // Send STALL +#define USB_RXCSRL6_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL6_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL6_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL6_ERROR 0x00000004 // Error +#define USB_RXCSRL6_OVER 0x00000004 // Overrun +#define USB_RXCSRL6_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL6_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH6 register. +// +//***************************************************************************** +#define USB_RXCSRH6_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH6_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH6_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH6_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH6_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH6_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH6_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH6_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT6 register. +// +//***************************************************************************** +#define USB_RXCOUNT6_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE6 register. +// +//***************************************************************************** +#define USB_TXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL6_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL6_TXPOLL_S \ + 0 +#define USB_TXINTERVAL6_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE6 register. +// +//***************************************************************************** +#define USB_RXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL6_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL6_NAKLMT_S \ + 0 +#define USB_RXINTERVAL6_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP7 register. +// +//***************************************************************************** +#define USB_TXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL7 register. +// +//***************************************************************************** +#define USB_TXCSRL7_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL7_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL7_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL7_STALL 0x00000010 // Send STALL +#define USB_TXCSRL7_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL7_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL7_ERROR 0x00000004 // Error +#define USB_TXCSRL7_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL7_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL7_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH7 register. +// +//***************************************************************************** +#define USB_TXCSRH7_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH7_MODE 0x00000020 // Mode +#define USB_TXCSRH7_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH7_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH7_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH7_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH7_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP7 register. +// +//***************************************************************************** +#define USB_RXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL7 register. +// +//***************************************************************************** +#define USB_RXCSRL7_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL7_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL7_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL7_STALL 0x00000020 // Send STALL +#define USB_RXCSRL7_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL7_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL7_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL7_ERROR 0x00000004 // Error +#define USB_RXCSRL7_OVER 0x00000004 // Overrun +#define USB_RXCSRL7_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL7_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH7 register. +// +//***************************************************************************** +#define USB_RXCSRH7_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH7_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH7_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH7_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH7_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH7_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH7_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH7_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT7 register. +// +//***************************************************************************** +#define USB_RXCOUNT7_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE7 register. +// +//***************************************************************************** +#define USB_TXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL7_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL7_NAKLMT_S \ + 0 +#define USB_TXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE7 register. +// +//***************************************************************************** +#define USB_RXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL7_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL7_NAKLMT_S \ + 0 +#define USB_RXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP8 register. +// +//***************************************************************************** +#define USB_TXMAXP8_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP8_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL8 register. +// +//***************************************************************************** +#define USB_TXCSRL8_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL8_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL8_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL8_STALL 0x00000010 // Send STALL +#define USB_TXCSRL8_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL8_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL8_ERROR 0x00000004 // Error +#define USB_TXCSRL8_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL8_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL8_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH8 register. +// +//***************************************************************************** +#define USB_TXCSRH8_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH8_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH8_MODE 0x00000020 // Mode +#define USB_TXCSRH8_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH8_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH8_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH8_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH8_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP8 register. +// +//***************************************************************************** +#define USB_RXMAXP8_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP8_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL8 register. +// +//***************************************************************************** +#define USB_RXCSRL8_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL8_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL8_STALL 0x00000020 // Send STALL +#define USB_RXCSRL8_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL8_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL8_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL8_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL8_OVER 0x00000004 // Overrun +#define USB_RXCSRL8_ERROR 0x00000004 // Error +#define USB_RXCSRL8_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL8_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH8 register. +// +//***************************************************************************** +#define USB_RXCSRH8_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH8_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH8_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH8_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH8_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH8_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH8_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH8_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH8_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT8 register. +// +//***************************************************************************** +#define USB_RXCOUNT8_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT8_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE8 register. +// +//***************************************************************************** +#define USB_TXTYPE8_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE8_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE8_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE8_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE8_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE8_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE8_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE8_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE8_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE8_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE8_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL8 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL8_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL8_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL8_NAKLMT_S \ + 0 +#define USB_TXINTERVAL8_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE8 register. +// +//***************************************************************************** +#define USB_RXTYPE8_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE8_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE8_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE8_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE8_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE8_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE8_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE8_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE8_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE8_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE8_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL8 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL8_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL8_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL8_NAKLMT_S \ + 0 +#define USB_RXINTERVAL8_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP9 register. +// +//***************************************************************************** +#define USB_TXMAXP9_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP9_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL9 register. +// +//***************************************************************************** +#define USB_TXCSRL9_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL9_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL9_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL9_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL9_STALL 0x00000010 // Send STALL +#define USB_TXCSRL9_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL9_ERROR 0x00000004 // Error +#define USB_TXCSRL9_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL9_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL9_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH9 register. +// +//***************************************************************************** +#define USB_TXCSRH9_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH9_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH9_MODE 0x00000020 // Mode +#define USB_TXCSRH9_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH9_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH9_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH9_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH9_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP9 register. +// +//***************************************************************************** +#define USB_RXMAXP9_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP9_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL9 register. +// +//***************************************************************************** +#define USB_RXCSRL9_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL9_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL9_STALL 0x00000020 // Send STALL +#define USB_RXCSRL9_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL9_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL9_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL9_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL9_ERROR 0x00000004 // Error +#define USB_RXCSRL9_OVER 0x00000004 // Overrun +#define USB_RXCSRL9_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL9_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH9 register. +// +//***************************************************************************** +#define USB_RXCSRH9_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH9_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH9_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH9_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH9_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH9_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH9_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH9_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH9_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT9 register. +// +//***************************************************************************** +#define USB_RXCOUNT9_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT9_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE9 register. +// +//***************************************************************************** +#define USB_TXTYPE9_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE9_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE9_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE9_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE9_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE9_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE9_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE9_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE9_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE9_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE9_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL9 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL9_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL9_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL9_TXPOLL_S \ + 0 +#define USB_TXINTERVAL9_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE9 register. +// +//***************************************************************************** +#define USB_RXTYPE9_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE9_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE9_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE9_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE9_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE9_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE9_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE9_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE9_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE9_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE9_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL9 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL9_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL9_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL9_NAKLMT_S \ + 0 +#define USB_RXINTERVAL9_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP10 register. +// +//***************************************************************************** +#define USB_TXMAXP10_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP10_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL10 register. +// +//***************************************************************************** +#define USB_TXCSRL10_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL10_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL10_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL10_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL10_STALL 0x00000010 // Send STALL +#define USB_TXCSRL10_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL10_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL10_ERROR 0x00000004 // Error +#define USB_TXCSRL10_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL10_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH10 register. +// +//***************************************************************************** +#define USB_TXCSRH10_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH10_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH10_MODE 0x00000020 // Mode +#define USB_TXCSRH10_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH10_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH10_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH10_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH10_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP10 register. +// +//***************************************************************************** +#define USB_RXMAXP10_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP10_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL10 register. +// +//***************************************************************************** +#define USB_RXCSRL10_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL10_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL10_STALL 0x00000020 // Send STALL +#define USB_RXCSRL10_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL10_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL10_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL10_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL10_OVER 0x00000004 // Overrun +#define USB_RXCSRL10_ERROR 0x00000004 // Error +#define USB_RXCSRL10_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL10_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH10 register. +// +//***************************************************************************** +#define USB_RXCSRH10_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH10_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH10_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH10_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH10_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH10_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH10_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH10_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH10_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT10 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT10_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT10_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE10 register. +// +//***************************************************************************** +#define USB_TXTYPE10_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE10_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE10_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE10_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE10_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE10_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE10_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE10_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE10_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE10_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE10_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL10 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL10_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL10_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL10_TXPOLL_S \ + 0 +#define USB_TXINTERVAL10_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE10 register. +// +//***************************************************************************** +#define USB_RXTYPE10_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE10_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE10_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE10_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE10_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE10_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE10_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE10_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE10_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE10_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE10_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL10 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL10_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL10_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL10_TXPOLL_S \ + 0 +#define USB_RXINTERVAL10_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP11 register. +// +//***************************************************************************** +#define USB_TXMAXP11_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP11_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL11 register. +// +//***************************************************************************** +#define USB_TXCSRL11_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL11_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL11_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL11_STALL 0x00000010 // Send STALL +#define USB_TXCSRL11_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL11_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL11_ERROR 0x00000004 // Error +#define USB_TXCSRL11_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL11_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL11_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH11 register. +// +//***************************************************************************** +#define USB_TXCSRH11_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH11_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH11_MODE 0x00000020 // Mode +#define USB_TXCSRH11_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH11_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH11_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH11_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH11_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP11 register. +// +//***************************************************************************** +#define USB_RXMAXP11_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP11_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL11 register. +// +//***************************************************************************** +#define USB_RXCSRL11_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL11_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL11_STALL 0x00000020 // Send STALL +#define USB_RXCSRL11_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL11_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL11_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL11_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL11_OVER 0x00000004 // Overrun +#define USB_RXCSRL11_ERROR 0x00000004 // Error +#define USB_RXCSRL11_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL11_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH11 register. +// +//***************************************************************************** +#define USB_RXCSRH11_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH11_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH11_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH11_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH11_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH11_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH11_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH11_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH11_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT11 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT11_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT11_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE11 register. +// +//***************************************************************************** +#define USB_TXTYPE11_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE11_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE11_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE11_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE11_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE11_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE11_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE11_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE11_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE11_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE11_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL11 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL11_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL11_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL11_NAKLMT_S \ + 0 +#define USB_TXINTERVAL11_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE11 register. +// +//***************************************************************************** +#define USB_RXTYPE11_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE11_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE11_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE11_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE11_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE11_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE11_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE11_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE11_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE11_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE11_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL11 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL11_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL11_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL11_TXPOLL_S \ + 0 +#define USB_RXINTERVAL11_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP12 register. +// +//***************************************************************************** +#define USB_TXMAXP12_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP12_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL12 register. +// +//***************************************************************************** +#define USB_TXCSRL12_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL12_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL12_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL12_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL12_STALL 0x00000010 // Send STALL +#define USB_TXCSRL12_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL12_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL12_ERROR 0x00000004 // Error +#define USB_TXCSRL12_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL12_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH12 register. +// +//***************************************************************************** +#define USB_TXCSRH12_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH12_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH12_MODE 0x00000020 // Mode +#define USB_TXCSRH12_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH12_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH12_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH12_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH12_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP12 register. +// +//***************************************************************************** +#define USB_RXMAXP12_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP12_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL12 register. +// +//***************************************************************************** +#define USB_RXCSRL12_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL12_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL12_STALL 0x00000020 // Send STALL +#define USB_RXCSRL12_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL12_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL12_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL12_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL12_ERROR 0x00000004 // Error +#define USB_RXCSRL12_OVER 0x00000004 // Overrun +#define USB_RXCSRL12_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL12_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH12 register. +// +//***************************************************************************** +#define USB_RXCSRH12_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH12_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH12_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH12_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH12_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH12_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH12_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH12_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH12_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT12 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT12_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT12_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE12 register. +// +//***************************************************************************** +#define USB_TXTYPE12_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE12_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE12_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE12_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE12_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE12_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE12_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE12_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE12_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE12_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE12_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL12 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL12_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL12_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL12_TXPOLL_S \ + 0 +#define USB_TXINTERVAL12_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE12 register. +// +//***************************************************************************** +#define USB_RXTYPE12_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE12_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE12_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE12_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE12_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE12_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE12_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE12_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE12_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE12_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE12_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL12 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL12_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL12_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL12_NAKLMT_S \ + 0 +#define USB_RXINTERVAL12_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP13 register. +// +//***************************************************************************** +#define USB_TXMAXP13_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP13_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL13 register. +// +//***************************************************************************** +#define USB_TXCSRL13_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL13_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL13_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL13_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL13_STALL 0x00000010 // Send STALL +#define USB_TXCSRL13_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL13_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL13_ERROR 0x00000004 // Error +#define USB_TXCSRL13_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL13_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH13 register. +// +//***************************************************************************** +#define USB_TXCSRH13_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH13_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH13_MODE 0x00000020 // Mode +#define USB_TXCSRH13_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH13_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH13_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH13_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH13_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP13 register. +// +//***************************************************************************** +#define USB_RXMAXP13_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP13_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL13 register. +// +//***************************************************************************** +#define USB_RXCSRL13_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL13_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL13_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL13_STALL 0x00000020 // Send STALL +#define USB_RXCSRL13_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL13_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL13_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL13_OVER 0x00000004 // Overrun +#define USB_RXCSRL13_ERROR 0x00000004 // Error +#define USB_RXCSRL13_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL13_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH13 register. +// +//***************************************************************************** +#define USB_RXCSRH13_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH13_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH13_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH13_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH13_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH13_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH13_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH13_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH13_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT13 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT13_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT13_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE13 register. +// +//***************************************************************************** +#define USB_TXTYPE13_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE13_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE13_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE13_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE13_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE13_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE13_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE13_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE13_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE13_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE13_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL13 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL13_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL13_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL13_TXPOLL_S \ + 0 +#define USB_TXINTERVAL13_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE13 register. +// +//***************************************************************************** +#define USB_RXTYPE13_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE13_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE13_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE13_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE13_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE13_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE13_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE13_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE13_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE13_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE13_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL13 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL13_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL13_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL13_TXPOLL_S \ + 0 +#define USB_RXINTERVAL13_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP14 register. +// +//***************************************************************************** +#define USB_TXMAXP14_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP14_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL14 register. +// +//***************************************************************************** +#define USB_TXCSRL14_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL14_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL14_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL14_STALL 0x00000010 // Send STALL +#define USB_TXCSRL14_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL14_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL14_ERROR 0x00000004 // Error +#define USB_TXCSRL14_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL14_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL14_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH14 register. +// +//***************************************************************************** +#define USB_TXCSRH14_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH14_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH14_MODE 0x00000020 // Mode +#define USB_TXCSRH14_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH14_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH14_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH14_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH14_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP14 register. +// +//***************************************************************************** +#define USB_RXMAXP14_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP14_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL14 register. +// +//***************************************************************************** +#define USB_RXCSRL14_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL14_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL14_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL14_STALL 0x00000020 // Send STALL +#define USB_RXCSRL14_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL14_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL14_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL14_OVER 0x00000004 // Overrun +#define USB_RXCSRL14_ERROR 0x00000004 // Error +#define USB_RXCSRL14_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL14_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH14 register. +// +//***************************************************************************** +#define USB_RXCSRH14_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH14_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH14_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH14_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH14_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH14_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH14_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH14_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH14_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT14 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT14_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT14_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE14 register. +// +//***************************************************************************** +#define USB_TXTYPE14_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE14_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE14_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE14_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE14_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE14_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE14_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE14_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE14_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE14_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE14_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL14 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL14_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL14_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL14_TXPOLL_S \ + 0 +#define USB_TXINTERVAL14_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE14 register. +// +//***************************************************************************** +#define USB_RXTYPE14_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE14_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE14_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE14_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE14_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE14_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE14_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE14_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE14_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE14_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE14_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL14 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL14_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL14_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL14_TXPOLL_S \ + 0 +#define USB_RXINTERVAL14_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP15 register. +// +//***************************************************************************** +#define USB_TXMAXP15_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP15_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL15 register. +// +//***************************************************************************** +#define USB_TXCSRL15_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL15_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL15_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL15_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL15_STALL 0x00000010 // Send STALL +#define USB_TXCSRL15_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL15_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL15_ERROR 0x00000004 // Error +#define USB_TXCSRL15_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL15_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH15 register. +// +//***************************************************************************** +#define USB_TXCSRH15_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH15_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH15_MODE 0x00000020 // Mode +#define USB_TXCSRH15_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH15_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH15_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH15_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH15_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP15 register. +// +//***************************************************************************** +#define USB_RXMAXP15_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP15_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL15 register. +// +//***************************************************************************** +#define USB_RXCSRL15_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL15_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL15_STALL 0x00000020 // Send STALL +#define USB_RXCSRL15_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL15_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL15_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL15_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL15_ERROR 0x00000004 // Error +#define USB_RXCSRL15_OVER 0x00000004 // Overrun +#define USB_RXCSRL15_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL15_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH15 register. +// +//***************************************************************************** +#define USB_RXCSRH15_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH15_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH15_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH15_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH15_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH15_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH15_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH15_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH15_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT15 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT15_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT15_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE15 register. +// +//***************************************************************************** +#define USB_TXTYPE15_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE15_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE15_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE15_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE15_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE15_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE15_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE15_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE15_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE15_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE15_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL15 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL15_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL15_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL15_NAKLMT_S \ + 0 +#define USB_TXINTERVAL15_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE15 register. +// +//***************************************************************************** +#define USB_RXTYPE15_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE15_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE15_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE15_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE15_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE15_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE15_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE15_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE15_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE15_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE15_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL15 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL15_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL15_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL15_TXPOLL_S \ + 0 +#define USB_RXINTERVAL15_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT1 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT1_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT1_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT2 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT2_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT2_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT3 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT3_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT3_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT4 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT4_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT5 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT5_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT6 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT6_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT7 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT7_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT8 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT8_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT8_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT9 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT9_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT9_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT10 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT10_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT10_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT11 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT11_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT11_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT12 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT12_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT12_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT13 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT13_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT13_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT14 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT14_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT14_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT15 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT15_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT15_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_RXDPKTBUFDIS_EP15 0x00008000 // EP15 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP14 0x00004000 // EP14 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP13 0x00002000 // EP13 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP12 0x00001000 // EP12 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP11 0x00000800 // EP11 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP10 0x00000400 // EP10 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP9 0x00000200 // EP9 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP8 0x00000100 // EP8 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP7 0x00000080 // EP7 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP6 0x00000040 // EP6 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP5 0x00000020 // EP5 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP4 0x00000010 // EP4 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP3 0x00000008 // EP3 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP2 0x00000004 // EP2 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP1 0x00000002 // EP1 RX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_TXDPKTBUFDIS_EP15 0x00008000 // EP15 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP14 0x00004000 // EP14 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP13 0x00002000 // EP13 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP12 0x00001000 // EP12 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP11 0x00000800 // EP11 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP10 0x00000400 // EP10 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP9 0x00000200 // EP9 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP8 0x00000100 // EP8 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP7 0x00000080 // EP7 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP6 0x00000040 // EP6 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP5 0x00000020 // EP5 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP4 0x00000010 // EP4 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP3 0x00000008 // EP3 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP2 0x00000004 // EP2 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP1 0x00000002 // EP1 TX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPC register. +// +//***************************************************************************** +#define USB_EPC_PFLTACT_M 0x00000300 // Power Fault Action +#define USB_EPC_PFLTACT_UNCHG 0x00000000 // Unchanged +#define USB_EPC_PFLTACT_TRIS 0x00000100 // Tristate +#define USB_EPC_PFLTACT_LOW 0x00000200 // Low +#define USB_EPC_PFLTACT_HIGH 0x00000300 // High +#define USB_EPC_PFLTAEN 0x00000040 // Power Fault Action Enable +#define USB_EPC_PFLTSEN_HIGH 0x00000020 // Power Fault Sense +#define USB_EPC_PFLTEN 0x00000010 // Power Fault Input Enable +#define USB_EPC_EPENDE 0x00000004 // EPEN Drive Enable +#define USB_EPC_EPEN_M 0x00000003 // External Power Supply Enable + // Configuration +#define USB_EPC_EPEN_LOW 0x00000000 // Power Enable Active Low +#define USB_EPC_EPEN_HIGH 0x00000001 // Power Enable Active High +#define USB_EPC_EPEN_VBLOW 0x00000002 // Power Enable High if VBUS Low +#define USB_EPC_EPEN_VBHIGH 0x00000003 // Power Enable High if VBUS High + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCRIS register. +// +//***************************************************************************** +#define USB_EPCRIS_PF 0x00000001 // USB Power Fault Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCIM register. +// +//***************************************************************************** +#define USB_EPCIM_PF 0x00000001 // USB Power Fault Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCISC register. +// +//***************************************************************************** +#define USB_EPCISC_PF 0x00000001 // USB Power Fault Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRRIS register. +// +//***************************************************************************** +#define USB_DRRIS_RESUME 0x00000001 // RESUME Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRIM register. +// +//***************************************************************************** +#define USB_DRIM_RESUME 0x00000001 // RESUME Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRISC register. +// +//***************************************************************************** +#define USB_DRISC_RESUME 0x00000001 // RESUME Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_GPCS register. +// +//***************************************************************************** +#define USB_GPCS_DEVMODOTG 0x00000002 // Enable Device Mode +#define USB_GPCS_DEVMOD 0x00000001 // Device Mode + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDC register. +// +//***************************************************************************** +#define USB_VDC_VBDEN 0x00000001 // VBUS Droop Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCRIS register. +// +//***************************************************************************** +#define USB_VDCRIS_VD 0x00000001 // VBUS Droop Raw Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCIM register. +// +//***************************************************************************** +#define USB_VDCIM_VD 0x00000001 // VBUS Droop Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCISC register. +// +//***************************************************************************** +#define USB_VDCISC_VD 0x00000001 // VBUS Droop Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVRIS register. +// +//***************************************************************************** +#define USB_IDVRIS_ID 0x00000001 // ID Valid Detect Raw Interrupt + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVIM register. +// +//***************************************************************************** +#define USB_IDVIM_ID 0x00000001 // ID Valid Detect Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVISC register. +// +//***************************************************************************** +#define USB_IDVISC_ID 0x00000001 // ID Valid Detect Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMASEL register. +// +//***************************************************************************** +#define USB_DMASEL_DMACTX_M 0x00F00000 // DMA C TX Select +#define USB_DMASEL_DMACRX_M 0x000F0000 // DMA C RX Select +#define USB_DMASEL_DMABTX_M 0x0000F000 // DMA B TX Select +#define USB_DMASEL_DMABRX_M 0x00000F00 // DMA B RX Select +#define USB_DMASEL_DMAATX_M 0x000000F0 // DMA A TX Select +#define USB_DMASEL_DMAARX_M 0x0000000F // DMA A RX Select +#define USB_DMASEL_DMACTX_S 20 +#define USB_DMASEL_DMACRX_S 16 +#define USB_DMASEL_DMABTX_S 12 +#define USB_DMASEL_DMABRX_S 8 +#define USB_DMASEL_DMAATX_S 4 +#define USB_DMASEL_DMAARX_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_PP register. +// +//***************************************************************************** +#define USB_PP_ECNT_M 0x0000FF00 // Endpoint Count +#define USB_PP_USB_M 0x000000C0 // USB Capability +#define USB_PP_USB_DEVICE 0x00000040 // DEVICE +#define USB_PP_USB_HOSTDEVICE 0x00000080 // HOST +#define USB_PP_USB_OTG 0x000000C0 // OTG +#define USB_PP_PHY 0x00000010 // PHY Present +#define USB_PP_TYPE_M 0x0000000F // Controller Type +#define USB_PP_TYPE_0 0x00000000 // The first-generation USB + // controller +#define USB_PP_ECNT_S 8 + +//***************************************************************************** +// +// The following definitions are deprecated. +// +//***************************************************************************** +#ifndef DEPRECATED + +//***************************************************************************** +// +// The following are deprecated defines for the bit fields in the +// USB_O_TXFIFOADD register. +// +//***************************************************************************** +#define USB_TXFIFOADD_ADDR_2048 0x00000009 // 2048 +#define USB_TXFIFOADD_ADDR_1024 0x00000008 // 1024 +#define USB_TXFIFOADD_ADDR_512 0x00000007 // 512 +#define USB_TXFIFOADD_ADDR_256 0x00000006 // 256 +#define USB_TXFIFOADD_ADDR_128 0x00000005 // 128 +#define USB_TXFIFOADD_ADDR_64 0x00000004 // 64 +#define USB_TXFIFOADD_ADDR_32 0x00000003 // 32 +#define USB_TXFIFOADD_ADDR_16 0x00000002 // 16 +#define USB_TXFIFOADD_ADDR_8 0x00000001 // 8 +#define USB_TXFIFOADD_ADDR_0 0x00000000 // 0 + +//***************************************************************************** +// +// The following are deprecated defines for the bit fields in the +// USB_O_RXFIFOADD register. +// +//***************************************************************************** +#define USB_RXFIFOADD_ADDR_2048 0x00000009 // 2048 +#define USB_RXFIFOADD_ADDR_1024 0x00000008 // 1024 +#define USB_RXFIFOADD_ADDR_512 0x00000007 // 512 +#define USB_RXFIFOADD_ADDR_256 0x00000006 // 256 +#define USB_RXFIFOADD_ADDR_128 0x00000005 // 128 +#define USB_RXFIFOADD_ADDR_64 0x00000004 // 64 +#define USB_RXFIFOADD_ADDR_32 0x00000003 // 32 +#define USB_RXFIFOADD_ADDR_16 0x00000002 // 16 +#define USB_RXFIFOADD_ADDR_8 0x00000001 // 8 +#define USB_RXFIFOADD_ADDR_0 0x00000000 // 0 + +#endif + +#endif // __HW_USB_H__ diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_xbar.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_xbar.h new file mode 100644 index 0000000..7869257 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_xbar.h @@ -0,0 +1,271 @@ +//########################################################################### +// +// FILE: hw_xbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_XBAR_H +#define HW_XBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_FLG1 0x0U // X-Bar Input Flag Register 1 +#define XBAR_O_FLG2 0x2U // X-Bar Input Flag Register 2 +#define XBAR_O_FLG3 0x4U // X-Bar Input Flag Register 3 +#define XBAR_O_CLR1 0x8U // X-Bar Input Flag Clear Register 1 +#define XBAR_O_CLR2 0xAU // X-Bar Input Flag Clear Register 2 +#define XBAR_O_CLR3 0xCU // X-Bar Input Flag Clear Register 3 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG1 register +// +//************************************************************************************************* +#define XBAR_FLG1_CMPSS1_CTRIPL 0x1U // Input Flag for CMPSS1.CTRIPL Signal +#define XBAR_FLG1_CMPSS1_CTRIPH 0x2U // Input Flag for CMPSS1.CTRIPH Signal +#define XBAR_FLG1_CMPSS2_CTRIPL 0x4U // Input Flag for CMPSS2.CTRIPL Signal +#define XBAR_FLG1_CMPSS2_CTRIPH 0x8U // Input Flag for CMPSS2.CTRIPH Signal +#define XBAR_FLG1_CMPSS3_CTRIPL 0x10U // Input Flag for CMPSS3.CTRIPL Signal +#define XBAR_FLG1_CMPSS3_CTRIPH 0x20U // Input Flag for CMPSS3.CTRIPH Signal +#define XBAR_FLG1_CMPSS4_CTRIPL 0x40U // Input Flag for CMPSS4.CTRIPL Signal +#define XBAR_FLG1_CMPSS4_CTRIPH 0x80U // Input Flag for CMPSS4.CTRIPH Signal +#define XBAR_FLG1_CMPSS5_CTRIPL 0x100U // Input Flag for CMPSS5.CTRIPL Signal +#define XBAR_FLG1_CMPSS5_CTRIPH 0x200U // Input Flag for CMPSS5.CTRIPH Signal +#define XBAR_FLG1_CMPSS6_CTRIPL 0x400U // Input Flag for CMPSS6.CTRIPL Signal +#define XBAR_FLG1_CMPSS6_CTRIPH 0x800U // Input Flag for CMPSS6.CTRIPH Signal +#define XBAR_FLG1_CMPSS7_CTRIPL 0x1000U // Input Flag for CMPSS7.CTRIPL Signal +#define XBAR_FLG1_CMPSS7_CTRIPH 0x2000U // Input Flag for CMPSS7.CTRIPH Signal +#define XBAR_FLG1_CMPSS8_CTRIPL 0x4000U // Input Flag for CMPSS8.CTRIPL Signal +#define XBAR_FLG1_CMPSS8_CTRIPH 0x8000U // Input Flag for CMPSS8.CTRIPH Signal +#define XBAR_FLG1_CMPSS1_CTRIPOUTL 0x10000U // Input Flag for CMPSS1.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS1_CTRIPOUTH 0x20000U // Input Flag for CMPSS1.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS2_CTRIPOUTL 0x40000U // Input Flag for CMPSS2.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS2_CTRIPOUTH 0x80000U // Input Flag for CMPSS2.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS3_CTRIPOUTL 0x100000U // Input Flag for CMPSS3.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS3_CTRIPOUTH 0x200000U // Input Flag for CMPSS3.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS4_CTRIPOUTL 0x400000U // Input Flag for CMPSS4.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS4_CTRIPOUTH 0x800000U // Input Flag for CMPSS4.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS5_CTRIPOUTL 0x1000000U // Input Flag for CMPSS5.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS5_CTRIPOUTH 0x2000000U // Input Flag for CMPSS5.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS6_CTRIPOUTL 0x4000000U // Input Flag for CMPSS6.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS6_CTRIPOUTH 0x8000000U // Input Flag for CMPSS6.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS7_CTRIPOUTL 0x10000000U // Input Flag for CMPSS7.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS7_CTRIPOUTH 0x20000000U // Input Flag for CMPSS7.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS8_CTRIPOUTL 0x40000000U // Input Flag for CMPSS8.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS8_CTRIPOUTH 0x80000000U // Input Flag for CMPSS8.CTRIPOUTH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG2 register +// +//************************************************************************************************* +#define XBAR_FLG2_INPUT1 0x1U // Input Flag for INPUT1 Signal +#define XBAR_FLG2_INPUT2 0x2U // Input Flag for INPUT2 Signal +#define XBAR_FLG2_INPUT3 0x4U // Input Flag for INPUT3 Signal +#define XBAR_FLG2_INPUT4 0x8U // Input Flag for INPUT4 Signal +#define XBAR_FLG2_INPUT5 0x10U // Input Flag for INPUT5 Signal +#define XBAR_FLG2_INPUT6 0x20U // Input Flag for INPUT6 Signal +#define XBAR_FLG2_ADCSOCAO 0x40U // Input Flag for ADCSOCAO Signal +#define XBAR_FLG2_ADCSOCBO 0x80U // Input Flag for ADCSOCBO Signal +#define XBAR_FLG2_CLB1_OUT4 0x100U // Input Flag for CLB1_OUT4 Signal +#define XBAR_FLG2_CLB1_OUT5 0x200U // Input Flag for CLB1_OUT5 Signal +#define XBAR_FLG2_CLB2_OUT4 0x400U // Input Flag for CLB2_OUT4 Signal +#define XBAR_FLG2_CLB2_OUT5 0x800U // Input Flag for CLB2_OUT5 Signal +#define XBAR_FLG2_CLB3_OUT4 0x1000U // Input Flag for CLB3_OUT4 Signal +#define XBAR_FLG2_CLB3_OUT5 0x2000U // Input Flag for CLB3_OUT5 Signal +#define XBAR_FLG2_CLB4_OUT4 0x4000U // Input Flag for CLB4_OUT4 Signal +#define XBAR_FLG2_CLB4_OUT5 0x8000U // Input Flag for CLB4_OUT5 Signal +#define XBAR_FLG2_ECAP1_OUT 0x10000U // Input Flag for ECAP1.OUT Signal +#define XBAR_FLG2_ECAP2_OUT 0x20000U // Input Flag for ECAP2.OUT Signal +#define XBAR_FLG2_ECAP3_OUT 0x40000U // Input Flag for ECAP3.OUT Signal +#define XBAR_FLG2_ECAP4_OUT 0x80000U // Input Flag for ECAP4.OUT Signal +#define XBAR_FLG2_ECAP5_OUT 0x100000U // Input Flag for ECAP5.OUT Signal +#define XBAR_FLG2_ECAP6_OUT 0x200000U // Input Flag for ECAP6.OUT Signal +#define XBAR_FLG2_EXTSYNCOUT 0x400000U // Input Flag for EXTSYNCOUT Signal +#define XBAR_FLG2_ADCAEVT1 0x800000U // Input Flag for ADCAEVT1 Signal +#define XBAR_FLG2_ADCAEVT2 0x1000000U // Input Flag for ADCAEVT2 Signal +#define XBAR_FLG2_ADCAEVT3 0x2000000U // Input Flag for ADCAEVT3 Signal +#define XBAR_FLG2_ADCAEVT4 0x4000000U // Input Flag for ADCAEVT4 Signal +#define XBAR_FLG2_ADCBEVT1 0x8000000U // Input Flag for ADCBEVT1 Signal +#define XBAR_FLG2_ADCBEVT2 0x10000000U // Input Flag for ADCBEVT2 Signal +#define XBAR_FLG2_ADCBEVT3 0x20000000U // Input Flag for ADCBEVT3 Signal +#define XBAR_FLG2_ADCBEVT4 0x40000000U // Input Flag for ADCBEVT4 Signal +#define XBAR_FLG2_ADCCEVT1 0x80000000U // Input Flag for ADCCEVT1 Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG3 register +// +//************************************************************************************************* +#define XBAR_FLG3_ADCCEVT2 0x1U // Input Flag for ADCCEVT2 Signal +#define XBAR_FLG3_ADCCEVT3 0x2U // Input Flag for ADCCEVT3 Signal +#define XBAR_FLG3_ADCCEVT4 0x4U // Input Flag for ADCCEVT4 Signal +#define XBAR_FLG3_ADCDEVT1 0x8U // Input Flag for ADCDEVT1 Signal +#define XBAR_FLG3_ADCDEVT2 0x10U // Input Flag for ADCDEVT2 Signal +#define XBAR_FLG3_ADCDEVT3 0x20U // Input Flag for ADCDEVT3 Signal +#define XBAR_FLG3_ADCDEVT4 0x40U // Input Flag for ADCDEVT4 Signal +#define XBAR_FLG3_SD1FLT1_COMPL 0x80U // Input Flag for SD1FLT1.COMPL Signal +#define XBAR_FLG3_SD1FLT1_COMPH 0x100U // Input Flag for SD1FLT1.COMPH Signal +#define XBAR_FLG3_SD1FLT2_COMPL 0x200U // Input Flag for SD1FLT2.COMPL Signal +#define XBAR_FLG3_SD1FLT2_COMPH 0x400U // Input Flag for SD1FLT2.COMPH Signal +#define XBAR_FLG3_SD1FLT3_COMPL 0x800U // Input Flag for SD1FLT3.COMPL Signal +#define XBAR_FLG3_SD1FLT3_COMPH 0x1000U // Input Flag for SD1FLT3.COMPH Signal +#define XBAR_FLG3_SD1FLT4_COMPL 0x2000U // Input Flag for SD1FLT4.COMPL Signal +#define XBAR_FLG3_SD1FLT4_COMPH 0x4000U // Input Flag for SD1FLT4.COMPH Signal +#define XBAR_FLG3_SD2FLT1_COMPL 0x8000U // Input Flag for SD2FLT1.COMPL Signal +#define XBAR_FLG3_SD2FLT1_COMPH 0x10000U // Input Flag for SD2FLT1.COMPH Signal +#define XBAR_FLG3_SD2FLT2_COMPL 0x20000U // Input Flag for SD2FLT2.COMPL Signal +#define XBAR_FLG3_SD2FLT2_COMPH 0x40000U // Input Flag for SD2FLT2.COMPH Signal +#define XBAR_FLG3_SD2FLT3_COMPL 0x80000U // Input Flag for SD2FLT3.COMPL Signal +#define XBAR_FLG3_SD2FLT3_COMPH 0x100000U // Input Flag for SD2FLT3.COMPH Signal +#define XBAR_FLG3_SD2FLT4_COMPL 0x200000U // Input Flag for SD2FLT4.COMPL Signal +#define XBAR_FLG3_SD2FLT4_COMPH 0x400000U // Input Flag for SD2FLT4.COMPH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR1 register +// +//************************************************************************************************* +#define XBAR_CLR1_CMPSS1_CTRIPL 0x1U // Input Flag Clear for CMPSS1.CTRIPL Signal +#define XBAR_CLR1_CMPSS1_CTRIPH 0x2U // Input Flag Clear for CMPSS1.CTRIPH Signal +#define XBAR_CLR1_CMPSS2_CTRIPL 0x4U // Input Flag Clear for CMPSS2.CTRIPL Signal +#define XBAR_CLR1_CMPSS2_CTRIPH 0x8U // Input Flag Clear for CMPSS2.CTRIPH Signal +#define XBAR_CLR1_CMPSS3_CTRIPL 0x10U // Input Flag Clear for CMPSS3.CTRIPL Signal +#define XBAR_CLR1_CMPSS3_CTRIPH 0x20U // Input Flag Clear for CMPSS3.CTRIPH Signal +#define XBAR_CLR1_CMPSS4_CTRIPL 0x40U // Input Flag Clear for CMPSS4.CTRIPL Signal +#define XBAR_CLR1_CMPSS4_CTRIPH 0x80U // Input Flag Clear for CMPSS4.CTRIPH Signal +#define XBAR_CLR1_CMPSS5_CTRIPL 0x100U // Input Flag Clear for CMPSS5.CTRIPL Signal +#define XBAR_CLR1_CMPSS5_CTRIPH 0x200U // Input Flag Clear for CMPSS5.CTRIPH Signal +#define XBAR_CLR1_CMPSS6_CTRIPL 0x400U // Input Flag Clear for CMPSS6.CTRIPL Signal +#define XBAR_CLR1_CMPSS6_CTRIPH 0x800U // Input Flag Clear for CMPSS6.CTRIPH Signal +#define XBAR_CLR1_CMPSS7_CTRIPL 0x1000U // Input Flag Clear for CMPSS7.CTRIPL Signal +#define XBAR_CLR1_CMPSS7_CTRIPH 0x2000U // Input Flag Clear for CMPSS7.CTRIPH Signal +#define XBAR_CLR1_CMPSS8_CTRIPL 0x4000U // Input Flag Clear for CMPSS8.CTRIPL Signal +#define XBAR_CLR1_CMPSS8_CTRIPH 0x8000U // Input Flag Clear for CMPSS8.CTRIPH Signal +#define XBAR_CLR1_CMPSS1_CTRIPOUTL 0x10000U // Input Flag Clear for CMPSS1.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS1_CTRIPOUTH 0x20000U // Input Flag Clear for CMPSS1.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS2_CTRIPOUTL 0x40000U // Input Flag Clear for CMPSS2.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS2_CTRIPOUTH 0x80000U // Input Flag Clear for CMPSS2.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS3_CTRIPOUTL 0x100000U // Input Flag Clear for CMPSS3.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS3_CTRIPOUTH 0x200000U // Input Flag Clear for CMPSS3.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS4_CTRIPOUTL 0x400000U // Input Flag Clear for CMPSS4.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS4_CTRIPOUTH 0x800000U // Input Flag Clear for CMPSS4.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS5_CTRIPOUTL 0x1000000U // Input Flag Clear for CMPSS5.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS5_CTRIPOUTH 0x2000000U // Input Flag Clear for CMPSS5.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS6_CTRIPOUTL 0x4000000U // Input Flag Clear for CMPSS6.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS6_CTRIPOUTH 0x8000000U // Input Flag Clear for CMPSS6.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS7_CTRIPOUTL 0x10000000U // Input Flag Clear for CMPSS7.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS7_CTRIPOUTH 0x20000000U // Input Flag Clear for CMPSS7.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS8_CTRIPOUTL 0x40000000U // Input Flag Clear for CMPSS8.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS8_CTRIPOUTH 0x80000000U // Input Flag Clear for CMPSS8.CTRIPOUTH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR2 register +// +//************************************************************************************************* +#define XBAR_CLR2_INPUT1 0x1U // Input Flag Clear for INPUT1 Signal +#define XBAR_CLR2_INPUT2 0x2U // Input Flag Clear for INPUT2 Signal +#define XBAR_CLR2_INPUT3 0x4U // Input Flag Clear for INPUT3 Signal +#define XBAR_CLR2_INPUT4 0x8U // Input Flag Clear for INPUT4 Signal +#define XBAR_CLR2_INPUT5 0x10U // Input Flag Clear for INPUT5 Signal +#define XBAR_CLR2_INPUT7 0x20U // Input Flag Clear for INPUT7 Signal +#define XBAR_CLR2_ADCSOCAO 0x40U // Input Flag Clear for ADCSOCAO Signal +#define XBAR_CLR2_ADCSOCBO 0x80U // Input Flag Clear for ADCSOCBO Signal +#define XBAR_CLR2_CLB1_OUT4 0x100U // Input Flag Clear for CLB1_OUT4 Signal +#define XBAR_CLR2_CLB1_OUT5 0x200U // Input Flag Clear for CLB1_OUT5 Signal +#define XBAR_CLR2_CLB2_OUT4 0x400U // Input Flag Clear for CLB2_OUT4 Signal +#define XBAR_CLR2_CLB2_OUT5 0x800U // Input Flag Clear for CLB2_OUT5 Signal +#define XBAR_CLR2_CLB3_OUT4 0x1000U // Input Flag Clear for CLB3_OUT4 Signal +#define XBAR_CLR2_CLB3_OUT5 0x2000U // Input Flag Clear for CLB3_OUT5 Signal +#define XBAR_CLR2_CLB4_OUT4 0x4000U // Input Flag Clear for CLB4_OUT4 Signal +#define XBAR_CLR2_CLB4_OUT5 0x8000U // Input Flag Clear for CLB4_OUT5 Signal +#define XBAR_CLR2_ECAP1_OUT 0x10000U // Input Flag Clear for ECAP1.OUT Signal +#define XBAR_CLR2_ECAP2_OUT 0x20000U // Input Flag Clear for ECAP2.OUT Signal +#define XBAR_CLR2_ECAP3_OUT 0x40000U // Input Flag Clear for ECAP3.OUT Signal +#define XBAR_CLR2_ECAP4_OUT 0x80000U // Input Flag Clear for ECAP4.OUT Signal +#define XBAR_CLR2_ECAP5_OUT 0x100000U // Input Flag Clear for ECAP5.OUT Signal +#define XBAR_CLR2_ECAP6_OUT 0x200000U // Input Flag Clear for ECAP6.OUT Signal +#define XBAR_CLR2_EXTSYNCOUT 0x400000U // Input Flag Clear for EXTSYNCOUT Signal +#define XBAR_CLR2_ADCAEVT1 0x800000U // Input Flag Clear for ADCAEVT1 Signal +#define XBAR_CLR2_ADCAEVT2 0x1000000U // Input Flag Clear for ADCAEVT2 Signal +#define XBAR_CLR2_ADCAEVT3 0x2000000U // Input Flag Clear for ADCAEVT3 Signal +#define XBAR_CLR2_ADCAEVT4 0x4000000U // Input Flag Clear for ADCAEVT4 Signal +#define XBAR_CLR2_ADCBEVT1 0x8000000U // Input Flag Clear for ADCBEVT1 Signal +#define XBAR_CLR2_ADCBEVT2 0x10000000U // Input Flag Clear for ADCBEVT2 Signal +#define XBAR_CLR2_ADCBEVT3 0x20000000U // Input Flag Clear for ADCBEVT3 Signal +#define XBAR_CLR2_ADCBEVT4 0x40000000U // Input Flag Clear for ADCBEVT4 Signal +#define XBAR_CLR2_ADCCEVT1 0x80000000U // Input Flag Clear for ADCCEVT1 Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR3 register +// +//************************************************************************************************* +#define XBAR_CLR3_ADCCEVT2 0x1U // Input Flag Clear for ADCCEVT2 Signal +#define XBAR_CLR3_ADCCEVT3 0x2U // Input Flag Clear for ADCCEVT3 Signal +#define XBAR_CLR3_ADCCEVT4 0x4U // Input Flag Clear for ADCCEVT4 Signal +#define XBAR_CLR3_ADCDEVT1 0x8U // Input Flag Clear for ADCDEVT1 Signal +#define XBAR_CLR3_ADCDEVT2 0x10U // Input Flag Clear for ADCDEVT2 Signal +#define XBAR_CLR3_ADCDEVT3 0x20U // Input Flag Clear for ADCDEVT3 Signal +#define XBAR_CLR3_ADCDEVT4 0x40U // Input Flag Clear for ADCDEVT4 Signal +#define XBAR_CLR3_SD1FLT1_COMPL 0x80U // Input Flag Clear for SD1FLT1.COMPL Signal +#define XBAR_CLR3_SD1FLT1_COMPH 0x100U // Input Flag Clear for SD1FLT1.COMPH Signal +#define XBAR_CLR3_SD1FLT2_COMPL 0x200U // Input Flag Clear for SD1FLT2.COMPL Signal +#define XBAR_CLR3_SD1FLT2_COMPH 0x400U // Input Flag Clear for SD1FLT2.COMPH Signal +#define XBAR_CLR3_SD1FLT3_COMPL 0x800U // Input Flag Clear for SD1FLT3.COMPL Signal +#define XBAR_CLR3_SD1FLT3_COMPH 0x1000U // Input Flag Clear for SD1FLT3.COMPH Signal +#define XBAR_CLR3_SD1FLT4_COMPL 0x2000U // Input Flag Clear for SD1FLT4.COMPL Signal +#define XBAR_CLR3_SD1FLT4_COMPH 0x4000U // Input Flag Clear for SD1FLT4.COMPH Signal +#define XBAR_CLR3_SD2FLT1_COMPL 0x8000U // Input Flag Clear for SD2FLT1.COMPL Signal +#define XBAR_CLR3_SD2FLT1_COMPH 0x10000U // Input Flag Clear for SD2FLT1.COMPH Signal +#define XBAR_CLR3_SD2FLT2_COMPL 0x20000U // Input Flag Clear for SD2FLT2.COMPL Signal +#define XBAR_CLR3_SD2FLT2_COMPH 0x40000U // Input Flag Clear for SD2FLT2.COMPH Signal +#define XBAR_CLR3_SD2FLT3_COMPL 0x80000U // Input Flag Clear for SD2FLT3.COMPL Signal +#define XBAR_CLR3_SD2FLT3_COMPH 0x100000U // Input Flag Clear for SD2FLT3.COMPH Signal +#define XBAR_CLR3_SD2FLT4_COMPL 0x200000U // Input Flag Clear for SD2FLT4.COMPL Signal +#define XBAR_CLR3_SD2FLT4_COMPH 0x400000U // Input Flag Clear for SD2FLT4.COMPH Signal + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/inc/hw_xint.h b/gpio_bitfield_cpu2/device/driverlib/inc/hw_xint.h new file mode 100644 index 0000000..677c2f9 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/inc/hw_xint.h @@ -0,0 +1,108 @@ +//########################################################################### +// +// FILE: hw_xint.h +// +// TITLE: Definitions for the XINT registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_XINT_H +#define HW_XINT_H + +//************************************************************************************************* +// +// The following are defines for the XINT register offsets +// +//************************************************************************************************* +#define XINT_O_1CR 0x0U // XINT1 configuration register +#define XINT_O_2CR 0x1U // XINT2 configuration register +#define XINT_O_3CR 0x2U // XINT3 configuration register +#define XINT_O_4CR 0x3U // XINT4 configuration register +#define XINT_O_5CR 0x4U // XINT5 configuration register +#define XINT_O_1CTR 0x8U // XINT1 counter register +#define XINT_O_2CTR 0x9U // XINT2 counter register +#define XINT_O_3CTR 0xAU // XINT3 counter register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT1CR register +// +//************************************************************************************************* +#define XINT_1CR_ENABLE 0x1U // XINT1 Enable +#define XINT_1CR_POLARITY_S 2U +#define XINT_1CR_POLARITY_M 0xCU // XINT1 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT2CR register +// +//************************************************************************************************* +#define XINT_2CR_ENABLE 0x1U // XINT2 Enable +#define XINT_2CR_POLARITY_S 2U +#define XINT_2CR_POLARITY_M 0xCU // XINT2 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT3CR register +// +//************************************************************************************************* +#define XINT_3CR_ENABLE 0x1U // XINT3 Enable +#define XINT_3CR_POLARITY_S 2U +#define XINT_3CR_POLARITY_M 0xCU // XINT3 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT4CR register +// +//************************************************************************************************* +#define XINT_4CR_ENABLE 0x1U // XINT4 Enable +#define XINT_4CR_POLARITY_S 2U +#define XINT_4CR_POLARITY_M 0xCU // XINT4 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT5CR register +// +//************************************************************************************************* +#define XINT_5CR_ENABLE 0x1U // XINT5 Enable +#define XINT_5CR_POLARITY_S 2U +#define XINT_5CR_POLARITY_M 0xCU // XINT5 Polarity + + + +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/interrupt.c b/gpio_bitfield_cpu2/device/driverlib/interrupt.c new file mode 100644 index 0000000..4d628ce --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/interrupt.c @@ -0,0 +1,425 @@ +//########################################################################### +// +// FILE: interrupt.c +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "interrupt.h" + +//***************************************************************************** +// +//! \internal +//! Clears the IFR flag in the CPU. +//! +//! \param group specifies the interrupt group to be cleared. +//! +//! This function clears the IFR flag. This switch is needed because the +//! clearing of the IFR can only be done with a constant. +// +//***************************************************************************** +static void Interrupt_clearIFR(uint16_t group) +{ + switch(group) + { + case 0x0001U: + IFR &= ~(uint16_t)0x0001U; + break; + case 0x0002U: + IFR &= ~(uint16_t)0x0002U; + break; + case 0x0004U: + IFR &= ~(uint16_t)0x0004U; + break; + case 0x0008U: + IFR &= ~(uint16_t)0x0008U; + break; + case 0x0010U: + IFR &= ~(uint16_t)0x0010U; + break; + case 0x0020U: + IFR &= ~(uint16_t)0x0020U; + break; + case 0x0040U: + IFR &= ~(uint16_t)0x0040U; + break; + case 0x0080U: + IFR &= ~(uint16_t)0x0080U; + break; + case 0x0100U: + IFR &= ~(uint16_t)0x0100U; + break; + case 0x0200U: + IFR &= ~(uint16_t)0x0200U; + break; + case 0x0400U: + IFR &= ~(uint16_t)0x0400U; + break; + case 0x0800U: + IFR &= ~(uint16_t)0x0800U; + break; + case 0x1000U: + IFR &= ~(uint16_t)0x1000U; + break; + case 0x2000U: + IFR &= ~(uint16_t)0x2000U; + break; + case 0x4000U: + IFR &= ~(uint16_t)0x4000U; + break; + case 0x8000U: + IFR &= ~(uint16_t)0x8000U; + break; + default: + // + // Invalid group mask. + // + ASSERT((bool)false); + break; + } +} + +//***************************************************************************** +// +// Interrupt_initModule +// +//***************************************************************************** +void +Interrupt_initModule(void) +{ + // + // Disable and clear all interrupts at the CPU + // + (void)Interrupt_disableGlobal(); + IER = 0x0000U; + IFR = 0x0000U; + + // + // Clear all PIEIER registers + // + HWREGH(PIECTRL_BASE + PIE_O_IER1) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER2) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER3) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER4) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER5) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER6) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER7) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER8) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER9) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER10) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER11) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER12) = 0U; + + // + // Clear all PIEIFR registers + // + HWREGH(PIECTRL_BASE + PIE_O_IFR1) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR2) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR3) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR4) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR5) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR6) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR7) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR8) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR9) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR10) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR11) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR12) = 0U; + + // + // Enable vector fetching from PIE block + // + HWREGH(PIECTRL_BASE + PIE_O_CTRL) |= PIE_CTRL_ENPIE; + +} + +//***************************************************************************** +// +//! The default interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_defaultHandler(void) +{ + uint16_t pieVect; + uint16_t vectID; + + // + // Calculate the vector ID. If the vector is in the lower PIE, it's the + // offset of the vector that was fetched (bits 7:1 of PIECTRL.PIEVECT) + // divided by two. + // + pieVect = HWREGH(PIECTRL_BASE + PIE_O_CTRL); + vectID = (pieVect & 0xFEU) >> 1U; + + // + // If the vector is in the upper PIE, the vector ID is 128 or higher. + // + if(pieVect >= 0x0E00U) + { + vectID += 128U; + } + + // + // Something has gone wrong. An interrupt without a proper registered + // handler function has occurred. To help you debug the issue, local + // variable vectID contains the vector ID of the interrupt that occurred. + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +//! The default illegal instruction trap interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_illegalOperationHandler(void) +{ + // + // Something has gone wrong. The CPU has tried to execute an illegal + // instruction, generating an illegal instruction trap (ITRAP). + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +//! The default non-maskable interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_nmiHandler(void) +{ + // + // A non-maskable interrupt has occurred, indicating that a hardware error + // has occurred in the system. You can use SysCtl_getNMIFlagStatus() to + // to read the NMIFLG register and determine what caused the NMI. + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +// Interrupt_initVectorTable +// +//***************************************************************************** +void +Interrupt_initVectorTable(void) +{ + uint16_t i; + + EALLOW; + + // + // We skip the first three locations because they are initialized by Boot + // ROM with boot variables. + // + for(i = 3U; i < 224U; i++) + { + HWREG(PIEVECTTABLE_BASE + (2U * i)) = + (uint32_t)Interrupt_defaultHandler; + } + + // + // NMI and ITRAP get their own handlers. + // + HWREG(PIEVECTTABLE_BASE + ((INT_NMI >> 16U) * 2U)) = + (uint32_t)Interrupt_nmiHandler; + HWREG(PIEVECTTABLE_BASE + ((INT_ILLEGAL >> 16U) * 2U)) = + (uint32_t)Interrupt_illegalOperationHandler; + + EDIS; +} + +//***************************************************************************** +// +//Interrupt_enable +// +//***************************************************************************** +void +Interrupt_enable(uint32_t interruptNumber) +{ + bool intsDisabled; + uint16_t intGroup; + uint16_t groupMask; + uint16_t vectID; + + vectID = (uint16_t)(interruptNumber >> 16U); + + // + // Globally disable interrupts but save status + // + intsDisabled = Interrupt_disableGlobal(); + + // + // PIE Interrupts + // + if(vectID >= 0x20U) + { + intGroup = (uint16_t)(((interruptNumber & 0xFF00UL) >> 8U) - 1U); + groupMask = (uint16_t)1U << intGroup; + + HWREGH((PIECTRL_BASE + PIE_O_IER1 + (intGroup * 2U))) |= + (uint16_t)1U << ((interruptNumber & 0xFFU) - 1U); + + // + // Enable PIE Group Interrupt + // + IER |= groupMask; + } + + // + // INT13, INT14, DLOGINT, & RTOSINT + // + else if((vectID >= 0x0DU) && (vectID <= 0x10U)) + { + IER |= (uint16_t)1U << (vectID - 1U); + } + else + { + // + // Other interrupts + // + } + + // + // Re-enable interrupts if they were enabled + // + if(!intsDisabled) + { + (void)Interrupt_enableGlobal(); + } +} + +//***************************************************************************** +// +// Interrupt_disable +// +//***************************************************************************** +void +Interrupt_disable(uint32_t interruptNumber) +{ + bool intsDisabled; + uint16_t intGroup; + uint16_t groupMask; + uint16_t vectID; + + vectID = (uint16_t)(interruptNumber >> 16U); + + intsDisabled = Interrupt_disableGlobal(); + + // + // PIE Interrupts + // + if(vectID >= 0x20U) + { + intGroup = (uint16_t)(((interruptNumber & 0xFF00UL) >> 8U) - 1U); + groupMask = (uint16_t)1U << intGroup; + + // + // Disable individual PIE interrupt + // + HWREGH((PIECTRL_BASE + PIE_O_IER1 + (intGroup * 2U))) &= + ~(1U << ((interruptNumber & 0xFFUL) - 1U)); + + // + // Wait for any pending interrupts to get to the CPU + // + NOP; + NOP; + NOP; + NOP; + NOP; + + Interrupt_clearIFR(groupMask); + + // + // Acknowledge any interrupts + // + HWREGH(PIECTRL_BASE + PIE_O_ACK) = groupMask; + } + + // + // INT13, INT14, DLOGINT, & RTOSINT + // + else if((vectID >= 0x0DU) && (vectID <= 0x10U)) + { + IER &= ~((uint16_t)1U << (vectID - 1U)); + + // + // Wait for any pending interrupts to get to the CPU + // + NOP; + NOP; + NOP; + NOP; + NOP; + + Interrupt_clearIFR((uint16_t)1U << (vectID - 1U)); + } + else + { + // + // Other interrupts + // + } + + // + // Re-enable interrupts if they were enabled + // + if(!intsDisabled) + { + (void)Interrupt_enableGlobal(); + } +} diff --git a/gpio_bitfield_cpu2/device/driverlib/interrupt.h b/gpio_bitfield_cpu2/device/driverlib/interrupt.h new file mode 100644 index 0000000..05a555a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/interrupt.h @@ -0,0 +1,497 @@ +//########################################################################### +// +// FILE: interrupt.h +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup interrupt_api Interrupt +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_pie.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following are values that can be passed to the Interrupt_enableInCPU() +// and Interrupt_disableInCPU() functions as the cpuInterrupt parameter. +// +//***************************************************************************** +#define INTERRUPT_CPU_INT1 0x1U //!< CPU Interrupt Number 1 +#define INTERRUPT_CPU_INT2 0x2U //!< CPU Interrupt Number 2 +#define INTERRUPT_CPU_INT3 0x4U //!< CPU Interrupt Number 3 +#define INTERRUPT_CPU_INT4 0x8U //!< CPU Interrupt Number 4 +#define INTERRUPT_CPU_INT5 0x10U //!< CPU Interrupt Number 5 +#define INTERRUPT_CPU_INT6 0x20U //!< CPU Interrupt Number 6 +#define INTERRUPT_CPU_INT7 0x40U //!< CPU Interrupt Number 7 +#define INTERRUPT_CPU_INT8 0x80U //!< CPU Interrupt Number 8 +#define INTERRUPT_CPU_INT9 0x100U //!< CPU Interrupt Number 9 +#define INTERRUPT_CPU_INT10 0x200U //!< CPU Interrupt Number 10 +#define INTERRUPT_CPU_INT11 0x400U //!< CPU Interrupt Number 11 +#define INTERRUPT_CPU_INT12 0x800U //!< CPU Interrupt Number 12 +#define INTERRUPT_CPU_INT13 0x1000U //!< CPU Interrupt Number 13 +#define INTERRUPT_CPU_INT14 0x2000U //!< CPU Interrupt Number 14 +#define INTERRUPT_CPU_DLOGINT 0x4000U //!< CPU Data Log Interrupt +#define INTERRUPT_CPU_RTOSINT 0x8000U //!< CPU RTOS Interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the Interrupt_clearACKGroup() +// function as the group parameter. +// +//***************************************************************************** +#define INTERRUPT_ACK_GROUP1 0x1U //!< Acknowledge PIE Interrupt Group 1 +#define INTERRUPT_ACK_GROUP2 0x2U //!< Acknowledge PIE Interrupt Group 2 +#define INTERRUPT_ACK_GROUP3 0x4U //!< Acknowledge PIE Interrupt Group 3 +#define INTERRUPT_ACK_GROUP4 0x8U //!< Acknowledge PIE Interrupt Group 4 +#define INTERRUPT_ACK_GROUP5 0x10U //!< Acknowledge PIE Interrupt Group 5 +#define INTERRUPT_ACK_GROUP6 0x20U //!< Acknowledge PIE Interrupt Group 6 +#define INTERRUPT_ACK_GROUP7 0x40U //!< Acknowledge PIE Interrupt Group 7 +#define INTERRUPT_ACK_GROUP8 0x80U //!< Acknowledge PIE Interrupt Group 8 +#define INTERRUPT_ACK_GROUP9 0x100U //!< Acknowledge PIE Interrupt Group 9 +#define INTERRUPT_ACK_GROUP10 0x200U //!< Acknowledge PIE Interrupt Group 10 +#define INTERRUPT_ACK_GROUP11 0x400U //!< Acknowledge PIE Interrupt Group 11 +#define INTERRUPT_ACK_GROUP12 0x800U //!< Acknowledge PIE Interrupt Group 12 +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! The default interrupt handler. +//! +//! This is the default interrupt handler. The Interrupt_initVectorTable() +//! function sets all vectors to this function. Also, when an interrupt is +//! unregistered using the Interrupt_unregister() function, this handler takes +//! its place. This should never be called during normal operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with an +//! appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_defaultHandler(void); + +//***************************************************************************** +// +//! \internal +//! The default illegal instruction trap interrupt handler. +//! +//! This is the default interrupt handler for an illegal instruction trap +//! (ITRAP). The Interrupt_initVectorTable() function sets the appropriate +//! vector to this function. This should never be called during normal +//! operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with +//! an appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_illegalOperationHandler(void); + +//***************************************************************************** +// +//! \internal +//! The default non-maskable interrupt handler. +//! +//! This is the default interrupt handler for a non-maskable interrupt (NMI). +//! The Interrupt_initVectorTable() function sets the appropriate vector to +//! this function. This should never be called during normal operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with an +//! appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_nmiHandler(void); + +//***************************************************************************** +// +//! Allows the CPU to process interrupts. +//! +//! This function clears the global interrupt mask bit (INTM) in the CPU, +//! allowing the processor to respond to interrupts. +//! +//! \return Returns \b true if interrupts were disabled when the function was +//! called or \b false if they were initially enabled. +// +//***************************************************************************** +static inline bool +Interrupt_enableGlobal(void) +{ + // + // Enable processor interrupts. + // + return(((__enable_interrupts() & 0x1U) != 0U) ? true : false); +} + +//***************************************************************************** +// +//! Stops the CPU from processing interrupts. +//! +//! This function sets the global interrupt mask bit (INTM) in the CPU, +//! preventing the processor from receiving maskable interrupts. +//! +//! \return Returns \b true if interrupts were already disabled when the +//! function was called or \b false if they were initially enabled. +// +//***************************************************************************** +static inline bool +Interrupt_disableGlobal(void) +{ + // + // Disable processor interrupts. + // + return(((__disable_interrupts() & 0x1U) != 0U) ? true : false); +} + +//***************************************************************************** +// +//! Registers a function to be called when an interrupt occurs. +//! +//! \param interruptNumber specifies the interrupt in question. +//! \param handler is a pointer to the function to be called. +//! +//! This function is used to specify the handler function to be called when the +//! given interrupt is asserted to the processor. When the interrupt occurs, +//! if it is enabled (via Interrupt_enable()), the handler function will be +//! called in interrupt context. Since the handler function can preempt other +//! code, care must be taken to protect memory or peripherals that are accessed +//! by the handler and other non-handler code. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \note This function assumes that the PIE has been enabled. See +//! Interrupt_initModule(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_register(uint32_t interruptNumber, void (*handler)(void)) +{ + uint32_t address; + + // + // Calculate appropriate address for the interrupt number + // + address = (uint32_t)PIEVECTTABLE_BASE + + (((interruptNumber & 0xFFFF0000U) >> 16U) * 2U); + + // + // Copy ISR address into PIE table + // + EALLOW; + HWREG(address) = (uint32_t)handler; + EDIS; +} + +//***************************************************************************** +// +//! Unregisters the function to be called when an interrupt occurs. +//! +//! \param interruptNumber specifies the interrupt in question. +//! +//! This function is used to indicate that a default handler +//! Interrupt_defaultHandler() should be called when the given interrupt is +//! asserted to the processor. Call Interrupt_disable() to disable +//! the interrupt before calling this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \sa Interrupt_register() for important information about registering +//! interrupt handlers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_unregister(uint32_t interruptNumber) +{ + uint32_t address; + + // + // Calculate appropriate address for the interrupt number + // + address = (uint32_t)PIEVECTTABLE_BASE + + (((interruptNumber & 0xFFFF0000U) >> 16U) * 2U); + + // + // Copy default ISR address into PIE table + // + EALLOW; + HWREG(address) = (uint32_t)Interrupt_defaultHandler; + EDIS; +} + +//***************************************************************************** +// +//! Enables CPU interrupt channels +//! +//! \param cpuInterrupt specifies the CPU interrupts to be enabled. +//! +//! This function enables the specified interrupts in the CPU. The +//! \e cpuInterrupt parameter is a logical OR of the values +//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14, +//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT. +//! +//! \note Note that interrupts 1-12 correspond to the PIE groups with those +//! same numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_enableInCPU(uint16_t cpuInterrupt) +{ + // + // Set the interrupt bits in the CPU. + // + IER |= cpuInterrupt; +} + +//***************************************************************************** +// +//! Disables CPU interrupt channels +//! +//! \param cpuInterrupt specifies the CPU interrupts to be disabled. +//! +//! This function disables the specified interrupts in the CPU. The +//! \e cpuInterrupt parameter is a logical OR of the values +//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14, +//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT. +//! +//! \note Note that interrupts 1-12 correspond to the PIE groups with those +//! same numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_disableInCPU(uint16_t cpuInterrupt) +{ + // + // Clear the interrupt bits in the CPU. + // + IER &= ~cpuInterrupt; +} + +//***************************************************************************** +// +//! Acknowledges PIE Interrupt Group +//! +//! \param group specifies the interrupt group to be acknowledged. +//! +//! The specified interrupt group is acknowledged and clears any interrupt +//! flag within that respective group. +//! +//! The \e group parameter must be a logical OR of the following: +//! \b INTERRUPT_ACK_GROUP1, \b INTERRUPT_ACK_GROUP2, \b INTERRUPT_ACK_GROUP3 +//! \b INTERRUPT_ACK_GROUP4, \b INTERRUPT_ACK_GROUP5, \b INTERRUPT_ACK_GROUP6 +//! \b INTERRUPT_ACK_GROUP7, \b INTERRUPT_ACK_GROUP8, \b INTERRUPT_ACK_GROUP9 +//! \b INTERRUPT_ACK_GROUP10, \b INTERRUPT_ACK_GROUP11, +//! \b INTERRUPT_ACK_GROUP12. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_clearACKGroup(uint16_t group) +{ + // + // Set interrupt group acknowledge bits + // + HWREGH(PIECTRL_BASE + PIE_O_ACK) = group; +} + +//***************************************************************************** +// +//! Enables the PIE block. +//! +//! This function enables the vector fetching for the peripheral interrupts by +//! enabling the PIE block. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_enablePIE(void) +{ + HWREGH(PIECTRL_BASE + PIE_O_CTRL) |= PIE_CTRL_ENPIE; +} + +//***************************************************************************** +// +//! Disables the PIE block. +//! +//! This function disables the vector fetching for the peripheral interrupts by +//! disabling the PIE block. PIEACK, PIEIFR, and PIEIER registers can be +//! accessed even when the PIE block is disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_disablePIE(void) +{ + HWREGH(PIECTRL_BASE + PIE_O_CTRL) &= ~PIE_CTRL_ENPIE; +} + +//***************************************************************************** +// +//! Initializes the PIE control registers by setting them to a known state. +//! +//! This function initializes the PIE control registers. After globally +//! disabling interrupts and enabling the PIE, it clears all of the PIE +//! interrupt enable bits and interrupt flags. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_initModule(void); + +//***************************************************************************** +// +//! Initializes the PIE vector table by setting all vectors to a default +//! handler function. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_initVectorTable(void); + +//***************************************************************************** +// +//! Enables an interrupt. +//! +//! \param interruptNumber specifies the interrupt to be enabled. +//! +//! The specified interrupt is enabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_enable(uint32_t interruptNumber); + +//***************************************************************************** +// +//! Disables an interrupt. +//! +//! \param interruptNumber specifies the interrupt to be disabled. +//! +//! The specified interrupt is disabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_disable(uint32_t interruptNumber); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // #ifdef __TMS320C28XX__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // INTERRUPT_H diff --git a/gpio_bitfield_cpu2/device/driverlib/ipc.c b/gpio_bitfield_cpu2/device/driverlib/ipc.c new file mode 100644 index 0000000..8d6982e --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/ipc.c @@ -0,0 +1,445 @@ +//########################################################################### +// +// FILE: ipc.c +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "ipc.h" + +// +// Macros internal to the IPC driver +// + +#define IPC_ADDR_OFFSET_NOCHANGE 2U +#define IPC_ADDR_OFFSET_MUL2 4U +#define IPC_ADDR_OFFSET_DIV2 1U + +#define IPC_ADDR_OFFSET_CORR(addr, corr) (((addr) * (corr)) / 2U) + +#if IPC_MSGQ_SUPPORT == 1U + +// +// Global Circular Buffer Definitions +// + + +#pragma DATA_SECTION(IPC_CPU1_To_CPU2_PutBuffer, "MSGRAM_CPU1_TO_CPU2") +#pragma DATA_SECTION(IPC_CPU1_To_CPU2_GetBuffer, "MSGRAM_CPU2_TO_CPU1") + +// +// IPC_CPU1_To_CPU2_PutBuffer acts as IPC_CPU2_To_CPU1_GetBuffer and +// IPC_CPU1_To_CPU2_GetBuffer acts as IPC_CPU2_To_CPU1_PutBuffer +// +IPC_PutBuffer_t IPC_CPU1_To_CPU2_PutBuffer; +IPC_GetBuffer_t IPC_CPU1_To_CPU2_GetBuffer; +#endif + +const IPC_Instance_t IPC_Instance[IPC_TOTAL_NUM] = { + + /* IPC_CPU1_L_CPU2_R */ + { + .IPC_Flag_Ctr_Reg = (volatile IPC_Flag_Ctr_Reg_t *) IPC_BASE, + .IPC_SendCmd_Reg = (volatile IPC_SendCmd_Reg_t *) + (IPC_BASE + 0x10U), + .IPC_RecvCmd_Reg = (volatile IPC_RecvCmd_Reg_t *) + (IPC_BASE + 0x18U), + .IPC_Boot_Pump_Reg = (volatile IPC_Boot_Pump_Reg_t *) + (IPC_BASE + 0x20U), + .IPC_IntNum = {INT_IPC_0, INT_IPC_1, INT_IPC_2, INT_IPC_3, + 0U, 0U, 0U, 0U}, + .IPC_MsgRam_LtoR = CPU1_TO_CPU2_MSG_RAM_BASE, + .IPC_MsgRam_RtoL = CPU2_TO_CPU1_MSG_RAM_BASE, + .IPC_Offset_Corr = IPC_ADDR_OFFSET_NOCHANGE +#if IPC_MSGQ_SUPPORT == 1U + , + .IPC_PutBuffer = &IPC_CPU1_To_CPU2_PutBuffer, + .IPC_GetBuffer = &IPC_CPU1_To_CPU2_GetBuffer +#endif + }, + + /* IPC_CPU2_L_CPU1_R */ + { + .IPC_Flag_Ctr_Reg = (volatile IPC_Flag_Ctr_Reg_t *) IPC_BASE, + .IPC_SendCmd_Reg = (volatile IPC_SendCmd_Reg_t *) + (IPC_BASE + 0x18U), + .IPC_RecvCmd_Reg = (volatile IPC_RecvCmd_Reg_t *) + (IPC_BASE + 0x10U), + .IPC_Boot_Pump_Reg = (volatile IPC_Boot_Pump_Reg_t *) + (IPC_BASE + 0x20U), + .IPC_IntNum = {INT_IPC_0, INT_IPC_1, INT_IPC_2, INT_IPC_3, + 0U, 0U, 0U, 0U}, + .IPC_MsgRam_LtoR = CPU2_TO_CPU1_MSG_RAM_BASE, + .IPC_MsgRam_RtoL = CPU1_TO_CPU2_MSG_RAM_BASE, + .IPC_Offset_Corr = IPC_ADDR_OFFSET_NOCHANGE +#if IPC_MSGQ_SUPPORT == 1U + , + .IPC_PutBuffer = (IPC_PutBuffer_t *)&IPC_CPU1_To_CPU2_GetBuffer, + .IPC_GetBuffer = (IPC_GetBuffer_t *)&IPC_CPU1_To_CPU2_PutBuffer +#endif + } +}; + +//***************************************************************************** +// +// IPC_sendCommand +// +//***************************************************************************** +bool IPC_sendCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t command, uint32_t addr, uint32_t data) +{ + bool ret; + + // + // Check whether the flags are not busy + // + if((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flags) == 0U) + { + ret = true; + + if(addrCorrEnable) + { + // + // Update the command registers. ADDR register holds the offset + // from the base address of the MSG RAM + // + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDCOM = command; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDDATA = data; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDADDR = + addr - IPC_Instance[ipcType].IPC_MsgRam_LtoR; + } + else + { + // + // Update the command registers. addr param remains as is. + // + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDCOM = command; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDDATA = data; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDADDR = addr; + } + + // + // Set the flags to indicate the remote core + // + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_SET = flags; + } + else + { + ret = false; + } + + return(ret); +} + +//***************************************************************************** +// +// IPC_readCommand +// +//***************************************************************************** +bool IPC_readCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t *command, uint32_t *addr, uint32_t *data) +{ + bool ret; + uint32_t addrReg; + + // + // Check whether the flags are not empty + // + if((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flags) != 0U) + { + ret = true; + + // + // Read the command registers + // + *command = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVCOM; + addrReg = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVADDR; + *data = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVDATA; + + if(addrCorrEnable) + { + // + // Calculate the address form the offset + // + *addr = IPC_Instance[ipcType].IPC_MsgRam_RtoL + + IPC_ADDR_OFFSET_CORR(addrReg, + IPC_Instance[ipcType].IPC_Offset_Corr); + + } + else + { + *addr = addrReg; + } + + } + else + { + ret = false; + } + + return(ret); +} + + +//***************************************************************************** +// +// IPC_registerInterrupt +// +//***************************************************************************** +void IPC_registerInterrupt(IPC_Type_t ipcType, uint32_t ipcInt, + void (*pfnHandler)(void)) +{ + // + // Check for arguments + // + + ASSERT(ipcInt <= IPC_INT3); + + // + // Get the corresponding interrupt number + // + uint32_t intNum = IPC_Instance[ipcType].IPC_IntNum[ipcInt]; + + // + // Register the interrupt handler + // + + Interrupt_register(intNum, pfnHandler); + + // + // Enable the interrupt + // + Interrupt_enable(intNum); +} + +//***************************************************************************** +// +// IPC_unregisterInterrupt +// +//***************************************************************************** +void IPC_unregisterInterrupt(IPC_Type_t ipcType, uint32_t ipcInt) +{ + // + // Check for arguments + // + + ASSERT(ipcInt <= IPC_INT3); + + // + // Get the corresponding interrupt number + // + uint32_t intNum = IPC_Instance[ipcType].IPC_IntNum[ipcInt]; + + // + // Disable the interrupt. + // + Interrupt_disable(intNum); + + // + // Unregister the interrupt handler. + // + + Interrupt_unregister(intNum); +} + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +// IPCinitMessageQueue +// +//***************************************************************************** +void IPC_initMessageQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + uint32_t ipcInt_L, uint32_t ipcInt_R) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(ipcInt_L < IPC_NUM_OF_INTERRUPTS); + ASSERT(ipcInt_R < IPC_NUM_OF_INTERRUPTS); + + IPC_PutBuffer_t *putBuffer = IPC_Instance[ipcType].IPC_PutBuffer; + IPC_GetBuffer_t *getBuffer = IPC_Instance[ipcType].IPC_GetBuffer; + + // + // L->R Put Buffer and Index Initialization + // + msgQueue->PutBuffer = putBuffer->Buffer[ipcInt_R]; + msgQueue->PutWriteIndex = &(putBuffer->PutWriteIndex[ipcInt_R]); + msgQueue->GetReadIndex = &(putBuffer->GetReadIndex[ipcInt_L]); + msgQueue->PutFlag = (uint32_t)1U << ipcInt_R; + + // + // L->R Get Buffer and Index Initialization + // + msgQueue->GetBuffer = getBuffer->Buffer[ipcInt_L]; + msgQueue->GetWriteIndex = &(getBuffer->GetWriteIndex[ipcInt_L]); + msgQueue->PutReadIndex = &(getBuffer->PutReadIndex[ipcInt_R]); + + // + // Initialize PutBuffer WriteIndex = 0 and GetBuffer ReadIndex = 0 + // + *(msgQueue->PutWriteIndex) = 0U; + *(msgQueue->GetReadIndex) = 0U; +} + +//***************************************************************************** +// +// IPC_sendMessageToQueue +// +//***************************************************************************** +bool IPC_sendMessageToQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(msg != NULL); + + uint16_t writeIndex; + uint16_t readIndex; + bool ret = true; + + writeIndex = *(msgQueue->PutWriteIndex); + readIndex = *(msgQueue->PutReadIndex); + + // + // Wait until Put Buffer slot is free + // + while(((writeIndex + 1U) & IPC_MAX_BUFFER_INDEX) == readIndex) + { + // + // If designated as a "Blocking" function, and Put buffer is full, + // return immediately with fail status. + // + if(!block) + { + ret = false; + break; + } + + readIndex = *(msgQueue->PutReadIndex); + } + + if(ret != false) + { + // + // When slot is free, Write Message to PutBuffer, update PutWriteIndex, + // and set the CPU IPC INT Flag + // + msgQueue->PutBuffer[writeIndex] = *msg; + + if(addrCorrEnable) + { + msgQueue->PutBuffer[writeIndex].address -= + IPC_Instance[ipcType].IPC_MsgRam_LtoR; + } + + writeIndex = (writeIndex + 1U) & IPC_MAX_BUFFER_INDEX; + *(msgQueue->PutWriteIndex) = writeIndex; + + IPC_setFlagLtoR(ipcType, msgQueue->PutFlag); + } + + return(ret); +} + +//***************************************************************************** +// +// IPC_readMessageFromQueue +// +//***************************************************************************** +bool IPC_readMessageFromQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(msg != NULL); + + uint16_t writeIndex; + uint16_t readIndex; + bool ret = true; + + writeIndex = *(msgQueue->GetWriteIndex); + readIndex = *(msgQueue->GetReadIndex); + + // + // Loop while GetBuffer is empty + // + while(writeIndex == readIndex) + { + // + // If designated as a "Blocking" function, and Get buffer is empty, + // return immediately with fail status. + // + if(!block) + { + ret = false; + break; + } + + writeIndex = *(msgQueue->GetWriteIndex); + } + + if(ret != false) + { + // + // If there is a message in GetBuffer, Read Message and update + // the ReadIndex + // + *msg = msgQueue->GetBuffer[readIndex]; + if(addrCorrEnable) + { + msg->address = IPC_Instance[ipcType].IPC_MsgRam_RtoL + + IPC_ADDR_OFFSET_CORR(msg->address, + IPC_Instance[ipcType].IPC_Offset_Corr); + } + + readIndex = (readIndex + 1U) & IPC_MAX_BUFFER_INDEX; + *(msgQueue->GetReadIndex) = readIndex; + } + + return(ret); +} +#endif diff --git a/gpio_bitfield_cpu2/device/driverlib/ipc.h b/gpio_bitfield_cpu2/device/driverlib/ipc.h new file mode 100644 index 0000000..8da7688 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/ipc.h @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: ipc.h +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef IPC_H +#define IPC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup ipc_api IPC +//! \brief This module is used for inter-processor communications. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "debug.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ipc.h" +#include "inc/hw_ints.h" +#include "interrupt.h" + +//***************************************************************************** +// +// Defines for the APIs +// +//***************************************************************************** +//***************************************************************************** +// +// Driver configuration macros +// +//***************************************************************************** +#define IPC_MSGQ_SUPPORT 1U + +// +// Number of IPC messages in circular buffer (must be interval of 2) +// +#define IPC_BUFFER_SIZE 4U + +// +// Number of IPC interrupts using circular buffer (must be same number on both +// CPUs) +// +#define IPC_NUM_OF_INTERRUPTS 4U + +//***************************************************************************** +// +// Values that can be passed as parameter flags in all the IPC API functions. +// +//***************************************************************************** +#ifndef IPC_FLAGS_DEFINED +#define IPC_FLAGS_DEFINED +#define IPC_NO_FLAG 0x00000000U //!< NO FLAG +#define IPC_FLAG0 0x00000001U //!< IPC FLAG 0 +#define IPC_FLAG1 0x00000002U //!< IPC FLAG 1 +#define IPC_FLAG2 0x00000004U //!< IPC FLAG 2 +#define IPC_FLAG3 0x00000008U //!< IPC FLAG 3 +#define IPC_FLAG4 0x00000010U //!< IPC FLAG 4 +#define IPC_FLAG5 0x00000020U //!< IPC FLAG 5 +#define IPC_FLAG6 0x00000040U //!< IPC FLAG 6 +#define IPC_FLAG7 0x00000080U //!< IPC FLAG 7 +#define IPC_FLAG8 0x00000100U //!< IPC FLAG 8 +#define IPC_FLAG9 0x00000200U //!< IPC FLAG 9 +#define IPC_FLAG10 0x00000400U //!< IPC FLAG 10 +#define IPC_FLAG11 0x00000800U //!< IPC FLAG 11 +#define IPC_FLAG12 0x00001000U //!< IPC FLAG 12 +#define IPC_FLAG13 0x00002000U //!< IPC FLAG 13 +#define IPC_FLAG14 0x00004000U //!< IPC FLAG 14 +#define IPC_FLAG15 0x00008000U //!< IPC FLAG 15 +#define IPC_FLAG16 0x00010000U //!< IPC FLAG 16 +#define IPC_FLAG17 0x00020000U //!< IPC FLAG 17 +#define IPC_FLAG18 0x00040000U //!< IPC FLAG 18 +#define IPC_FLAG19 0x00080000U //!< IPC FLAG 19 +#define IPC_FLAG20 0x00100000U //!< IPC FLAG 20 +#define IPC_FLAG21 0x00200000U //!< IPC FLAG 21 +#define IPC_FLAG22 0x00400000U //!< IPC FLAG 22 +#define IPC_FLAG23 0x00800000U //!< IPC FLAG 23 +#define IPC_FLAG24 0x01000000U //!< IPC FLAG 24 +#define IPC_FLAG25 0x02000000U //!< IPC FLAG 25 +#define IPC_FLAG26 0x04000000U //!< IPC FLAG 26 +#define IPC_FLAG27 0x08000000U //!< IPC FLAG 27 +#define IPC_FLAG28 0x10000000U //!< IPC FLAG 28 +#define IPC_FLAG29 0x20000000U //!< IPC FLAG 29 +#define IPC_FLAG30 0x40000000U //!< IPC FLAG 30 +#define IPC_FLAG31 0x80000000U //!< IPC FLAG 31 +#define IPC_FLAG_ALL 0xFFFFFFFFU //!< All IPC flags +#endif + +//***************************************************************************** +// +// Values that can be passed as parameter ipcInt in +// IPC_registerInterrupt and IPC_unregisterInterrupt functions. +// Please refer to the datasheet for the actual number of interrupts available +// for each IPC instance +// +//***************************************************************************** +#define IPC_INT0 0x0U //!< IPC Interrupt 0 +#define IPC_INT1 0x1U //!< IPC Interrupt 1 +#define IPC_INT2 0x2U //!< IPC Interrupt 2 +#define IPC_INT3 0x3U //!< IPC Interrupt 3 +#define IPC_INT4 0x4U //!< IPC Interrupt 4 +#define IPC_INT5 0x5U //!< IPC Interrupt 5 +#define IPC_INT6 0x6U //!< IPC Interrupt 6 +#define IPC_INT7 0x7U //!< IPC Interrupt 7 + +//***************************************************************************** +// +// Values that can be passed as parameter addrCorrEnable in +// IPC_sendCommand, IPC_readCommand, IPC_sendMessageToQueue and +// IPC_readMessageFromQueue functions. +// +//***************************************************************************** +#define IPC_ADDR_CORRECTION_ENABLE true +#define IPC_ADDR_CORRECTION_DISABLE false + +//***************************************************************************** +// +// Values that can be passed as parameter block in +// IPC_sendMessageToQueue and IPC_readMessageFromQueue functions. +// +//***************************************************************************** +#define IPC_BLOCKING_CALL true +#define IPC_NONBLOCKING_CALL false + + + +//***************************************************************************** +// +// Internal macros used for message queue implementation +// +//***************************************************************************** +#define IPC_MAX_BUFFER_INDEX (IPC_BUFFER_SIZE - 1U) + +//***************************************************************************** +// +// Enums for the APIs +// +//***************************************************************************** + +//***************************************************************************** +// +//! Values that can be passed as parameter \e ipcType in all the driver +//! functions +// +//***************************************************************************** +typedef enum +{ + IPC_CPU1_L_CPU2_R, //!< CPU1 - Local core, CPU2 - Remote core + IPC_CPU2_L_CPU1_R, //!< CPU2 - Local core, CPU1 - Remote core + IPC_TOTAL_NUM +}IPC_Type_t; + +//***************************************************************************** +// +// Internal structs for register and messaage queue accesses +// +//***************************************************************************** +typedef struct +{ + uint32_t IPC_ACK; + uint32_t IPC_STS; + uint32_t IPC_SET; + uint32_t IPC_CLR; + uint32_t IPC_FLG; + uint32_t IPC_RSVDREG; + uint32_t IPC_COUNTERL; + uint32_t IPC_COUNTERH; +}IPC_Flag_Ctr_Reg_t; + +typedef struct +{ + uint32_t IPC_SENDCOM; + uint32_t IPC_SENDADDR; + uint32_t IPC_SENDDATA; + uint32_t IPC_REMOTEREPLY; +}IPC_SendCmd_Reg_t; + +typedef struct +{ + uint32_t IPC_RECVCOM; + uint32_t IPC_RECVADDR; + uint32_t IPC_RECVDATA; + uint32_t IPC_LOCALREPLY; +}IPC_RecvCmd_Reg_t; + +typedef struct +{ + uint32_t IPC_BOOTSTS; + uint32_t IPC_BOOTMODE; +}IPC_Boot_Pump_Reg_t; + +#if IPC_MSGQ_SUPPORT == 1U +typedef struct +{ + uint32_t command; + uint32_t address; + uint32_t dataw1; + uint32_t dataw2; +}IPC_Message_t; + +typedef struct +{ + IPC_Message_t Buffer[IPC_NUM_OF_INTERRUPTS][IPC_BUFFER_SIZE]; + uint16_t PutWriteIndex[IPC_NUM_OF_INTERRUPTS]; + uint16_t GetReadIndex[IPC_NUM_OF_INTERRUPTS]; +}IPC_PutBuffer_t; + +typedef struct +{ + IPC_Message_t Buffer[IPC_NUM_OF_INTERRUPTS][IPC_BUFFER_SIZE]; + uint16_t GetWriteIndex[IPC_NUM_OF_INTERRUPTS]; + uint16_t PutReadIndex[IPC_NUM_OF_INTERRUPTS]; +}IPC_GetBuffer_t; +#endif + +//***************************************************************************** +// +// Internal struct used to store the required information regarding an IPC +// instance +// +//***************************************************************************** +typedef struct +{ + volatile IPC_Flag_Ctr_Reg_t *IPC_Flag_Ctr_Reg; + volatile IPC_SendCmd_Reg_t *IPC_SendCmd_Reg; + volatile IPC_RecvCmd_Reg_t *IPC_RecvCmd_Reg; + volatile IPC_Boot_Pump_Reg_t *IPC_Boot_Pump_Reg; + uint32_t IPC_IntNum[8U]; + uint32_t IPC_MsgRam_LtoR; + uint32_t IPC_MsgRam_RtoL; + uint32_t IPC_Offset_Corr; +#if IPC_MSGQ_SUPPORT == 1U + IPC_PutBuffer_t *IPC_PutBuffer; + IPC_GetBuffer_t *IPC_GetBuffer; +#endif +}IPC_Instance_t; + +extern const IPC_Instance_t IPC_Instance[IPC_TOTAL_NUM]; + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +// A structure that defines an IPC message queue. These +// fields are used by the IPC drivers, and normally it is not necessary for +// user software to directly read or write fields in the table. +// +//***************************************************************************** + +typedef struct +{ + IPC_Message_t * PutBuffer; + uint32_t PutFlag; + uint16_t * PutWriteIndex; + uint16_t * PutReadIndex; + IPC_Message_t * GetBuffer; + uint16_t * GetWriteIndex; + uint16_t * GetReadIndex; +} IPC_MessageQueue_t; +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** + +//***************************************************************************** +// +//! Local core sets Local to Remote IPC Flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being set +//! +//! This function will allow the Local core system to set the designated IPC +//! flags to send to the Remote core system. The \e flags parameter can be any +//! of the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_setFlagLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_SET = flags; +} + +//***************************************************************************** +// +//! Local core clears Local to Remote IPC Flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being cleared +//! +//! This function will allow the Local core system to clear the designated IPC +//! flags sent to the Remote core system. The \e flags parameter can be any +//! of the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_clearFlagLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_CLR = flags; +} + +//***************************************************************************** +// +//! Local core acknowledges Remote to Local IPC Flag. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being acknowledged. +//! +//! This function will allow the Local core system to acknowledge/clear the IPC +//! flag set by the Remote core system. The \e flags parameter can be any of +//! the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_ackFlagRtoL(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_ACK = flags; +} + +//***************************************************************************** +// +//! Determines whether the given IPC flags are busy or not. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the Local to Remote IPC flag masks to check the status of +//! +//! Allows the caller to determine whether the designated Local to Remote +//! IPC flags are pending. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return Returns \b true if the any of the designated IPC flags are busy +//! or \b false if all the designated IPC flags are free. +// +//***************************************************************************** +static inline bool +IPC_isFlagBusyLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + return((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flags) != 0U); +} + +//***************************************************************************** +// +//! Determines whether the given Remote to Local IPC flags are busy or not. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the Remote to Local IPC Flag masks to check the status of +//! +//! Allows the caller to determine whether the designated Remote to Local +//! IPC flags are pending. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return Returns \b true if the any of the designated IPC flags are busy +//! or \b false if all the designated IPC flags are free. +// +//***************************************************************************** +static inline bool +IPC_isFlagBusyRtoL(IPC_Type_t ipcType, uint32_t flags) +{ + return((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flags) != 0U); +} + +//***************************************************************************** +// +//! Wait for the remote core to send a flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the Remote to Local IPC flag mask to wait for +//! +//! Allows the caller to wait for the Remote to Local flag to be send by +//! the remote core. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_waitForFlag(IPC_Type_t ipcType, uint32_t flag) +{ + while((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flag) == 0U) + { + } +} + +//***************************************************************************** +// +//! Wait for the IPC flag to be acknowledged +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the IPC flag mask for which ack is pending +//! +//! Allows the caller to wait for the IPC flag to be acknowledged by the +//! remote core. The \e flagsparameter can be any of the IPC flag values: +//! \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_waitForAck(IPC_Type_t ipcType, uint32_t flag) +{ + while((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flag) != 0U) + { + } +} + +//***************************************************************************** +// +//! Synchronises the two cores +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the IPC flag mask with which synchronisation is done +//! +//! Allows the local and remote cores to synchronise. Neither core will return +//! from this function call before the other core enters it. +//! +//! \note Must be called with same flag mask on both the cores +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_sync(IPC_Type_t ipcType, uint32_t flag) +{ + IPC_setFlagLtoR(ipcType, flag); + IPC_waitForFlag(ipcType, flag); + IPC_ackFlagRtoL(ipcType, flag); + IPC_waitForAck(ipcType, flag); +} + +//***************************************************************************** +// +//! Initialize IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +// +//! This function initializes IPC by clearing all the flags +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_init(IPC_Type_t ipcType) +{ + IPC_clearFlagLtoR(ipcType, IPC_FLAG_ALL); +} + +//***************************************************************************** +// +//! Sends a command to the Remote core +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags to be set +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param command is the 32-bit command value +//! \param addr is the 32-bit address to be sent as part of command +//! \param data is the 32-bit data to be sent as part of command +//! +//! Allows the caller to send a command to the remote core. A command consists +//! of a unique command value, a 32-bit address and a 32-bit data. The function +//! also sends the designated flags to the remote core. +//! There may be differences in the address spaces of Local and Remote core. +//! For example in case of F2838X device, the address spaces of C28x core and +//! CM core are different. In case the \e addr refers to an address in the IPC +//! MSG RAM, \e addrCorrEnable param may be used to correct the address mismatch +//! +//! The \e flags parameter can be any of the IPC flag values: \b IPC_FLAG0 - +//! \b IPC_FLAG31. +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! +//! The application shall use the function IPC_getResponse to read the response +//! sent by the remote core. +//! +//! \note The application is expected to wait until the the response is +//! received before sending another command. +//! +//! \note \e addrCorrEnable parameter must be kept same on the sending and +//! receiving cores +//! +//! \return Returns \b true if the command is sent properly and \b false if +//! the designated flags were busy and hence command was not sent. +// +//***************************************************************************** +extern bool +IPC_sendCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t command, uint32_t addr, uint32_t data); + +//***************************************************************************** +// +//! Reads a command sent by the Remote core +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags sent by the remote core +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param command is the 32-bit pointer at which the command value is read to +//! \param addr is the 32-bit pointer at which address value is read to +//! \param data is the 32-bit pointer at which the data is read to +//! +//! Allows the caller to read a command sent by the remote core. A command +//! consists of a unique command value, a 32-bit address and a 32-bit data. +//! There may be differences in the address spaces of Local and Remote core. +//! For example in case of F2838X device, the address spaces of C28x core and +//! CM core are different. In case the \e addr refers to an address in the IPC +//! MSG RAM, \e addrCorrEnable param may be used to correct the address mismatch +//! +//! The \e flags parameter can be any of the IPC flag values: \b IPC_FLAG0 - +//! \b IPC_FLAG31. +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! +//! \note The application is expected to acknowledge the flag and send a +//! response (if needed) after reading the command +//! +//! \note \e addrCorrEnable parameter must be kept same on the sending and +//! receiving cores +//! +//! \return Returns \b true if the command is read properly and \b false if +//! the designated flags were empty and hence command was not read. +// +//***************************************************************************** +extern bool +IPC_readCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t *command, uint32_t *addr, uint32_t *data); + +//***************************************************************************** +// +//! Sends the response to the command sent by remote core. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param data is the 32-bit value of the response to be sent +//! +//! Allows the caller to send a response to the command previously sent by the +//! remote core +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_sendResponse(IPC_Type_t ipcType, uint32_t data) +{ + IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_LOCALREPLY = data; +} + +//***************************************************************************** +// +//! Reads the response from the remote core. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the response sent by the remote core to the +//! command previously sent by the local core +//! +//! \return the 32-bit value of the response. +// +//***************************************************************************** +static inline uint32_t +IPC_getResponse(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_REMOTEREPLY); +} + +//***************************************************************************** +// +//! Sets the BOOTMODE register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param mode is the 32-bit value to be set +//! +//! Allows the caller to set the BOOTMODE register. +//! +//! \note This function shall be called by CPU1 only. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_setBootMode(IPC_Type_t ipcType, uint32_t mode) +{ + ASSERT(ipcType == IPC_CPU1_L_CPU2_R); + + IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTMODE = mode; +} + +//***************************************************************************** +// +//! Reads the BOOTMODE register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the BOOTMODE register. +//! +//! +//! \return 32-bit value of the BOOOTMODE register +// +//***************************************************************************** +static inline uint32_t +IPC_getBootMode(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTMODE); +} + +//***************************************************************************** +// +//! Sets the BOOTSTS register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param status is the 32-bit value to be set +//! +//! Allows the caller to set the BOOTSTS register. +//! +//! \note This function shall be called by CPU2 and CM only +//! +//! \note This function shall be called by CPU2 only. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_setBootStatus(IPC_Type_t ipcType, uint32_t status) +{ + ASSERT(ipcType == IPC_CPU2_L_CPU1_R); + + IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTSTS = status; +} + +//***************************************************************************** +// +//! Reads the BOOTSTS register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to set the BOOTMODE register. +//! +//! +//! \return 32-bit value of the BOOOTSTS register +// +//***************************************************************************** +static inline uint32_t +IPC_getBootStatus(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTSTS); +} + +//***************************************************************************** +// +//! Reads the timestamp counter value. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the IPC timestamp counter value. +//! +//! \return 64-bit counter value. +// +//***************************************************************************** +static inline uint64_t +IPC_getCounter(IPC_Type_t ipcType) +{ + // + // Get the Counter High and Low values. Read to the Counter low register + // saves the value of Counter High register. + // + uint32_t ctrL = IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_COUNTERL; + uint32_t ctrH = IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_COUNTERH; + + // + // Return the 64-bit value of the counter + // + return(((uint64_t)ctrH << 32) | ((uint64_t)ctrL)); +} + +//***************************************************************************** +// +//! Registers an interrupt handler for IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param ipcInt is the Flag number for which interrupt is being registered +//! \param pfnHandler is the pointer to ISR function +//! +//! This function registers the handler to be called when an IPC interrupt +//! occurs. This function enables the global interrupt in the interrupt +//! controller. +//! The \e ipcInt parameter can be any of the IPC flag values:\b IPC_INT0 - +//! \b IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on. +// +//***************************************************************************** +extern void +IPC_registerInterrupt(IPC_Type_t ipcType, uint32_t ipcInt, + void (*pfnHandler)(void)); + +//***************************************************************************** +// +//! Unregisters an interrupt handler for IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param ipcInt is the Flag number for which interrupt is being unregistered +//! +//! This function clears the handler to be called when an IPC interrupt +//! occurs. This function also masks off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! The \e ipcInt parameter can be any of the IPC flag values:\b IPC_INT0 - +//! \b IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on. +// +//***************************************************************************** +extern void +IPC_unregisterInterrupt(IPC_Type_t ipcType, uint32_t ipcInt); + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +//! Initializes the IPC message queue +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param ipcInt_L specifies the interrupt number on the local core used by +//! the message queue . +//! \param ipcInt_R specifies the interrupt number on the remote core used by +//! the message queue. +//! +//! This function initializes the IPC message queue with circular buffer +//! and index addresses for an IPC interrupt pair. The +//! \e ipcInt_L and \e ipcInt_R parameters can be one of the following values: +//! \b IPC_INT0, \b IPC_INT1, \b IPC_INT2, \b IPC_INT3. +//! +//! \note If an interrupt is currently in use by an \e IPC_MessageQueue_t +//! instance, that particular interrupt should not be tied to a second +//! \e IPC_MessageQueue_t instance. +//! +//! \note For a particular ipcInt_L - ipcInt_R pair, there must be an instance +//! of IPC_MessageQueue_t defined and initialized on both the locakl and remote +//! systems. +//! +//! \return None. +// +//***************************************************************************** +extern void +IPC_initMessageQueue(IPC_Type_t ipcType, volatile IPC_MessageQueue_t *msgQueue, + uint32_t ipcInt_L, uint32_t ipcInt_R); + +//***************************************************************************** +// +//! Sends a message into the messageQueue. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param msg specifies the address of the \e IPC_Message_t instance to be +//! sent to message queue. +//! \param block specifies whether to allow function to block until the buffer +//! has a free slot +//! +//! This function checks if there is a free slot in the message queue. If so, it +//! puts the message pointed to by \e msg into the free and sets the +//! appropriate IPC interrupt flag +//! +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! The \e block parameter can be one of the following values: +//! \b IPC_BLOCKING_CALL or \b IPC_NONBLOCKING_CALL. +//! +//! \return \b false if the queue is full. \b true if the message is +//! successfully sent. +// +//***************************************************************************** +extern bool +IPC_sendMessageToQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block); + +//***************************************************************************** +// +//! Reads a message from the messageQueue. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param msg specifies the address of the \e IPC_Message_t instance to which +//! the message needs to be read +//! \param block specifies whether to allow function to block until a message +//! is available in the message queue +//! +//! This function checks if there is a message in the message queue. If so, it +//! reads the message and writes to the address pointed to by \e msg into. +//! +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! The \e block parameter can be one of the following values: +//! \b IPC_BLOCKING_CALL or \b IPC_NONBLOCKING_CALL. +//! +//! \return \b false if the queue is empty. \b true if the message successfully +//! read. +// +//***************************************************************************** +extern bool +IPC_readMessageFromQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block); +#endif +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // IPC_H diff --git a/gpio_bitfield_cpu2/device/driverlib/mcbsp.c b/gpio_bitfield_cpu2/device/driverlib/mcbsp.c new file mode 100644 index 0000000..4b23940 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/mcbsp.c @@ -0,0 +1,1621 @@ +//########################################################################### +// +// FILE: mcbsp.c +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "mcbsp.h" + +//***************************************************************************** +// +// McBSP_transmit16BitdataNonBlocking +// +//***************************************************************************** +void +McBSP_transmit16BitDataNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write data. + // + McBSP_write16bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit16BitdataBlocking +// +//***************************************************************************** +void +McBSP_transmit16BitDataBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Check if Transmitter buffer is ready. + // + while(!McBSP_isTxReady(base)) + { + } + + // + // Write data. + // + McBSP_write16bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit32BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_transmit32BitDataNonBlocking(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write data. + // + McBSP_write32bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit32BitdataBlocking +// +//***************************************************************************** +void +McBSP_transmit32BitDataBlocking(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Check if Transmitter buffer is ready. + // + while(!McBSP_isTxReady(base)) + { + } + + // + // Write data. + // + McBSP_write32bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_receive16BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_receive16BitDataNonBlocking(uint32_t base, uint16_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read the data. + // + *receiveData = McBSP_read16bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive16BitDataBlocking +// +//***************************************************************************** +void +McBSP_receive16BitDataBlocking(uint32_t base, uint16_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Wait until new data arrives. + // + while(!McBSP_isRxReady(base)) + { + } + + // + // Read the data. + // + *receiveData = McBSP_read16bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive32BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_receive32BitDataNonBlocking(uint32_t base, uint32_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read the data. + // + *receiveData = McBSP_read32bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive32BitDataBlocking +// +//***************************************************************************** +void +McBSP_receive32BitDataBlocking(uint32_t base, uint32_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Wait until new data arrives. + // + while(!McBSP_isRxReady(base)) + { + } + + // + // Read the data. + // + *receiveData = McBSP_read32bitData(base); +} + +//***************************************************************************** +// +// McBSP_setRxDataSize +// +//***************************************************************************** +void +McBSP_setRxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(wordsPerFrame < 128U); + + if(dataFrame == MCBSP_PHASE_ONE_FRAME) + { + // + // Set bits per word , write to RWDLEN1 and words per frame , write to + // RFRLEN1. + // + HWREGH(base + MCBSP_O_RCR1) = + ((HWREGH(base + MCBSP_O_RCR1) & ~MCBSP_RCR1_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_RCR1_RFRLEN1_S))); + } + else + { + // + // Set bits per word , write to RWDLEN2 and words per frame, write to + // RFRLEN2. + // + HWREGH(base + MCBSP_O_RCR2) = + ((HWREGH(base + MCBSP_O_RCR2) & ~MCBSP_RCR2_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_RCR2_RFRLEN2_S))); + } +} + +//***************************************************************************** +// +// McBSP_setTxDataSize +// +//***************************************************************************** +void +McBSP_setTxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(wordsPerFrame < 128U); + + if(dataFrame == MCBSP_PHASE_ONE_FRAME) + { + // + // Set bits per word XWDLEN1 and words per frame XFRLEN1. + // + HWREGH(base + MCBSP_O_XCR1) = + ((HWREGH(base + MCBSP_O_XCR1) & ~MCBSP_XCR1_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_XCR1_XFRLEN1_S))); + } + else + { + // + // Set bits per word XWDLEN2 and words per frame XFRLEN2. + // + HWREGH(base + MCBSP_O_XCR2) = + ((HWREGH(base + MCBSP_O_XCR2) & ~MCBSP_XCR2_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_XCR2_XFRLEN2_S))); + } +} + +//***************************************************************************** +// +// McBSP_disableRxChannel +// +//***************************************************************************** +void +McBSP_disableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is RCERA or RCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is RCERC or RCERD or RCERE or RCERF or + // RCERG or RCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is RCERA or RCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_RCERA + registerOffset) &= ~(1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_enableRxChannel +// +//***************************************************************************** +void +McBSP_enableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is RCERA or RCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is RCERC or RCERD or RCERE or RCERF or + // RCERG or RCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is RCERA or RCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_RCERA + registerOffset) |= (1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_disableTxChannel +// +//***************************************************************************** +void +McBSP_disableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is XCERA or XCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is XCERC or XCERD or XCERE or XCERF or + // XCERG or XCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is XCERA or XCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_XCERA + registerOffset) &= ~(1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_enableTxChannel +// +//***************************************************************************** +void McBSP_enableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is XCERA or XCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is XCERC or XCERD or XCERE or XCERF or + // XCERG or XCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine wheter it is XCERA or XCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_XCERA + registerOffset) |= (1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_configureTxClock +// +//***************************************************************************** +void +McBSP_configureTxClock(uint32_t base, const McBSP_ClockParams *ptrClockParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select TX clock source as SRG or External. + // + McBSP_setTxClockSource(base, + (McBSP_TxClockSource)ptrClockParams->clockSourceTx); + + // + // Check if using SRG to drive Transmitter clock. + // + if((McBSP_TxClockSource)ptrClockParams->clockSourceTx == + MCBSP_INTERNAL_TX_CLOCK_SOURCE) + { + // + // Set the SRG clock source. + // + McBSP_setTxSRGClockSource(base, + (McBSP_SRGTxClockSource)ptrClockParams->clockTxSRGSource); + + // + // Check if SRG is clocked from MCLKR pin. GSYNC feature can be enabled + // in this case as SRG input clock source is MCLKR pin. + // + if((McBSP_SRGTxClockSource)ptrClockParams->clockTxSRGSource == + MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN) + { + // + // Set the input clock polarity. + // + McBSP_setRxClockPolarity(base, + (McBSP_RxClockPolarity)ptrClockParams->clockMCLKRPolarity); + + // + // Check if SRG is to be synced with FSR that is GSYNC is to be + // enabled or not. + // + if(ptrClockParams->clockSRGSyncFlag) + { + McBSP_enableSRGSyncFSR(base); + } + else + { + McBSP_disableSRGSyncFSR(base); + } + } + + // + // Set SRG clock divider. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrClockParams->clockSRGDivider); + } + + // + // Input polarity if using external clock on MCLKX. + // Output polarity if using SRG as clock source. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrClockParams->clockMCLKXPolarity); +} + +//***************************************************************************** +// +// McBSP_configureRxClock +// +//***************************************************************************** +void +McBSP_configureRxClock(uint32_t base, const McBSP_ClockParams *ptrClockParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select RX clock source as SRG or External. + // + McBSP_setRxClockSource(base, + (McBSP_RxClockSource)ptrClockParams->clockSourceRx); + + // + // Check if using SRG to drive Receiver clock. + // + if((McBSP_RxClockSource)ptrClockParams->clockSourceRx == + MCBSP_INTERNAL_RX_CLOCK_SOURCE) + { + // + // Set the SRG clock source. + // + McBSP_setRxSRGClockSource(base, + (McBSP_SRGRxClockSource)ptrClockParams->clockRxSRGSource); + + // + // Check if SRG is clocked from MCLKX pin. GSYNC cannot be enabled in + // this case as GSYNC feature can be used only when SRG clock source is + // MCLKR pin. + // + if((McBSP_SRGRxClockSource)ptrClockParams->clockRxSRGSource == + MCBSP_SRG_RX_CLOCK_SOURCE_MCLKX_PIN) + { + // + // Set the input clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrClockParams->clockMCLKXPolarity); + } + + // + // Set SRG clock divider. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrClockParams->clockSRGDivider); + } + + // + // Input polarity if using external clock on MCLKR. + // Output polarity if using SRG as clock source. + // + McBSP_setRxClockPolarity(base, + (McBSP_RxClockPolarity)ptrClockParams->clockMCLKRPolarity); +} + +//***************************************************************************** +// +// McBSP_configureTxFrameSync +// +//***************************************************************************** +void +McBSP_configureTxFrameSync(uint32_t base, + const McBSP_TxFsyncParams *ptrFsyncParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select frame-sync signal source. + // + McBSP_setTxFrameSyncSource(base, + (McBSP_TxFrameSyncSource)ptrFsyncParams->syncSourceTx); + + // + // Check if using internal frame-sync source. + // + if((McBSP_TxFrameSyncSource)ptrFsyncParams->syncSourceTx == + MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE) + { + // + // Select the internal frame-sync trigger source. + // + McBSP_setTxInternalFrameSyncSource(base, + (McBSP_TxInternalFrameSyncSource)ptrFsyncParams->syncIntSource); + + // + // Check if using SRG FSG to trigger frame-sync pulse and GSYNC feature + // is disabled that is FSG is not derived from external MCLKR pin. + // + if((ptrFsyncParams->syncIntSource == + MCBSP_TX_INTERNAL_FRAME_SYNC_SRG) && + (ptrFsyncParams->syncSRGSyncFSRFlag == false)) + { + // + // Set the frame-sync pulse period and width dividers. + // + McBSP_setFrameSyncPulsePeriod(base, + ptrFsyncParams->syncClockDivider); + McBSP_setFrameSyncPulseWidthDivider(base, + ptrFsyncParams->syncPulseDivider); + } + } + + // + // Set the frame-sync polarity. + // + McBSP_setTxFrameSyncPolarity(base, + (McBSP_TxFrameSyncPolarity)ptrFsyncParams->syncFSXPolarity); + + // + // Configure frame-sync error detect flag. + // + if(ptrFsyncParams->syncErrorDetect) + { + McBSP_enableTxFrameSyncErrorDetection(base); + } + else + { + McBSP_disableTxFrameSyncErrorDetection(base); + } +} + +//***************************************************************************** +// +// McBSP_configureRxFrameSync +// +//***************************************************************************** +void +McBSP_configureRxFrameSync(uint32_t base, + const McBSP_RxFsyncParams *ptrFsyncParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select frame-sync signal source. + // + McBSP_setRxFrameSyncSource(base, + (McBSP_RxFrameSyncSource)ptrFsyncParams->syncSourceRx); + + // + // If using internal frame-sync source. + // + if(ptrFsyncParams->syncSourceRx == MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE) + { + // + // Check if GSYNC feature is disabled that is FSG is not derived + // from external MCLKR pin. + // + if(ptrFsyncParams->syncSRGSyncFSRFlag == false) + { + // + // Set the frame-sync pulse period and width dividers. + // + McBSP_setFrameSyncPulsePeriod(base, + ptrFsyncParams->syncClockDivider); + McBSP_setFrameSyncPulseWidthDivider(base, + ptrFsyncParams->syncPulseDivider); + } + } + + // + // Set the frame-sync polarity. + // + McBSP_setRxFrameSyncPolarity(base, + (McBSP_RxFrameSyncPolarity)ptrFsyncParams->syncFSRPolarity); + + // + // Configure frame-sync error detect flag. + // + if(ptrFsyncParams->syncErrorDetect) + { + McBSP_enableRxFrameSyncErrorDetection(base); + } + else + { + McBSP_disableTxFrameSyncErrorDetection(base); + } +} + +//***************************************************************************** +// +// McBSP_configureTxDataFormat +// +//***************************************************************************** +void +McBSP_configureTxDataFormat(uint32_t base, + const McBSP_TxDataParams *ptrDataParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set loop back mode. + // + if(ptrDataParams->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure the module to work in McBSP. + // + McBSP_setClockStopMode(base, MCBSP_CLOCK_MCBSP_MODE); + + // + // Start with single phase - a TX must at least has a single phase. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase1WordLength, + ptrDataParams->phase1FrameLength); + + // + // Disable second phase by default. + // + McBSP_disableTwoPhaseTx(base); + + // + // Check if second phase is being used. + // + if(ptrDataParams->twoPhaseModeFlag) + { + // + // Enable second phase. + // + McBSP_enableTwoPhaseTx(base); + + // + // Set the parameters for the second phase. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_TWO_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase2WordLength, + ptrDataParams->phase2FrameLength); + } + + // + // Set the Tx companding mode. + // + McBSP_setTxCompandingMode(base, + (McBSP_CompandingMode)ptrDataParams->compandingMode); + + // + // Set Tx data delay in bits. + // + McBSP_setTxDataDelayBits(base, + (McBSP_DataDelayBits)ptrDataParams->dataDelayBits); + + // + // Set DX pin delay. + // + if(ptrDataParams->pinDelayEnableFlag) + { + McBSP_enableDxPinDelay(base); + } + else + { + McBSP_disableDxPinDelay(base); + } + + // + // Set the transmitter interrupt source. + // + McBSP_setTxInterruptSource(base, + (McBSP_TxInterruptSource)ptrDataParams->interruptMode); +} + +//***************************************************************************** +// +// McBSP_configureRxDataFormat +// +//***************************************************************************** +void +McBSP_configureRxDataFormat(uint32_t base, + const McBSP_RxDataParams *ptrDataParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set loop back mode. + // + if(ptrDataParams->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure the module to work in McBSP mode. + // + McBSP_setClockStopMode(base, MCBSP_CLOCK_MCBSP_MODE); + + // + // Start with single phase - an RX must at least have a single phase. + // + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase1WordLength, + ptrDataParams->phase1FrameLength); + + // + // Disable second phase by default. + // + McBSP_disableTwoPhaseRx(base); + + // + // Check if second phase is to be enabled. + // + if(ptrDataParams->twoPhaseModeFlag) + { + // + // Enable second phase. + // + McBSP_enableTwoPhaseRx(base); + + // + // Set the parameters for the second phase. + // + McBSP_setRxDataSize(base, MCBSP_PHASE_TWO_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase2WordLength, + ptrDataParams->phase2FrameLength); + } + + // + // Set the receiver companding mode. + // + McBSP_setRxCompandingMode(base, + (McBSP_CompandingMode)ptrDataParams->compandingMode); + + // + // Set receiver data delay in bits. + // + McBSP_setRxDataDelayBits(base, + (McBSP_DataDelayBits)ptrDataParams->dataDelayBits); + + // + // Set receiver sign-extension and justification mode. + // + McBSP_setRxSignExtension(base, + (McBSP_RxSignExtensionMode)ptrDataParams->signExtMode); + + // + // Set the receiver interrupt source. + // + McBSP_setRxInterruptSource(base, + (McBSP_RxInterruptSource)ptrDataParams->interruptMode); +} + +//***************************************************************************** +// +// McBSP_configureTxMultichannel +// +//***************************************************************************** +uint16_t +McBSP_configureTxMultichannel(uint32_t base, + const McBSP_TxMultichannelParams *ptrMchnParams) +{ + uint16_t index; + uint16_t block; + uint16_t partitionAblock; + uint16_t partitionBblock; + uint16_t partitionAflag; + uint16_t partitionBflag; + uint16_t errorTx; + + errorTx = 0U; + partitionAblock = 0U; + partitionBblock = 0U; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Configure Tx Channel Selection mode. + // + McBSP_setTxChannelMode(base, + (McBSP_TxChannelMode)ptrMchnParams->multichannelModeTx); + + // + // Configuration for multichannel selections that is for + // MCBSP_TX_CHANNEL_SELECTION_ENABLED, + // MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION or + // MCBSP_SYMMERTIC_RX_TX_SELECTION. + // + if(((McBSP_TxChannelMode)ptrMchnParams->multichannelModeTx) != + MCBSP_ALL_TX_CHANNELS_ENABLED) + { + // + // Select 2 partition or 8 partition. + // + McBSP_setTxMultichannelPartition(base, + (McBSP_MultichannelPartition)ptrMchnParams->partitionTx); + + // + // Disable dual phase transmission mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Multichannel configuration for 2 partition mode. + // + if((McBSP_MultichannelPartition)ptrMchnParams->partitionTx == + MCBSP_MULTICHANNEL_TWO_PARTITION) + { + if(((uint16_t)ptrMchnParams->channelCountTx) > 32U) + { + errorTx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + partitionAflag = 0U; + partitionBflag = 0U; + + // + // Assign blocks to partition for the provided channels and + // enable the channels. Only the channels which belong to the + // block currently assigned to partition A or B can be enabled. + // + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountTx; + index++) + { + // + // Get the block to which channel belongs. + // + block = (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index)) >> 4U; + + // + // Check if channel block can be assigned to partition A. Only + // even numbered blocks can be assigned to partition A. + // + if((block & 0x1U) == 0U) + { + // + // Check if block is yet to be assigned to partition A. + // + if(partitionAflag == 0U) + { + // + // Assign block to partition A. + // + McBSP_setTxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition A. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionAflag = 1U; + partitionAblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition A. + // + if(partitionAblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition A. + // + McBSP_enableTxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*(ptrMchnParams->ptrChannelsListTx) + + index)); + } + else + { + errorTx = MCBSP_ERROR_2_PARTITION_A; + } + } + + // + // Check if channel block can be assigned to partition B. Only + // odd numbered blocks can be assigned to partition B. + // + else + { + // + // Check if block is yet to be assigned to partition B. + // + if(partitionBflag == 0U) + { + // + // Assign block to partition B. + // + McBSP_setTxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition B. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionBflag = 1U; + partitionBblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition B. + // + if(partitionBblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition B. + // + McBSP_enableTxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index))); + } + else + { + errorTx |= MCBSP_ERROR_2_PARTITION_B; + } + } + } + } + + // + // Multichannel configuration for 8 partition mode. + // + else + { + if((uint16_t)ptrMchnParams->channelCountTx > 128U) + { + errorTx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountTx; + index++) + { + // + // Enable the Tx channels. + // + McBSP_enableTxChannel(base, MCBSP_MULTICHANNEL_EIGHT_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index))); + } + } + } + return(errorTx); +} + +//***************************************************************************** +// +// McBSP_configureRxMultichannel +// +//***************************************************************************** +uint16_t +McBSP_configureRxMultichannel(uint32_t base, + const McBSP_RxMultichannelParams *ptrMchnParams) +{ + uint16_t index; + uint16_t block; + uint16_t partitionAblock; + uint16_t partitionBblock; + uint16_t partitionAflag; + uint16_t partitionBflag; + uint16_t errorRx; + + errorRx = 0U; + partitionAblock = 0U; + partitionBblock = 0U; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Configure Tx Channel Selection mode. + // + McBSP_setRxChannelMode(base, + (McBSP_RxChannelMode)ptrMchnParams->multichannelModeRx); + + // + // Select 2 partition or 8 partition. + // + McBSP_setRxMultichannelPartition(base, + (McBSP_MultichannelPartition)ptrMchnParams->partitionRx); + + // + // Configuration for multichannel selections that is for + // MCBSP_RX_CHANNEL_SELECTION_ENABLED. + // + if((ptrMchnParams->multichannelModeRx) == + MCBSP_RX_CHANNEL_SELECTION_ENABLED) + { + // + // Disable dual phase reception mode. + // + McBSP_disableTwoPhaseRx(base); + + // + // Multichannel configuration for 2 partition mode. + // + if((McBSP_MultichannelPartition)ptrMchnParams->partitionRx == + MCBSP_MULTICHANNEL_TWO_PARTITION) + { + if((uint16_t)ptrMchnParams->channelCountRx > 32U) + { + errorRx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + partitionAflag = 0U; + partitionBflag = 0U; + + // + // Assign blocks to partition for the provided channels and + // enable the channels. Only the channels which belong to the + // block currently assigned to partition A or B can be enabled. + // + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountRx; + index++) + { + // + // Get the block to which channel belongs. + // + block = (*((ptrMchnParams->ptrChannelsListRx) + index)) >> 4U; + + // + // Check if channel block can be assigned to partition A. Only + // even numbered blocks can be assigned to partition A. + // + if((block & 0x1U) == 0U) + { + // + // Check if block is yet to be assigned to partition A. + // + if(partitionAflag == 0U) + { + // + // Assign block to partition A. + // + McBSP_setRxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition A. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionAflag = 1U; + partitionAblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition A. + // + if(partitionAblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition A. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + + index))); + } + else + { + errorRx = MCBSP_ERROR_2_PARTITION_A; + } + } + + // + // Check if channel block can be assigned to partition B. Only + // odd numbered blocks can be assigned to partition B. + // + else + { + // + // Check if block is yet to be assigned to partition B. + // + if(partitionBflag == 0U) + { + // + // Assign block to partition B. + // + McBSP_setRxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + // + // Set flag to indicate that a block is now assigned + // to partition B. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionBflag = 1U; + partitionBblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition B. + // + if(partitionBblock == block) + { + // + // Enable the Rx channel belonging to the block + // assigned to partition B. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + + index))); + } + else + { + errorRx |= MCBSP_ERROR_2_PARTITION_B; + } + } + } + } + + // + // Multichannel configuration for 8 partition mode. + // + else + { + if(ptrMchnParams->channelCountRx > 128U) + { + errorRx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountRx; + index++) + { + // + // Enable the Rx channels. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_EIGHT_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + index))); + } + } + } + return(errorRx); +} + +//***************************************************************************** +// +// McBSP_configureSPIMasterMode +// +//***************************************************************************** +void +McBSP_configureSPIMasterMode(uint32_t base, + const McBSP_SPIMasterModeParams *ptrSPIMasterMode) +{ + // + // Configure clock stop mode. + // + if(((ptrSPIMasterMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_NO_DELAY) || + ((ptrSPIMasterMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_DELAY)) + { + // + // Set SPI mode. + // + McBSP_setClockStopMode(base, + (McBSP_ClockStopMode)ptrSPIMasterMode->clockStopMode); + + // + // Set loop back mode. + // + if(ptrSPIMasterMode->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure module as master. Use SRG as clock source for driving + // master clock. MCLKX pin will be the master clock out pin. + // + McBSP_setTxClockSource(base, MCBSP_INTERNAL_TX_CLOCK_SOURCE); + + // + // Set internal clock (LSPCLK) as SRG clock source. + // + McBSP_setTxSRGClockSource(base, MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK); + + // + // Set SRG clock divider for generating CLKG. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrSPIMasterMode->clockSRGDivider); + + // + // Set the output master clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrSPIMasterMode->spiMode); + + // + // Set FSX as an output driven by SRG. + // + McBSP_setTxFrameSyncSource(base, MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE); + + // + // FSX is triggered when data is written to DXR registers. + // + McBSP_setTxInternalFrameSyncSource(base, + MCBSP_TX_INTERNAL_FRAME_SYNC_DATA); + + // + // Set the polarity for FSX pin as active low. + // + McBSP_setTxFrameSyncPolarity(base, + MCBSP_TX_FRAME_SYNC_POLARITY_LOW); + + // + // Disable dual phase mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Set the data format for transmission & reception. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPIMasterMode->wordLength, 0U); + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPIMasterMode->wordLength, 0U); + + // + // Set one bit data delay for transmission & reception to set correct + // setup time on FSX signal. + // + McBSP_setTxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_1); + McBSP_setRxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_1); + } +} + +//***************************************************************************** +// +// McBSP_configureSPISlaveMode +// +//***************************************************************************** +void +McBSP_configureSPISlaveMode(uint32_t base, + const McBSP_SPISlaveModeParams *ptrSPISlaveMode) +{ + + // + // Configure clock stop mode. + // + if(((ptrSPISlaveMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_NO_DELAY) || + ((ptrSPISlaveMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_DELAY)) + { + // + // Set SPI mode. + // + McBSP_setClockStopMode(base, + (McBSP_ClockStopMode)ptrSPISlaveMode->clockStopMode); + // + // Set loop back mode. + // + if(ptrSPISlaveMode->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure module as Slave. MCLKX pin acts as input slave + // clock and is driven externally by SPI master. + // + McBSP_setTxClockSource(base, MCBSP_EXTERNAL_TX_CLOCK_SOURCE); + + // + // Set the input slave clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrSPISlaveMode->spiMode); + + // + // Set internal clock (LSPCLK) as SRG clock source. SRG is used to + // synchronize McBSP logic with externally generated master clock. + // + McBSP_setRxSRGClockSource(base, MCBSP_SRG_RX_CLOCK_SOURCE_LSPCLK); + + // + // Assign a clock divider value of 1 for generating CLKG. + // + McBSP_setSRGDataClockDivider(base, 1U); + + // + // Set FSX as an input which is driven by slave-enable signal + // from SPI master. + // + McBSP_setTxFrameSyncSource(base, MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE); + + // + // Set the polarity for FSX pin as active low. + // + McBSP_setTxFrameSyncPolarity(base, + MCBSP_TX_FRAME_SYNC_POLARITY_LOW); + + // + // Disable dual phase mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Set the data format for transmission & reception.. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPISlaveMode->wordLength, 0U); + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPISlaveMode->wordLength, 0U); + + // + // Set zero bit data delay for transmission & reception. + // + McBSP_setTxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_0); + McBSP_setRxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_0); + } +} diff --git a/gpio_bitfield_cpu2/device/driverlib/mcbsp.h b/gpio_bitfield_cpu2/device/driverlib/mcbsp.h new file mode 100644 index 0000000..949987d --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/mcbsp.h @@ -0,0 +1,3340 @@ +//########################################################################### +// +// FILE: mcbsp.h +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef MCBSP_H +#define MCBSP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup mcbsp_api McBSP +//! @{ +// +//***************************************************************************** + +#include "inc/hw_ints.h" +#include "inc/hw_types.h" +#include "inc/hw_mcbsp.h" +#include "inc/hw_memmap.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Define to specify mask for setting the word and frame length in +// McBSP_setTxDataSize() anf McBSP_setRxDataSize(). +// +//***************************************************************************** +#define MCBSP_XCR1_M (MCBSP_XCR1_XWDLEN1_M | \ + MCBSP_XCR1_XFRLEN1_M) +#define MCBSP_RCR1_M (MCBSP_RCR1_RWDLEN1_M | \ + MCBSP_RCR1_RFRLEN1_M) +#define MCBSP_XCR2_M (MCBSP_XCR2_XWDLEN2_M | \ + MCBSP_XCR2_XFRLEN2_M) +#define MCBSP_RCR2_M (MCBSP_RCR2_RWDLEN2_M | \ + MCBSP_RCR2_RFRLEN2_M) + +//***************************************************************************** +// +// Defines the values that can be returned by McBSP_getRxErrorStatus() when +// there is an error in Rx. +// +//***************************************************************************** +#define MCBSP_RX_NO_ERROR 0x0U //!< No error. +#define MCBSP_RX_BUFFER_ERROR 0x4U //!< Buffer Full. +#define MCBSP_RX_FRAME_SYNC_ERROR 0x8U //!< Frame sync error. +#define MCBSP_RX_BUFFER_FRAME_SYNC_ERROR 0xCU //!< Buffer and frame sync error. + +//***************************************************************************** +// +// Defines the values that can be returned by McBSP_getTxErrorStatus() when +// there is an error in Tx. +// +//***************************************************************************** +#define MCBSP_TX_NO_ERROR 0x0U //!< No error. +#define MCBSP_TX_BUFFER_ERROR 0x4U //!< Buffer overrun. +#define MCBSP_TX_FRAME_SYNC_ERROR 0x8U //!< Frame sync error. +#define MCBSP_TX_BUFFER_FRAME_SYNC_ERROR 0xCU //!< Buffer and frame sync error. + +//***************************************************************************** +// +// Values that can be returned by McBSP_configureTxMultichannel() and +// McBSP_configureRxMultichannel(). +// +//***************************************************************************** +#define MCBSP_ERROR_EXCEEDED_CHANNELS 0x1U //!< Exceeded number of channels. +#define MCBSP_ERROR_2_PARTITION_A 0x2U //!< Error in 2 partition A setup. +#define MCBSP_ERROR_2_PARTITION_B 0x4U //!< Error in 2 partition B setup. +#define MCBSP_ERROR_INVALID_MODE 0x8U //!< Invalid mode. + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setRxSignExtension() as the \e +//! mode parameters. +// +//***************************************************************************** +typedef enum +{ + MCBSP_RIGHT_JUSTIFY_FILL_ZERO = 0x0000U, //!< Right justify and + //!< zero fill MSB. + MCBSP_RIGHT_JUSTIFY_FILL_SIGN = 0x2000U, //!< Right justified sign + //!< extended into MSBs. + MCBSP_LEFT_JUSTIFY_FILL_ZER0 = 0x4000U //!< Left justifies LBS + //!< filled with zero. +}McBSP_RxSignExtensionMode; + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setClockStopMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + MCBSP_CLOCK_MCBSP_MODE = 0x0000U, //!< Disables clock stop mode. + MCBSP_CLOCK_SPI_MODE_NO_DELAY = 0x1000U, //!< Enables clock stop mode. + MCBSP_CLOCK_SPI_MODE_DELAY = 0x1800U //!< Enables clock stop mode + //!< with half cycle delay. +}McBSP_ClockStopMode; + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setRxInterruptSource() as the +//! \e interruptSource parameter. +// +//***************************************************************************** +typedef enum +{ + MCBSP_RX_ISR_SOURCE_SERIAL_WORD = 0x0000U, //!> 1U) << 7U)); +} + +//***************************************************************************** +// +//! Configures transmitter input clock source for sample generator. +//! +//! \param base is the base address of the McBSP module. +//! \param srgClockSource is clock source for the sample generator. +//! +//! This functions sets the clock source for the sample rate generator. +//! Valid values for \e clockSource are +//! - \b MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK for LSPCLK. +//! - \b MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN for external clock at MCLKR pin. +//! MCLKX pin will be an output driven by sample rate generator. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxSRGClockSource(uint32_t base, + const McBSP_SRGTxClockSource srgClockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKSM bit. + // + HWREGH(base + MCBSP_O_SRGR2) = + ((HWREGH(base + MCBSP_O_SRGR2) & ~MCBSP_SRGR2_CLKSM) | + ((uint16_t)((uint16_t)srgClockSource & 0x1U) << 13U)); + // + // Set or clear SCLKME bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_SCLKME) | + (uint16_t)(((uint16_t)srgClockSource >> 1U) << 7U)); +} + +//***************************************************************************** +// +//! Sets the mode for transmitter internal frame sync signal. +//! +//! \param base is the base address of the McBSP module. +//! \param syncMode is the frame sync mode. +//! +//! This function sets the frame sync signal generation mode. The signal can be +//! generated based on clock divider as set in McBSP_setFrameSyncPulsePeriod() +//! function or when data is transferred from DXR registers to XSR registers. +//! Valid input for syncMode are: +//! +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_DATA - frame sync signal is +//! generated when data is transferred from +//! DXR registers to XSR registers. +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_SRG - frame sync signal is +//! generated based on the clock counter +//! value as defined in +//! McBSP_setFrameSyncPulsePeriod() +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxInternalFrameSyncSource(uint32_t base, + const McBSP_TxInternalFrameSyncSource syncMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSGM bit. + // + HWREGH(base + MCBSP_O_SRGR2) = + ((HWREGH(base + MCBSP_O_SRGR2) & ~MCBSP_SRGR2_FSGM) | (uint16_t)syncMode); +} + +//***************************************************************************** +// +//! Set Multichannel receiver partitions. +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the number of partitions. +//! +//! This function sets the partitions for Multichannel receiver. Valid values +//! for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or \b +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 and 8 partitions respectively. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxMultichannelPartition(uint32_t base, + const McBSP_MultichannelPartition partition) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or Clear RMCME bit. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RMCME) | (uint16_t)partition); +} + +//***************************************************************************** +// +//! Sets block to receiver in two partition configuration. +//! +//! \param base is the base address of the McBSP module. +//! \param block is the block to assign to the partition. +//! +//! This function assigns the block the user provides to the appropriate +//! receiver partition. +//! If user sets the value of block to 0,2,4 or 6 the API will assign the +//! blocks to partition A. If values 1,3,5,or 7 are set to block, then +//! the API assigns the block to partition B. +//! +//! \note This function should be used with the two partition configuration +//! only and not with eight partition configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxTwoPartitionBlock(uint32_t base, const McBSP_PartitionBlock block) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + //Check the block value if it is 0,2,4,6 or 1,3,5,7. + // + if(((uint16_t)block == 0U) || + ((uint16_t)block == 2U) || + ((uint16_t)block == 4U) || + ((uint16_t)block == 6U)) + { + // + // write to RPABLK bits. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RPABLK_M) | + (uint16_t)(((uint16_t)block >> 1U)<< 5U)); + } + else + { + // + // write to RPBBLK bits. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RPBBLK_M) | + (uint16_t)(((uint16_t)block >> 1U)<< 7U)); + } +} + +//***************************************************************************** +// +//! Returns the current active receiver block number. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function returns the current active receiver block involved in McBSP +//! reception. +//! +//! \return Active block in McBSP reception. Returned values range from 0 to 7 +//! representing the respective active block number . +// +//***************************************************************************** +static inline uint16_t +McBSP_getRxActiveBlock(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // return RCBLK bits. + // + return((HWREGH(base + MCBSP_O_MCR1) & MCBSP_MCR1_RCBLK_M) >> + MCBSP_MCR1_RCBLK_S); +} + +//***************************************************************************** +// +//! Configure channel selection mode for receiver. +//! +//! \param base is the base address of the McBSP module. +//! \param channelMode is the channel selection mode. +//! +//! This function configures the channel selection mode. The following are +//! valid values for channelMode: +//! +//! - \b MCBSP_ALL_RX_CHANNELS_ENABLED - enables all channels. +//! - \b MCBSP_RX_CHANNEL_SELECTION_ENABLED - lets the user enable desired +//! channels by using McBSP_enableRxChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxChannelMode(uint32_t base, const McBSP_RxChannelMode channelMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear RMCM bit. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RMCM) | (uint16_t)channelMode); +} + +//***************************************************************************** +// +//! Set Multichannel transmitter partitions. +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the number of partitions. +//! +//! This function sets the partitions for Multichannel transmitter. Valid +//! values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or \b +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 and 8 partitions respectively. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxMultichannelPartition(uint32_t base, + const McBSP_MultichannelPartition partition) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear XMCME bit. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XMCME) | (uint16_t)partition); +} + +//***************************************************************************** +// +//! Sets block to transmitter in two partition configuration. +//! +//! \param base is the base address of the McBSP module. +//! \param block is the block to assign to the partition. +//! +//! This function assigns the block the user provides to the appropriate +//! transmitter partition. +//! If user sets the value of block to 0,2,4 or 6 the API will assign the +//! blocks to partition A. If values 1,3,5,or 7 are set to block, then +//! the API assigns the block to partition B. +//! +//! \note This function should be used with the two partition configuration +//! only and not with eight partition configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxTwoPartitionBlock(uint32_t base, const McBSP_PartitionBlock block) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + if(((uint16_t)block == 0U) || + ((uint16_t)block == 2U) || + ((uint16_t)block == 4U) || + ((uint16_t)block == 6U)) + { + // + // write to XPABLK bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XPABLK_M) | + ((uint16_t)((uint16_t)block >> 1U)<< 5U)); + } + else + { + // + // write to XPBBLK bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XPBBLK_M) | + ((uint16_t)((uint16_t)block >> 1U)<< 7U)); + } +} + +//***************************************************************************** +// +//! Returns the current active transmitter block number. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function returns the current active transmitter block involved in +//! McBSP transmission. +//! +//! \return Active block in McBSP transmission. Returned values range from +//! 0 to 7 representing the respective active block number. +// +//***************************************************************************** +static inline uint16_t +McBSP_getTxActiveBlock(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // return XCBLK bits. + // + return((HWREGH(base + MCBSP_O_MCR2) & MCBSP_MCR2_XCBLK_M) >> + MCBSP_MCR2_XCBLK_S); + +} + +//***************************************************************************** +// +//! Configure channel selection mode for transmitter. +//! +//! \param base is the base address of the McBSP module. +//! \param channelMode is the channel selection mode. +//! +//! This function configures the channel selection mode. The following are +//! valid values for channelMode: +//! +//! - \b MCBSP_ALL_TX_CHANNELS_ENABLED - enables and unmasks all channels +//! - \b MCBSP_TX_CHANNEL_SELECTION_ENABLED - lets the user enable and unmask +//! desired channels by using McBSP_enableTxChannel() +//! - \b MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION - All channels enables but +//! until enabled by McBSP_enableTxChannel() +//! - \b MCBSP_SYMMERTIC_RX_TX_SELECTION - Symmetric transmission and +//! reception. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxChannelMode(uint32_t base, const McBSP_TxChannelMode channelMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set values to the XMCM bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XMCM_M) | + (uint16_t)channelMode); +} + +//***************************************************************************** +// +//! Select the transmitter frame sync signal source. +//! +//! \param base is the base address of the McBSP module. +//! \param syncSource is the transmitter frame sync source. +//! +//! This function sets external or internal sync signal source based on the +//! syncSource selection. Valid input for syncSource are: +//! +//! - \b MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! externally by pin FSX. +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! internally. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxFrameSyncSource(uint32_t base, + const McBSP_TxFrameSyncSource syncSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + //Set or Clear the FSXM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSXM) | (uint16_t)syncSource); +} + +//***************************************************************************** +// +//! Select receiver frame sync signal source. +//! +//! \param base is the base address of the McBSP module. +//! \param syncSource is the receiver frame sync source. +//! +//! This function sets external or internal sync signal source based on the +//! syncSource selection. Valid input for syncSource are: +//! +//! - \b MCBSP_RX_EXTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! externally by pin FSR. +//! - \b MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! by SRG. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxFrameSyncSource(uint32_t base, + const McBSP_RxFrameSyncSource syncSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSRM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSRM) | (uint16_t)syncSource); +} + +//***************************************************************************** +// +//! Configures the Transmit clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockSource is clock source for the transmission pin. +//! +//! This function configures the clock source for the transmitter. Valid input +//! for rxClockSource are: +//! - \b MCBSP_INTERNAL_TX_CLOCK_SOURCE - internal clock source. SRG is the +//! source. +//! - \b MCBSP_EXTERNAL_TX_CLOCK_SOURCE - external clock source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxClockSource(uint32_t base, const McBSP_TxClockSource clockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKXM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKXM ) | (uint16_t)clockSource); +} + +//***************************************************************************** +// +//! Configures the Receive clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockSource is clock source for the reception pin. +//! +//! This function configures the clock source for the receiver. Valid input +//! for base are: +//! - \b MCBSP_INTERNAL_RX_CLOCK_SOURCE - internal clock source. Sample Rate +//! Generator will be used. +//! - \b MCBSP_EXTERNAL_RX_CLOCK_SOURCE - external clock will drive the data. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxClockSource(uint32_t base, const McBSP_RxClockSource clockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKRM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKRM) | (uint16_t)clockSource); +} + +//***************************************************************************** +// +//! Sets transmitter frame sync polarity. +//! +//! \param base is the base address of the McBSP module. +//! \param syncPolarity is the polarity of frame sync pulse. +//! +//! This function sets the polarity (rising or falling edge)of the frame sync +//! on FSX pin. Use \b MCBSP_TX_FRAME_SYNC_POLARITY_LOW for active low +//! frame sync pulse and \b MCBSP_TX_FRAME_SYNC_POLARITY_HIGH for active +//! high sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxFrameSyncPolarity(uint32_t base, + const McBSP_TxFrameSyncPolarity syncPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSXP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSXP) | (uint16_t)syncPolarity); +} + +//***************************************************************************** +//! Sets receiver frame sync polarity. +//! +//! \param base is the base address of the McBSP module. +//! \param syncPolarity is the polarity of frame sync pulse. +//! +//! This function sets the polarity (rising or falling edge)of the frame sync +//! on FSR pin. Use \b MCBSP_RX_FRAME_SYNC_POLARITY_LOW for active low +//! frame sync pulse and \b MCBSP_RX_FRAME_SYNC_POLARITY_HIGH for active +//! high sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxFrameSyncPolarity(uint32_t base, + const McBSP_RxFrameSyncPolarity syncPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSRP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSRP) | (uint16_t)syncPolarity); +} + +//***************************************************************************** +//! Sets transmitter clock polarity when using external clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockPolarity is the polarity of external clock. +//! +//! This function sets the polarity (rising or falling edge) of the transmitter +//! clock on MCLKX pin. +//! Valid values for clockPolarity are: +//! - \b MCBSP_TX_POLARITY_RISING_EDGE for rising edge. +//! - \b MCBSP_TX_POLARITY_FALLING_EDGE for falling edge. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxClockPolarity(uint32_t base, + const McBSP_TxClockPolarity clockPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear CLKXP bit first , then set or clear CLKXP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKXP) | + (uint16_t)clockPolarity); +} + +//***************************************************************************** +//! Sets receiver clock polarity when using external clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockPolarity is the polarity of external clock. +//! +//! This function sets the polarity (rising or falling edge) of the receiver +//! clock on MCLKR pin. If external clock is used, the polarity will affect +//! CLKG signal. +//! Valid values for clockPolarity are: +//! - \b MCBSP_RX_POLARITY_RISING_EDGE for rising edge. +//! - \b MCBSP_RX_POLARITY_FALLING_EDGE for falling edge. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxClockPolarity(uint32_t base, + const McBSP_RxClockPolarity clockPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear CLKRP bit first , then set or clear CLKRP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKRP) | + (uint16_t)clockPolarity); +} + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers. +//! +//! \param base is the base address of the McBSP port. +//! +//! This function returns the data value in data receive register. +//! +//! \return received data. +// +//***************************************************************************** +static inline +uint16_t McBSP_read16bitData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read DRR1 register. + // + return(HWREGH(base + MCBSP_O_DRR1)); +} + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers. +//! +//! \param base is the base address of the McBSP port. +//! +//! This function returns the data values in data receive registers. +//! +//! \return received data. +// +//***************************************************************************** +static inline uint32_t +McBSP_read32bitData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read DDR1 register and return DDR2:DDR1. + // + return((((uint32_t)HWREGH(base + MCBSP_O_DRR2) << 16U) | + HWREGH(base + MCBSP_O_DRR1))); +} + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers. +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function writes 8,12 or 16 bit data to data transmit register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_write16bitData(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write to DXR1 register. + // + HWREGH(base + MCBSP_O_DXR1) = data; +} + +//***************************************************************************** +// +//! Write 20, 24 or 32 bit data word to McBSP data transmit registers. +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function writes 20, 24 or 32 bit data to data transmit registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_write32bitData(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write to DXR2 register first. + // + HWREGH(base + MCBSP_O_DXR2) = data >> 16U; + + // + // Write to DXR1 register. + // + HWREGH(base + MCBSP_O_DXR1) = data & 0xFFFFU; +} + +//***************************************************************************** +// +//! Return left justified for data for U Law or A Law companding. +//! +//! \param data is the 14 bit word. +//! \param compandingType specifies the type comapnding desired. +//! +//! This functions returns U law or A law adjusted word. +//! +//! \return U law or A law left justified word. +// +//***************************************************************************** +static inline uint16_t +McBSP_getLeftJustifyData(uint16_t data, + const McBSP_CompandingType compandingType) +{ + return(data << (uint16_t)compandingType); +} + + +//***************************************************************************** +// +//! Enable Recieve Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function enables Recieve Interrupt on RRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_enableRxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set RINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= MCBSP_MFFINT_RINT; +} + +//***************************************************************************** +// +//! Disable Recieve Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function disables Recieve Interrupt on RRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_disableRxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear RINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= ~(MCBSP_MFFINT_RINT); +} + +//***************************************************************************** +// +//! Enable Transmit Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function enables Transmit Interrupt on XRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_enableTxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set XINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= MCBSP_MFFINT_XINT; +} + +//***************************************************************************** +// +//! Disable Transmit Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function disables Transmit Interrupt on XRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_disableTxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear XINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= ~(MCBSP_MFFINT_XINT); +} + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 16 bit or less data to the transmitter buffer. +//! +//! \return None. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit16BitDataNonBlocking(uint32_t base, uint16_t data); + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 16 bit or less data to the transmitter buffer. If +//! transmit buffer is not ready the function will wait until transmit buffer +//! is empty. If the transmitter buffer is empty the data will be written to +//! the data registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit16BitDataBlocking(uint32_t base, uint16_t data); + +//***************************************************************************** +// +//! Write 20 , 24 or 32 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 20 , 24 or 32 bit data to the transmitter buffer. If +//! the transmitter buffer is empty the data will be written to the data +//! registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit32BitDataNonBlocking(uint32_t base, uint32_t data); + +//***************************************************************************** +// +//! Write 20 , 24 or 32 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 20 , 24 or 32 bit data to the transmitter buffer. If +//! transmit buffer is not ready the function will wait until transmit buffer +//! is empty. If the transmitter buffer is empty the data will be written +//! to the data registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit32BitDataBlocking(uint32_t base, uint32_t data); + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 8,12 or 16 bit data from the receiver buffer. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive16BitDataNonBlocking(uint32_t base, uint16_t *receiveData); + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 8,12 or 16 bit data from the receiver buffer. If +//! receiver buffer is not ready the function will wait until receiver buffer +//! has new data. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive16BitDataBlocking(uint32_t base, uint16_t *receiveData); + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 20, 24 or 32 bit data from the receiver buffer. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive32BitDataNonBlocking(uint32_t base, uint32_t *receiveData); + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 20, 24 or 32 bit data from the receiver buffer. If +//! receiver buffer is not ready the function will wait until receiver buffer +//! has new data. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive32BitDataBlocking(uint32_t base, uint32_t *receiveData); + + +//***************************************************************************** +// +//! Sets number of words per frame and bits per word for data Reception. +//! +//! \param base is the base address of the McBSP module. +//! \param dataFrame is the data frame phase. +//! \param bitsPerWord is the number of bits per word. +//! \param wordsPerFrame is the number of words per frame per phase. +//! +//! This function sets the number of bits per word and the number of words per +//! frame for the given phase. +//! Valid inputs for phase are \b MCBSP_PHASE_ONE_FRAME or \b +//! MCBSP_PHASE_TWO_FRAME representing the first or second frame phase +//! respectively. Valid value for bitsPerWord are: +//! - \b MCBSP_BITS_PER_WORD_8 8 bit word. +//! - \b MCBSP_BITS_PER_WORD_12 12 bit word. +//! - \b MCBSP_BITS_PER_WORD_16 16 bit word. +//! - \b MCBSP_BITS_PER_WORD_20 20 bit word. +//! - \b MCBSP_BITS_PER_WORD_24 24 bit word. +//! - \b MCBSP_BITS_PER_WORD_32 32 bit word. +//! The maximum value for wordsPerFrame is 127 (128 - 1)representing 128 words. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_setRxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame); + +//***************************************************************************** +// +//! Sets number of words per frame and bits per word for data Transmission. +//! +//! \param base is the base address of the McBSP module. +//! \param dataFrame is the data frame phase. +//! \param bitsPerWord is the number of bits per word. +//! \param wordsPerFrame is the number of words per frame per phase. +//! +//! This function sets the number of bits per word and the number of words per +//! frame for the given phase. +//! Valid inputs for phase are \b MCBSP_PHASE_ONE_FRAME or \b +//! MCBSP_PHASE_TWO_FRAME representing single or dual phase respectively. +//! Valid values for bitsPerWord are: +//! - \b MCBSP_BITS_PER_WORD_8 8 bit word. +//! - \b MCBSP_BITS_PER_WORD_12 12 bit word. +//! - \b MCBSP_BITS_PER_WORD_16 16 bit word. +//! - \b MCBSP_BITS_PER_WORD_20 20 bit word. +//! - \b MCBSP_BITS_PER_WORD_24 24 bit word. +//! - \b MCBSP_BITS_PER_WORD_32 32 bit word. +//! The maximum value for wordsPerFrame is 127 (128 - 1)representing 128 words. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_setTxDataSize(uint32_t base, + const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame); + +//***************************************************************************** +// +//! Disables a channel in an eight partition receiver +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the receiver channel number to be enabled. +//! +//! This function disables the given receiver channel number for the partition +//! provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_disableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Enables a channel for eight partition receiver +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the receiver channel number to be enabled. +//! +//! This function enables the given receiver channel number for the partition +//! provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_enableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Disables a channel in an eight partition transmitter +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the transmitter channel number to be enabled. +//! +//! This function disables the given transmitter channel number for the +//! partition provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_disableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Enables a channel for eight partition transmitter +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the transmitter channel number to be enabled. +//! +//! This function enables the given transmitter channel number for the +//! partition provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_enableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Configures transmitter clock +//! +//! \param base is the base address of the McBSP module. +//! \param ptrClockParams is a pointer to a structure containing \e clock +//! parameters McBSP_ClockParams. +//! This function sets up the transmitter clock. The following are valid +//! values and ranges for the parameters of the McBSP_TxFsyncParams. +//! - \b clockSRGSyncFSR - true to sync with signal on FSR pin, +//! false to ignore signal on FSR pin. +//! the pulse on FSR pin. +//! - \b clockSRGDivider - Maximum valid value is 255. +//! - \b clockSource - MCBSP_EXTERNAL_TX_CLOCK_SOURCE or +//! MCBSP_INTERNAL_TX_CLOCK_SOURCE +//! - \b clockTxSRGSource - MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK or +//! MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN +//! - \b clockMCLKXPolarity - Output polarity on MCLKX pin. +//! - MCBSP_TX_POLARITY_RISING_EDGE +//! - MCBSP_TX_POLARITY_FALLING_EDGE +//! - \b clockMCLKRPolarity - Input polarity on MCLKR pin (if SRG is +//! sourced from MCLKR pin). +//! - MCBSP_RX_POLARITY_FALLING_EDGE +//! - MCBSP_RX_POLARITY_RISING_EDGE +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxClock(uint32_t base, + const McBSP_ClockParams * ptrClockParams); + +//***************************************************************************** +// +//! Configures receiver clock +//! +//! \param base is the base address of the McBSP module. +//! \param ptrClockParams is a pointer to a structure containing \e clock +//! parameters McBSP_ClockParams. +//! This function sets up the receiver clock. The following are valid +//! values and ranges for the parameters of the McBSP_TxFsyncParams. +//! - \b clockSRGSyncFlag - true to sync with signal on FSR pin, false to +//! ignore the pulse on FSR pin. +//! - \b clockSRGDivider - Maximum valid value is 255. +//! - \b clockSource - MCBSP_EXTERNAL_RX_CLOCK_SOURCE or +//! MCBSP_INTERNAL_RX_CLOCK_SOURCE +//! - \b clockRxSRGSource - MCBSP_SRG_RX_CLOCK_SOURCE_LSPCLK or +//! MCBSP_SRG_RX_CLOCK_SOURCE_MCLKX_PIN +//! - \b clockMCLKRPolarity- output polarity on MCLKR pin. +//! - MCBSP_RX_POLARITY_FALLING_EDGE or +//! - MCBSP_RX_POLARITY_RISING_EDGE +//! - \b clockMCLKXPolarity- Input polarity on MCLKX pin (if SRG is sourced +//! from MCLKX pin). +//! - MCBSP_TX_POLARITY_RISING_EDGE or +//! - MCBSP_TX_POLARITY_FALLING_EDGE +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxClock(uint32_t base, + const McBSP_ClockParams * ptrClockParams); + +//***************************************************************************** +// +//! Configures transmitter frame sync. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrFsyncParams is a pointer to a structure containing \e frame sync +//! parameters McBSPTxFsyncParams. +//! This function sets up the transmitter frame sync. The following are valid +//! values and ranges for the parameters of the McBSPTxFsyncParams. +//! - \b syncSRGSyncFSRFlag - true to sync with signal on FSR pin, false to +//! ignore the pulse on FSR pin.This value has to +//! be similar to the value of +//! McBSP_ClockParams.clockSRGSyncFlag. +//! - \b syncErrorDetect - true to enable frame sync error detect. false +//! to disable. +//! - \b syncClockDivider - Maximum valid value is 4095. +//! - \b syncPulseDivider - Maximum valid value is 255. +//! - \b syncSourceTx - MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE or +//! MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE +//! - \b syncIntSource - MCBSP_TX_INTERNAL_FRAME_SYNC_DATA or +//! MCBSP_TX_INTERNAL_FRAME_SYNC_SRG +//! - \b syncFSXPolarity - MCBSP_TX_FRAME_SYNC_POLARITY_LOW or +//! MCBSP_TX_FRAME_SYNC_POLARITY_HIGH. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxFrameSync(uint32_t base, + const McBSP_TxFsyncParams * ptrFsyncParams); + +//***************************************************************************** +// +//! Configures receiver frame sync. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrFsyncParams is a pointer to a structure containing \e frame sync +//! parameters McBSP_RxFsyncParams. +//! This function sets up the receiver frame sync. The following are valid +//! values and ranges for the parameters of the McBSPTxFsyncParams. +//! - \b syncSRGSyncFSRFlag - true to sync with signal on FSR pin, +//! false to ignore the pulse on FSR pin. +//! This value has to be similar to the value of +//! McBSP_ClockParams.clockSRGSyncFlag. +//! - \b syncErrorDetect - true to enable frame sync error detect. +//! false to disable. +//! - \b syncClockDivider - Maximum valid value is 4095. +//! - \b syncPulseDivider - Maximum valid value is 255. +//! - \b syncSourceRx - MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE or +//! MCBSP_RX_EXTERNAL_FRAME_SYNC_SOURCE +//! - \b syncFSRPolarity - MCBSP_RX_FRAME_SYNC_POLARITY_LOW or +//! MCBSP_RX_FRAME_SYNC_POLARITY_HIGH +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxFrameSync(uint32_t base, + const McBSP_RxFsyncParams * ptrFsyncParams); + +//***************************************************************************** +// +//! Configures transmitter data format. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrDataParams is a pointer to a structure containing \e data format +//! parameters McBSPTxDataParams. +//! This function sets up the transmitter data format and properties. The +//! following are valid values and ranges for the parameters of the +//! McBSPTxDataParams. +//! - \b loopbackModeFlag - true for digital loop-back mode. +//! false for no loop-back mode. +//! - \b twoPhaseModeFlag - true for two phase mode. +//! false for single phase mode. +//! - \b pinDelayEnableFlag - true to enable DX pin delay. +//! false to disable DX pin delay. +//! - \b phase1FrameLength - maximum value of 127. +//! - \b phase2FrameLength - maximum value of 127. +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b phase1WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b phase2WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b compandingMode - MCBSP_COMPANDING_NONE, +//! MCBSP_COMPANDING_NONE_LSB_FIRST +//! MCBSP_COMPANDING_U_LAW_SET or +//! MCBSP_COMPANDING_A_LAW_SET. +//! - \b dataDelayBits - MCBSP_DATA_DELAY_BIT_0, +//! MCBSP_DATA_DELAY_BIT_1 or +//! MCBSP_DATA_DELAY_BIT_2 +//! - \b interruptMode - MCBSP_TX_ISR_SOURCE_TX_READY, +//! MCBSP_TX_ISR_SOURCE_END_OF_BLOCK, +//! MCBSP_TX_ISR_SOURCE_FRAME_SYNC or +//! MCBSP_TX_ISR_SOURCE_SYNC_ERROR +//! +//! \b Note - When using companding,phase1WordLength and phase2WordLength +//! must be 8 bits wide. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxDataFormat(uint32_t base, + const McBSP_TxDataParams * ptrDataParams); + +//***************************************************************************** +// +//! Configures receiver data format. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrDataParams is a pointer to a structure containing data format +//! parameters McBSP_RxDataParams. +//! This function sets up the transmitter data format and properties. The +//! following are valid values and ranges for the parameters of the +//! McBSP_RxDataParams. +//! - \b loopbackModeFlag - true for digital loop-back mode. +//! false for non loop-back mode. +//! - \b twoPhaseModeFlag - true for two phase mode. +//! false for single phase mode. +//! - \b phase1FrameLength - maximum value of 127. +//! - \b phase2FrameLength - maximum value of 127. +//! - \b phase1WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b phase2WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b compandingMode - MCBSP_COMPANDING_NONE, +//! MCBSP_COMPANDING_NONE_LSB_FIRST +//! MCBSP_COMPANDING_U_LAW_SET or +//! MCBSP_COMPANDING_A_LAW_SET. +//! - \b dataDelayBits - MCBSP_DATA_DELAY_BIT_0, +//! MCBSP_DATA_DELAY_BIT_1 or +//! MCBSP_DATA_DELAY_BIT_2 +//! - \b signExtMode - MCBSP_RIGHT_JUSTIFY_FILL_ZERO, +//! MCBSP_RIGHT_JUSTIFY_FILL_SIGN or +//! MCBSP_LEFT_JUSTIFY_FILL_ZER0 +//! - \b interruptMode - MCBSP_RX_ISR_SOURCE_SERIAL_WORD, +//! MCBSP_RX_ISR_SOURCE_END_OF_BLOCK, +//! MCBSP_RX_ISR_SOURCE_FRAME_SYNC or +//! MCBSP_RX_ISR_SOURCE_SYNC_ERROR +//! +//! \b Note - When using companding,phase1WordLength and phase2WordLength +//! must be 8 bits wide. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxDataFormat(uint32_t base, + const McBSP_RxDataParams * ptrDataParams); + +//***************************************************************************** +// +//! Configures transmitter multichannel. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrMchnParams is a pointer to a structure containing multichannel +//! parameters McBSP_TxMultichannelParams. +//! +//! This function sets up the transmitter multichannel mode. The following are +//! valid values and ranges for the parameters of the +//! McBSP_TxMultichannelParams. +//! - \b channelCount - Maximum value of 128 for partition 8 +//! Maximum value of 32 for partition 2 +//! - \b ptrChannelsList - Pointer to an array of size channelCount that +//! has unique channels. +//! - \b multichannelMode - MCBSP_ALL_TX_CHANNELS_ENABLED, +//! MCBSP_TX_CHANNEL_SELECTION_ENABLED, +//! MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION or +//! MCBSP_SYMMERTIC_RX_TX_SELECTION +//! - \b partition - MCBSP_MULTICHANNEL_TWO_PARTITION or +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION +//! \note - In 2 partition mode only channels that belong to a single even or +//! odd block number should be listed. It is valid to have an even and +//! odd channels. For example you can have channels [48 -63] and +//! channels [96 - 111] enables as one belongs to an even block and +//! the other to an odd block or two partitions. But not channels +//! [48 - 63] and channels [112 - 127] since they both are even blocks +//! or similar partitions. +//! +//! \return returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - number of channels exceeds 128 +//! - \b MCBSP_ERROR_2_PARTITION_A - invalid channel combination for +//! partition A +//! - \b MCBSP_ERROR_2_PARTITION_B - invalid channel combination for +//! partition B +//! - \b MCBSP_ERROR_INVALID_MODE - invalid transmitter channel mode. +//! +//! \return Returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - Exceeded number of channels. +//! - \b MCBSP_ERROR_2_PARTITION_A - Error in 2 partition A setup. +//! - \b MCBSP_ERROR_2_PARTITION_B - Error in 2 partition B setup. +//! - \b MCBSP_ERROR_INVALID_MODE - Invalid mode. +// +//***************************************************************************** +extern uint16_t +McBSP_configureTxMultichannel(uint32_t base, + const McBSP_TxMultichannelParams * ptrMchnParams); + +//***************************************************************************** +// +//! Configures receiver multichannel. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrMchnParams is a pointer to a structure containing multichannel +//! parameters McBSP_RxMultiChannelParams. +//! +//! This function sets up the receiver multichannel mode. The following are +//! valid values and ranges for the parameters of the McBSPMultichannelParams. +//! - \b channelCount - Maximum value of 128 for partition 8 +//! Maximum value of 32 for partition 2 +//! - \b ptrChannelsList - Pointer to an array of size channelCount that +//! has unique channels. +//! - \b multichannelMode - MCBSP_ALL_RX_CHANNELS_ENABLED, +//! MCBSP_RX_CHANNEL_SELECTION_ENABLED, +//! - \b partition - MCBSP_MULTICHANNEL_TWO_PARTITION or +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION +//! \note - In 2 partition mode only channels that belong to a single even or +//! odd block number should be listed. It is valid to have an even +//! and odd channels. For example you can have channels [48 - 63] and +//! channels [96 - 111] enables as one belongs to an even block and +//! the other to an odd block or two partitions. But not channels +//! [48 - 63]and channels [112 - 127] since they both are even blocks +//! or similar partitions. +//! +//! \return returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - number of channels exceeds 128 +//! - \b MCBSP_ERROR_2_PARTITION_A - invalid channel combination for +//! partition A +//! - \b MCBSP_ERROR_2_PARTITION_B - invalid channel combination for +//! partition B +//! - \b MCBSP_ERROR_INVALID_MODE - invalid transmitter channel mode. +//! +//! \return Returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - Exceeded number of channels. +//! - \b MCBSP_ERROR_2_PARTITION_A - Error in 2 partition A setup. +//! - \b MCBSP_ERROR_2_PARTITION_B - Error in 2 partition B setup. +//! - \b MCBSP_ERROR_INVALID_MODE - Invalid mode. +// +//***************************************************************************** +extern uint16_t +McBSP_configureRxMultichannel(uint32_t base, + const McBSP_RxMultichannelParams * ptrMchnParams); + +//***************************************************************************** +// +//! Configures McBSP in SPI master mode +//! +//! \param base is the base address of the McBSP module. +//! \param ptrSPIMasterMode is a pointer to a structure containing SPI +//! parameters McBSP_SPIMasterModeParams. +//! This function sets up the McBSP module in SPI master mode.The following are +//! valid values and ranges for the parameters of the +//! McBSP_SPIMasterModeParams. +//! - \b loopbackModeFlag - true for digital loop-back +//! false for no loop-back +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b wordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b spiMode It represents the clock polarity can take values: +//! - MCBSP_TX_POLARITY_RISING_EDGE or +//! MCBSP_TX_POLARITY_FALLING_EDGE +//! - \b clockSRGDivider - Maximum valid value is 255. +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureSPIMasterMode(uint32_t base, + const McBSP_SPIMasterModeParams * ptrSPIMasterMode); + +//***************************************************************************** +// +//! Configures McBSP in SPI slave mode +//! +//! \param base is the base address of the McBSP module. +//! \param ptrSPISlaveMode is a pointer to a structure containing SPI +//! parameters McBSP_SPISlaveModeParams. +//! This function sets up the McBSP module in SPI slave mode.The following are +//! valid values and ranges for the parameters of the McBSP_SPISlaveModeParams. +//! - \b loopbackModeFlag - true for digital loop-back +//! false for no loop-back +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b wordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b spiMode It represents the clock polarity and can take +//! values: +//! - MCBSP_RX_POLARITY_FALLING_EDGE or +//! MCBSP_RX_POLARITY_RISING_EDGE +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureSPISlaveMode(uint32_t base, + const McBSP_SPISlaveModeParams * ptrSPISlaveMode); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // MCBSP_H diff --git a/gpio_bitfield_cpu2/device/driverlib/memcfg.c b/gpio_bitfield_cpu2/device/driverlib/memcfg.c new file mode 100644 index 0000000..c9a4dc7 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/memcfg.c @@ -0,0 +1,701 @@ +//########################################################################### +// +// FILE: memcfg.c +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "memcfg.h" + + +//***************************************************************************** +// +// MemCfg_lockConfig +// +//***************************************************************************** +void +MemCfg_lockConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Set the bit that blocks writes to the sections' configuration registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Lock configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of memory sections. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_unlockConfig +// +//***************************************************************************** +void +MemCfg_unlockConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Clear the bit that blocks writes to the sections' configuration + // registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + + case MEMCFG_SECT_TYPE_MASK: + // + // Unlock configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_DX_ALL)); + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_LSX_ALL)); + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_GSX_ALL)); + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of memory sections. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_commitConfig +// +//***************************************************************************** +void +MemCfg_commitConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Set the bit that permanently blocks writes to the sections' + // configuration registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + + case MEMCFG_SECT_TYPE_MASK: + // + // Commit configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of RAM. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setProtection +// +//***************************************************************************** +void +MemCfg_setProtection(uint32_t memSection, uint32_t protectMode) +{ + uint32_t shiftVal = 0U; + uint32_t maskVal; + uint32_t regVal; + uint32_t sectionNum; + uint32_t regOffset; + + // + // Check the arguments. + // + ASSERT(((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS)); + + // + // Calculate how far the protect mode value needs to be shifted. Each + // section number is represented by a bit in the lower word of memSection + // and 8 bits in the corresponding ACCPROT register. + // + sectionNum = memSection & MEMCFG_SECT_NUM_MASK; + + while(sectionNum != 1U) + { + sectionNum = sectionNum >> 1U; + shiftVal += 8U; + } + + // + // Calculate register offset. Also, make sure the shift value is no greater + // than 31. + // + regOffset = (shiftVal & ~(0x1FU)) >> 4U; + shiftVal &= 0x0001FU; + maskVal = (uint32_t)MEMCFG_XACCPROTX_M << shiftVal; + regVal = protectMode << shiftVal; + + // + // Write the access protection mode into the appropriate field + // + EALLOW; + + switch(memSection & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_DXACCPROT0 + regOffset) |= regVal; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXACCPROT0 + regOffset) |= regVal; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXACCPROT0 + regOffset) |= regVal; + break; + + + default: + // + // Do nothing. Invalid memSection. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setLSRAMControllerSel +// +//***************************************************************************** +void +MemCfg_setLSRAMControllerSel(uint32_t ramSection, + MemCfg_LSRAMControllerSel controllerSel) +{ + uint32_t shiftVal; + uint32_t temp; + + // + // Check the arguments. + // + ASSERT((ramSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS); + + // + // Calculate how far the controller select value needs to be shifted. Each + // section number is represented by a bit in the lower word of ramSection + // and 2 bits in the corresponding MSEL register. + // + shiftVal = 0U; + temp = MEMCFG_SECT_NUM_MASK & ramSection; + + while(temp != 1U) + { + temp = temp >> 1U; + shiftVal += 2U; + } + + // + // Write the controller select setting into the appropriate field + // + EALLOW; + + HWREG(MEMCFG_BASE + MEMCFG_O_LSXMSEL) = + (HWREG(MEMCFG_BASE + MEMCFG_O_LSXMSEL) & + ~((uint32_t)MEMCFG_LSXMSEL_MSEL_LS0_M << shiftVal)) | + ((uint32_t)controllerSel << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setGSRAMControllerSel +// +//***************************************************************************** +void +MemCfg_setGSRAMControllerSel(uint32_t ramSections, + MemCfg_GSRAMControllerSel controllerSel) +{ + uint32_t sectionNum; + + // + // Check the arguments. + // + ASSERT((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS); + + // + // We only need the section number bits for this function. + // + sectionNum = ramSections & MEMCFG_SECT_NUM_MASK; + + // + // Write the controller select setting into the appropriate field. + // + EALLOW; + if(controllerSel == MEMCFG_GSRAMCONTROLLER_CPU1) + { + HWREG(MEMCFG_BASE + MEMCFG_O_GSXMSEL) &= ~sectionNum; + } + else + { + HWREG(MEMCFG_BASE + MEMCFG_O_GSXMSEL) |= sectionNum; + } + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setTestMode +// +//***************************************************************************** +void +MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode) +{ + uint32_t shiftVal = 0U; + uint32_t maskVal; + uint32_t regVal; + uint32_t sectionNum; + + // + // Check the arguments. + // + ASSERT(((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG)); + + // + // Calculate how far the protect mode value needs to be shifted. Each + // section number is represented by a bit in the lower word of memSection + // and 2 bits in the corresponding TEST register. + // + sectionNum = memSection & MEMCFG_SECT_NUM_MASK; + + while(sectionNum != 1U) + { + sectionNum = sectionNum >> 1U; + shiftVal += 2U; + } + + maskVal = (uint32_t)MEMCFG_XTEST_M << shiftVal; + regVal = (uint32_t)testMode << shiftVal; + + // + // Write the test mode into the appropriate field + // + EALLOW; + + switch(memSection & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_DXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_MSG: + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXTEST) |= regVal; + break; + + default: + // + // Do nothing. Invalid memSection. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_initSections +// +//***************************************************************************** +void +MemCfg_initSections(uint32_t ramSections) +{ + // + // Check the arguments. + // + ASSERT(((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG) || + (ramSections == MEMCFG_SECT_ALL)); + + // + // Set the bit in the various initialization registers that starts + // initialization. + // + EALLOW; + + switch(ramSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_MSG: + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Initialize all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_MSGX_ALL; + break; + + default: + // + // Do nothing. Invalid ramSections. Make sure you aren't OR-ing + // values for two different types of RAM. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_getInitStatus +// +//***************************************************************************** +bool +MemCfg_getInitStatus(uint32_t ramSections) +{ + uint32_t status; + + // + // Check the arguments. + // + ASSERT(((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG) || + (ramSections == MEMCFG_SECT_ALL)); + + // + // Read registers containing the initialization complete status. + // + switch(ramSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + status = HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE); + break; + + case MEMCFG_SECT_TYPE_LS: + status = HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE); + break; + + case MEMCFG_SECT_TYPE_GS: + status = HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE); + break; + + case MEMCFG_SECT_TYPE_MSG: + status = HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE); + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Return the overall status. + // + if((HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE) == + (MEMCFG_SECT_DX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE) == + (MEMCFG_SECT_LSX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE) == + (MEMCFG_SECT_GSX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE) == + (MEMCFG_SECT_MSGX_ALL & MEMCFG_SECT_NUM_MASK))) + { + status = MEMCFG_SECT_NUM_MASK; + } + else + { + status = 0U; + } + break; + + default: + // + // Invalid ramSections. Make sure you aren't OR-ing values for two + // different types of RAM. + // + status = 0U; + break; + } + + return((ramSections & status) == (ramSections & MEMCFG_SECT_NUM_MASK)); +} + +//***************************************************************************** +// +// MemCfg_getViolationAddress +// +//***************************************************************************** +uint32_t +MemCfg_getViolationAddress(uint32_t intFlag) +{ + uint32_t address; + uint32_t stsNumber; + + // + // Calculate the the address of the desired violation address register. + // + if((intFlag & MEMCFG_MVIOL_MASK) != 0U) + { + stsNumber = intFlag >> MEMCFG_MVIOL_SHIFT; + address = ACCESSPROTECTION_BASE + MEMCFG_O_MCPUFAVADDR; + } + else + { + stsNumber = intFlag; + address = ACCESSPROTECTION_BASE + MEMCFG_O_NMCPURDAVADDR; + } + + while(stsNumber > 1U) + { + stsNumber = stsNumber >> 1U; + address += (uint32_t)(MEMCFG_O_NMCPUWRAVADDR - MEMCFG_O_NMCPURDAVADDR); + } + + // + // Read and return the access violation address at the calculated location. + // + return(HWREG(address)); +} + +//***************************************************************************** +// +// MemCfg_getCorrErrorAddress +// +//***************************************************************************** +uint32_t +MemCfg_getCorrErrorAddress(uint32_t stsFlag) +{ + // + // Check the arguments. + // + if(stsFlag != MEMCFG_CERR_CPUREAD) + { + // + // Currently, the only correctable error address that can be read + // from a register is one for a CPU read error (MEMCFG_CERR_CPUREAD). + // For the sake of keeping this function portable to possible future + // devices with other error types, it still takes a stsFlag parameter. + // + ASSERT((bool)false); + } + + // + // Read and return the error address. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CCPUREADDR)); +} + +//***************************************************************************** +// +// MemCfg_getUncorrErrorAddress +// +//***************************************************************************** +uint32_t +MemCfg_getUncorrErrorAddress(uint32_t stsFlag) +{ + uint32_t address; + uint32_t temp; + + // + // Calculate the the address of the desired error address register. + // + address = MEMORYERROR_BASE + MEMCFG_O_UCCPUREADDR; + + temp = stsFlag; + + while(temp > 1U) + { + temp = temp >> 1U; + address += (uint32_t)(MEMCFG_O_UCDMAREADDR - MEMCFG_O_UCCPUREADDR); + } + + // + // Read and return the error address at the calculated location. + // + return(HWREG(address)); +} + + diff --git a/gpio_bitfield_cpu2/device/driverlib/memcfg.h b/gpio_bitfield_cpu2/device/driverlib/memcfg.h new file mode 100644 index 0000000..8a9b6fc --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/memcfg.h @@ -0,0 +1,1266 @@ +//########################################################################### +// +// FILE: memcfg.h +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef MEMCFG_H +#define MEMCFG_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup memcfg_api MemCfg +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memcfg.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +// +// Masks to decode memory section defines. +// +#define MEMCFG_SECT_TYPE_MASK 0xFF000000U +#define MEMCFG_SECT_TYPE_D 0x00000000U +#define MEMCFG_SECT_TYPE_LS 0x01000000U +#define MEMCFG_SECT_TYPE_GS 0x02000000U +#define MEMCFG_SECT_TYPE_MSG 0x03000000U +#define MEMCFG_SECT_NUM_MASK 0x00FFFFFFU +#define MEMCFG_XACCPROTX_M ((uint32_t)MEMCFG_GSXACCPROT0_FETCHPROT_GS0 | \ + (uint32_t)MEMCFG_GSXACCPROT0_CPUWRPROT_GS0 | \ + (uint32_t)MEMCFG_GSXACCPROT0_DMAWRPROT_GS0) +#define MEMCFG_XTEST_M MEMCFG_DXTEST_TEST_M0_M + +// +// Used for access violation functions. +// +#define MEMCFG_NMVIOL_MASK 0x0000FFFFU +#define MEMCFG_MVIOL_MASK 0x000F0000U +#define MEMCFG_MVIOL_SHIFT 16U + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to MemCfg_lockConfig(), MemCfg_unlockConfig(), +// MemCfg_commitConfig(), MemCfg_setProtection(), MemCfg_initSections(), +// MemCfg_setCLAMemType(), MemCfg_setLSRAMControllerSel(), +// MemCfg_getInitStatus() as the memSection(s) or ramSection(s) parameter. +// +//***************************************************************************** +// +// DxRAM - Dedicated RAM config +// +#define MEMCFG_SECT_M0 0x00000001U //!< M0 RAM +#define MEMCFG_SECT_M1 0x00000002U //!< M1 RAM +#define MEMCFG_SECT_D0 0x00000004U //!< D0 RAM +#define MEMCFG_SECT_D1 0x00000008U //!< D1 RAM +#define MEMCFG_SECT_DX_ALL 0x0000000FU //!< All M and D RAM + +// +// LSxRAM - Local shared RAM config +// +#define MEMCFG_SECT_LS0 0x01000001U //!< LS0 RAM +#define MEMCFG_SECT_LS1 0x01000002U //!< LS1 RAM +#define MEMCFG_SECT_LS2 0x01000004U //!< LS2 RAM +#define MEMCFG_SECT_LS3 0x01000008U //!< LS3 RAM +#define MEMCFG_SECT_LS4 0x01000010U //!< LS4 RAM +#define MEMCFG_SECT_LS5 0x01000020U //!< LS5 RAM +#define MEMCFG_SECT_LSX_ALL 0x0100003FU //!< All LS RAM + +// +// GSxRAM - Global shared RAM config +// +#define MEMCFG_SECT_GS0 0x02000001U //!< GS0 RAM +#define MEMCFG_SECT_GS1 0x02000002U //!< GS1 RAM +#define MEMCFG_SECT_GS2 0x02000004U //!< GS2 RAM +#define MEMCFG_SECT_GS3 0x02000008U //!< GS3 RAM +#define MEMCFG_SECT_GS4 0x02000010U //!< GS4 RAM +#define MEMCFG_SECT_GS5 0x02000020U //!< GS5 RAM +#define MEMCFG_SECT_GS6 0x02000040U //!< GS6 RAM +#define MEMCFG_SECT_GS7 0x02000080U //!< GS7 RAM +#define MEMCFG_SECT_GS8 0x02000100U //!< GS8 RAM +#define MEMCFG_SECT_GS9 0x02000200U //!< GS9 RAM +#define MEMCFG_SECT_GS10 0x02000400U //!< GS10 RAM +#define MEMCFG_SECT_GS11 0x02000800U //!< GS11 RAM +#define MEMCFG_SECT_GS12 0x02001000U //!< GS12 RAM +#define MEMCFG_SECT_GS13 0x02002000U //!< GS13 RAM +#define MEMCFG_SECT_GS14 0x02004000U //!< GS14 RAM +#define MEMCFG_SECT_GS15 0x02008000U //!< GS15 RAM +#define MEMCFG_SECT_GSX_ALL 0x0200FFFFU //!< All GS RAM + +// +// MSGxRAM - Message RAM config +// +#define MEMCFG_SECT_MSGCPUTOCPU 0x03000001U //!< CPU-to-CPU message RAM +#define MEMCFG_SECT_MSGCPUTOCLA1 0x03000002U //!< CPU-to-CLA1 message RAM +#define MEMCFG_SECT_MSGCLA1TOCPU 0x03000004U //!< CLA1-to-CPU message RAM +#define MEMCFG_SECT_MSGX_ALL 0x03000007U //!< All message RAM + + +// +// All sections +// +#define MEMCFG_SECT_ALL 0xFFFFFFFFU //!< All configurable RAM + +//***************************************************************************** +// +// Values that can be passed to MemCfg_setProtection() as the protectMode +// parameter. +// +//***************************************************************************** +#define MEMCFG_PROT_ALLOWCPUFETCH 0x00000000U //!< CPU fetch allowed +#define MEMCFG_PROT_BLOCKCPUFETCH 0x00000001U //!< CPU fetch blocked + +#define MEMCFG_PROT_ALLOWCPUWRITE 0x00000000U //!< CPU write allowed +#define MEMCFG_PROT_BLOCKCPUWRITE 0x00000002U //!< CPU write blocked + +#define MEMCFG_PROT_ALLOWDMAWRITE 0x00000000U //!< DMA write allowed (GSxRAM) +#define MEMCFG_PROT_BLOCKDMAWRITE 0x00000004U //!< DMA write blocked (GSxRAM) + +//***************************************************************************** +// +// Values that can be passed to MemCfg_enableViolationInterrupt() +// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(), +// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as +// the intFlags parameter. They also make up the return value of +// MemCfg_getViolationInterruptStatus(). +// +//***************************************************************************** +#define MEMCFG_NMVIOL_CPUREAD 0x00000001U //!< Non-controller CPU read access +#define MEMCFG_NMVIOL_CPUWRITE 0x00000002U //!< Non-controller CPU write access +#define MEMCFG_NMVIOL_CPUFETCH 0x00000004U //!< Non-controller CPU fetch access +#define MEMCFG_NMVIOL_DMAWRITE 0x00000008U //!< Non-controller DMA write access +#define MEMCFG_NMVIOL_CLA1READ 0x00000010U //!< Non-controller CLA1 read access +#define MEMCFG_NMVIOL_CLA1WRITE 0x00000020U //!< Non-controller CLA1 write access +#define MEMCFG_NMVIOL_CLA1FETCH 0x00000040U //!< Non-controller CLA1 fetch access + +//***************************************************************************** +// +// Values that can be passed to MemCfg_enableViolationInterrupt() +// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(), +// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as +// the intFlags parameter. They also make up the return value of +// MemCfg_getViolationInterruptStatus(). +// +//***************************************************************************** +#define MEMCFG_MVIOL_CPUFETCH 0x00010000U //!< Controller CPU fetch access +#define MEMCFG_MVIOL_CPUWRITE 0x00020000U //!< Controller CPU write access +#define MEMCFG_MVIOL_DMAWRITE 0x00040000U //!< Controller DMA write access + +//***************************************************************************** +// +// Values that can be passed to MemCfg_forceCorrErrorStatus(), +// MemCfg_clearCorrErrorStatus(), and MemCfg_getCorrErrorAddress() as the +// stsFlag(s) parameter and returned by MemCfg_getCorrErrorStatus(). +// +// Note that MEMCFG_CERR_CPUREAD is the only value below that has a +// corresponding interrupt and may be used with the error functions that take +// an intFlag(s) parameter. +// +//***************************************************************************** +#define MEMCFG_CERR_CPUREAD 0x0001U //!< Correctable CPU read error +#define MEMCFG_CERR_DMAREAD 0x0002U //!< Correctable DMA read error +#define MEMCFG_CERR_CLA1READ 0x0004U //!< Correctable CLA1 read error +//***************************************************************************** +// +// Values that can be passed to MemCfg_forceUncorrErrorStatus(), +// MemCfg_clearUncorrErrorStatus(), and MemCfg_getUncorrErrorAddress() as the +// stsFlag(s) parameter and returned by MemCfg_getUncorrErrorStatus(). +// +//***************************************************************************** +#define MEMCFG_UCERR_CPUREAD 0x0001U //!< Uncorrectable CPU read error +#define MEMCFG_UCERR_DMAREAD 0x0002U //!< Uncorrectable DMA read error +#define MEMCFG_UCERR_CLA1READ 0x0004U //!< Uncorrectable CLA1 read error + +#endif + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setCLAMemType() as the \e claMemType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_CLA_MEM_DATA, //!< Section is CLA data memory + MEMCFG_CLA_MEM_PROGRAM //!< Section is CLA program memory +} MemCfg_CLAMemoryType; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setLSRAMControllerSel() as the +//! \e controllerSel parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_LSRAMCONTROLLER_CPU_ONLY, //!< CPU is the owner of the section + MEMCFG_LSRAMCONTROLLER_CPU_CLA1 //!< CPU and CLA1 share this section +} MemCfg_LSRAMControllerSel; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setGSRAMControllerSel() as the +//! \e controllerSel parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_GSRAMCONTROLLER_CPU1, //!< CPU1 is controller of the section + MEMCFG_GSRAMCONTROLLER_CPU2 //!< CPU2 is controller of the section +} MemCfg_GSRAMControllerSel; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setTestMode() as the \e testMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Functional mode. Test mode is disabled. + MEMCFG_TEST_FUNCTIONAL = 0, + //! Writes allowed to data only + MEMCFG_TEST_WRITE_DATA = 1, + //! Writes allowed to ECC only (for DxRAM/MxRAM) + MEMCFG_TEST_WRITE_ECC = 2, + //! Writes allowed to parity only (for LSxRAM, GSxRAM, and MSGxRAM) + MEMCFG_TEST_WRITE_PARITY = 2 +} MemCfg_TestMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Sets the CLA memory type of the specified RAM section. +//! +//! \param ramSections is the logical OR of the sections to be configured. +//! \param claMemType indicates data memory or program memory. +//! +//! This function sets the CLA memory type configuration of the RAM section. If +//! the \e claMemType parameter is \b MEMCFG_CLA_MEM_DATA, the RAM section will +//! be configured as CLA data memory. If \b MEMCFG_CLA_MEM_PROGRAM, the RAM +//! section will be configured as CLA program memory. +//! +//! The \e ramSections parameter is an OR of the following indicators: +//! \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx. +//! +//! \note This API only applies to LSx RAM and has no effect if the CLA isn't +//! controller of the memory section. +//! +//! \sa MemCfg_setLSRAControllerSel() +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_setCLAMemType(uint32_t ramSections, MemCfg_CLAMemoryType claMemType) +{ + // + // Check the arguments. + // + ASSERT((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS); + + // + // Write the CLA memory configuration to the appropriate register. Either + // set or clear the bit that determines the function of the RAM section as + // it relates to the CLA. + // + EALLOW; + + if(claMemType == MEMCFG_CLA_MEM_PROGRAM) + { + // + // Program memory + // + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) |= ramSections; + } + else + { + // + // Data memory + // + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) &= ~ramSections; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables individual RAM access violation interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! This function enables the indicated RAM access violation interrupt sources. +//! Only the sources that are enabled can be reflected to the processor +//! interrupt; disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableViolationInterrupt(uint32_t intFlags) +{ + // + // Enable the specified interrupts. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) |= + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) |= + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Disables individual RAM access violation interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! This function disables the indicated RAM access violation interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only non-controller violations may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableViolationInterrupt(uint32_t intFlags) +{ + // + // Disable the specified interrupts. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) &= + ~(intFlags & MEMCFG_NMVIOL_MASK); + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) &= + ~((intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current RAM access violation status. +//! +//! This function returns the RAM access violation status. This function will +//! return flags for both controller and non-controller access violations +//! although only the non-controller flags have the ability to cause the +//! generation of an interrupt. +//! +//! \return Returns the current violation status, enumerated as a bit field of +//! the values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//***************************************************************************** +static inline uint32_t +MemCfg_getViolationInterruptStatus(void) +{ + uint32_t status; + + // + // Read and return RAM access status flags. + // + status = (HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVFLG)) | + (HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVFLG) << + MEMCFG_MVIOL_SHIFT); + + return(status); +} + +//***************************************************************************** +// +//! Sets the RAM access violation status. +//! +//! \param intFlags is a bit mask of the access violation flags to be set. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! This function sets the RAM access violation status. This function will +//! set flags for both controller and non-controller access violations, and an +//! interrupt will be generated if it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceViolationInterrupt(uint32_t intFlags) +{ + // + // Shift and mask the flags appropriately and write them to the + // corresponding SET register. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVSET) = + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVSET) = + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Clears RAM access violation flags. +//! +//! \param intFlags is a bit mask of the access violation flags to be cleared. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearViolationInterruptStatus(uint32_t intFlags) +{ + // + // Clear the requested access violation flags. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVCLR) |= + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVCLR) |= + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the correctable error threshold value. +//! +//! \param threshold is the correctable error threshold. +//! +//! This value sets the error-count threshold at which a correctable error +//! interrupt is generated. That is when the error count register reaches the +//! value specified by the \e threshold parameter, an interrupt is +//! generated if it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_setCorrErrorThreshold(uint32_t threshold) +{ + // + // Write the threshold value to the appropriate register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRTHRES) = threshold; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the correctable error count. +//! +//! \return Returns the number of correctable error have occurred. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorCount(void) +{ + // + // Read and return the number of errors that have occurred. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCNT)); +} + +//***************************************************************************** +// +//! Enables individual RAM correctable error interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be enabled. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function enables the indicated RAM correctable error interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Enable the specified interrupts. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) |= intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Disables individual RAM correctable error interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be disabled. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function disables the indicated RAM correctable error interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Disable the specified interrupts. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) &= ~(intFlags); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current RAM correctable error interrupt status. +//! +//! \return Returns the current error interrupt status. Will return a value of +//! \b MEMCFG_CERR_CPUREAD if an interrupt has been generated. If not, the +//! function will return 0. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorInterruptStatus(void) +{ + // + // Read and return correctable error interrupt flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTFLG)); +} + +//***************************************************************************** +// +//! Sets the RAM correctable error interrupt status. +//! +//! \param intFlags is a bit mask of the interrupt sources to be set. Can take +//! the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function sets the correctable error interrupt flag. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTSET) = intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears the RAM correctable error interrupt status. +//! +//! \param intFlags is a bit mask of the interrupt sources to be cleared. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function clears the correctable error interrupt flag. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearCorrErrorInterruptStatus(uint32_t intFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTCLR) |= intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current correctable RAM error status. +//! +//! \return Returns the current error status, enumerated as a bit field of +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorStatus(void) +{ + // + // Read and return RAM error status flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRFLG)); +} + +//***************************************************************************** +// +//! Gets the current uncorrectable RAM error status. +//! +//! \return Returns the current error status, enumerated as a bit field of +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getUncorrErrorStatus(void) +{ + // + // Read and return RAM error status flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRFLG)); +} + +//***************************************************************************** +// +//! Sets the specified correctable RAM error status flag. +//! +//! \param stsFlags is a bit mask of the error sources. This parameter can be +//! any of the following values: +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +//! +//! This function sets the specified correctable RAM error status flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceCorrErrorStatus(uint32_t stsFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRSET) = stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the specified uncorrectable RAM error status flag. +//! +//! \param stsFlags is a bit mask of the error sources. This parameter can be +//! any of the following values: +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +//! +//! This function sets the specified uncorrectable RAM error status flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceUncorrErrorStatus(uint32_t stsFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRSET) = stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears correctable RAM error flags. +//! +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! This parameter can be any of the following : +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +//! +//! This function clears the specified correctable RAM error flags. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearCorrErrorStatus(uint32_t stsFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCLR) |= stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears uncorrectable RAM error flags. +//! +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! This parameter can be any of the following : +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +//! +//! This function clears the specified uncorrectable RAM error flags. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearUncorrErrorStatus(uint32_t stsFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRCLR) |= stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Enables ROM wait state. +//! +//! This function enables the ROM wait state. This mean CPU accesses to ROM are +//! 1-wait. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableROMWaitState(void) +{ + // + // Clear the disable bit. + // + EALLOW; + + HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) &= + ~((uint32_t)MEMCFG_ROMWAITSTATE_WSDISABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Disables ROM wait state. +//! +//! This function enables the ROM wait state. This mean CPU accesses to ROM are +//! 0-wait. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableROMWaitState(void) +{ + // + // Set the disable bit. + // + EALLOW; + + HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) |= + MEMCFG_ROMWAITSTATE_WSDISABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Enables ROM prefetch. +//! +//! This function enables the ROM prefetch for both secure ROM and boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableROMPrefetch(void) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) |= + MEMCFG_ROMPREFETCH_PFENABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Disables ROM prefetch. +//! +//! This function enables the ROM prefetch for both secure ROM and boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableROMPrefetch(void) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) &= + ~((uint32_t)MEMCFG_ROMPREFETCH_PFENABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the writes to the configuration of specified memory sections. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function locks writes to the access protection and controller select +//! configuration of a memory section.That means calling MemCfg_setProtection() +//! or MemCfg_setLSRAMControllerSel() for a locked memory section will have no +//! effect until MemCfg_unlockConfig() is called. +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_lockConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Unlocks the writes to the configuration of a memory section. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function unlocks writes to the access protection and controller select +//! configuration of a memory section that has been locked using +//! MemCfg_lockConfig(). +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_unlockConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Permanently locks writes to the configuration of a memory section. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function permanently locks writes to the access protection and +//! controller select configuration of a memory section. That means calling +//! MemCfg_setProtection() or MemCfg_setLSRAMControllerSel() for a locked memory +//! section will have no effect. To lock the configuration in a nonpermanent +//! way, use MemCfg_lockConfig(). +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_commitConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Sets the access protection mode of a single memory section. +//! +//! \param memSection is the memory section to be configured. +//! \param protectMode is the logical OR of the settings to be applied. +//! +//! This function sets the access protection mode of a specified memory section. +//! The mode is passed into the \e protectMode parameter as the logical OR of +//! the following values: +//! - \b MEMCFG_PROT_ALLOWCPUFETCH or \b MEMCFG_PROT_BLOCKCPUFETCH - CPU fetch +//! - \b MEMCFG_PROT_ALLOWCPUWRITE or \b MEMCFG_PROT_BLOCKCPUWRITE - CPU write +//! - \b MEMCFG_PROT_ALLOWDMAWRITE or \b MEMCFG_PROT_BLOCKDMAWRITE - DMA write +//! +//! The \e memSection parameter is one of the following indicators: +//! - \b MEMCFG_SECT_D0 or \b MEMCFG_SECT_D1 +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig() or if the memory +//! is configured as CLA program memory. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setProtection(uint32_t memSection, uint32_t protectMode); + +//***************************************************************************** +// +//! Sets the controller of the specified LSxRAM section. +//! +//! \param ramSection is the LSxRAM section to be configured. +//! \param controllerSel is the sharing selection. +//! +//! This function sets the controller select configuration of the LSxRAM +//! section. +//! If the \e controllerSel parameter is \b MEMCFG_LSRAMCONTROLLER_CPU_ONLY, +//! the LSxRAM section passed into the \e ramSection parameter will be dedicated +//! to the CPU. If \b MEMCFG_LSRAMCONTROLLER_CPU_CLA1, the memory section will +//! be shared between the CPU and the CLA. +//! +//! The \e ramSection parameter should be a value from \b MEMCFG_SECT_LS0 +//! through \b MEMCFG_SECT_LSx. +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig(). +//! +//! \note This API only applies to LSxRAM. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setLSRAMControllerSel(uint32_t ramSection, + MemCfg_LSRAMControllerSel controllerSel); + +//***************************************************************************** +// +//! Sets the controller of the specified GSxRAM section. +//! +//! \param ramSections is the logical OR of the sections to be configured. +//! \param controllerSel is the sharing selection. +//! +//! This function sets the controller select configuration of the GSxRAM +//! section.If the \e controllerSel parameter is \b MEMCFG_GSRAMCONTROLLER_CPU1, +//! the GSRAM sections passed into the \e ramSections parameter will be +//! dedicated to CPU1. If \b MEMCFG_GSRAMCONTROLLER_CPU2, the memory section +//! will be dedicated to CPU2. +//! +//! The \e ramSections parameter should be a logical OR of values from +//! \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx. +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig(). +//! +//! \note This API only applies to GSxRAM. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setGSRAMControllerSel(uint32_t ramSections, + MemCfg_GSRAMControllerSel controllerSel); + +//***************************************************************************** +// +//! Sets the test mode of the specified memory section. +//! +//! \param memSection is the memory section to be configured. +//! \param testMode is the test mode selected. +//! +//! This function sets the test mode configuration of the RAM section. The +//! \e testMode parameter can take one of the following values: +//! - \b MEMCFG_TEST_FUNCTIONAL +//! - \b MEMCFG_TEST_WRITE_DATA +//! - \b MEMCFG_TEST_WRITE_ECC +//! - \b MEMCFG_TEST_WRITE_PARITY +//! +//! The \e memSection parameter is one of the following indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1 +//! - \b MEMCFG_SECT_D0, \b MEMCFG_SECT_D1 +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode); + +//***************************************************************************** +// +//! Starts the initialization the specified RAM sections. +//! +//! \param ramSections is the logical OR of the sections to be initialized. +//! +//! This function starts the initialization of the specified RAM sections. Use +//! MemCfg_getInitStatus() to check if the initialization is done. +//! +//! The \e ramSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0, +//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_initSections(uint32_t ramSections); + +//***************************************************************************** +// +//! Get the status of initialized RAM sections. +//! +//! \param ramSections is the logical OR of the sections to be checked. +//! +//! This function gets the initialization status of the RAM sections specified +//! by the \e ramSections parameter. +//! +//! The \e ramSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0, +//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! - \b OR use \b MEMCFG_SECT_ALL to get status of all possible sections. +//! +//! \note Use MemCfg_initSections() to start the initialization. +//! +//! \return Returns \b true if all the sections specified by \e ramSections +//! have been initialized and \b false if not. +// +//***************************************************************************** +extern bool +MemCfg_getInitStatus(uint32_t ramSections); + +//***************************************************************************** +// +//! Get the violation address associated with a intFlag. +//! +//! \param intFlag is the type of access violation as indicated by ONE of +//! these values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! \return Returns the violation address associated with the \e intFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getViolationAddress(uint32_t intFlag); + +//***************************************************************************** +// +//! Get the correctable error address associated with a stsFlag. +//! +//! \param stsFlag is the type of error to which the returned address will +//! correspond. Can currently take the value \b MEMCFG_CERR_CPUREAD only. +//! Other values are reserved. +//! +//! \return Returns the error address associated with the stsFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getCorrErrorAddress(uint32_t stsFlag); + +//***************************************************************************** +// +//! Get the uncorrectable error address associated with a stsFlag. +//! +//! \param stsFlag is the type of error to which the returned address will +//! correspond. It may be passed one of these values: +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, or +//! \b MEMCFG_UCERR_CLA1READ values +//! +//! \return Returns the error address associated with the stsFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getUncorrErrorAddress(uint32_t stsFlag); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // MEMCFG_H diff --git a/gpio_bitfield_cpu2/device/driverlib/pin_map.h b/gpio_bitfield_cpu2/device/driverlib/pin_map.h new file mode 100644 index 0000000..95c6fa3 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/pin_map.h @@ -0,0 +1,894 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef __PIN_MAP_H__ +#define __PIN_MAP_H__ + +//***************************************************************************** +// 0x00000003 = MUX register value +// 0x0000000C = GMUX register value +// 0x0000FF00 = Shift amount within mux registers +// 0xFFFF0000 = Offset of MUX register +//***************************************************************************** + + +#define GPIO_0_GPIO0 0x00060000U +#define GPIO_0_EPWM1A 0x00060001U +#define GPIO_0_SDAA 0x00060006U + +#define GPIO_1_GPIO1 0x00060200U +#define GPIO_1_EPWM1B 0x00060201U +#define GPIO_1_MFSRB 0x00060203U +#define GPIO_1_SCLA 0x00060206U + +#define GPIO_2_GPIO2 0x00060400U +#define GPIO_2_EPWM2A 0x00060401U +#define GPIO_2_OUTPUTXBAR1 0x00060405U +#define GPIO_2_SDAB 0x00060406U + +#define GPIO_3_GPIO3 0x00060600U +#define GPIO_3_EPWM2B 0x00060601U +#define GPIO_3_OUTPUTXBAR2 0x00060602U +#define GPIO_3_MCLKRB 0x00060603U +#define GPIO_3_SCLB 0x00060606U + +#define GPIO_4_GPIO4 0x00060800U +#define GPIO_4_EPWM3A 0x00060801U +#define GPIO_4_OUTPUTXBAR3 0x00060805U +#define GPIO_4_CANTXA 0x00060806U + +#define GPIO_5_GPIO5 0x00060A00U +#define GPIO_5_EPWM3B 0x00060A01U +#define GPIO_5_MFSRA 0x00060A02U +#define GPIO_5_OUTPUTXBAR3 0x00060A03U +#define GPIO_5_CANRXA 0x00060A06U + +#define GPIO_6_GPIO6 0x00060C00U +#define GPIO_6_EPWM4A 0x00060C01U +#define GPIO_6_OUTPUTXBAR4 0x00060C02U +#define GPIO_6_EPWMSYNCO 0x00060C03U +#define GPIO_6_EQEP3A 0x00060C05U +#define GPIO_6_CANTXB 0x00060C06U + +#define GPIO_7_GPIO7 0x00060E00U +#define GPIO_7_EPWM4B 0x00060E01U +#define GPIO_7_MCLKRA 0x00060E02U +#define GPIO_7_OUTPUTXBAR5 0x00060E03U +#define GPIO_7_EQEP3B 0x00060E05U +#define GPIO_7_CANRXB 0x00060E06U + +#define GPIO_8_GPIO8 0x00061000U +#define GPIO_8_EPWM5A 0x00061001U +#define GPIO_8_CANTXB 0x00061002U +#define GPIO_8_ADCSOCAO 0x00061003U +#define GPIO_8_EQEP3S 0x00061005U +#define GPIO_8_SCITXDA 0x00061006U + +#define GPIO_9_GPIO9 0x00061200U +#define GPIO_9_EPWM5B 0x00061201U +#define GPIO_9_SCITXDB 0x00061202U +#define GPIO_9_OUTPUTXBAR6 0x00061203U +#define GPIO_9_EQEP3I 0x00061205U +#define GPIO_9_SCIRXDA 0x00061206U + +#define GPIO_10_GPIO10 0x00061400U +#define GPIO_10_EPWM6A 0x00061401U +#define GPIO_10_CANRXB 0x00061402U +#define GPIO_10_ADCSOCBO 0x00061403U +#define GPIO_10_EQEP1A 0x00061405U +#define GPIO_10_SCITXDB 0x00061406U +#define GPIO_10_UPP_WAIT 0x0006140FU + +#define GPIO_11_GPIO11 0x00061600U +#define GPIO_11_EPWM6B 0x00061601U +#define GPIO_11_SCIRXDB 0x00061602U +#define GPIO_11_OUTPUTXBAR7 0x00061603U +#define GPIO_11_EQEP1B 0x00061605U +#define GPIO_11_UPP_STRT 0x0006160FU + +#define GPIO_12_GPIO12 0x00061800U +#define GPIO_12_EPWM7A 0x00061801U +#define GPIO_12_CANTXB 0x00061802U +#define GPIO_12_MDXB 0x00061803U +#define GPIO_12_EQEP1S 0x00061805U +#define GPIO_12_SCITXDC 0x00061806U +#define GPIO_12_UPP_ENA 0x0006180FU + +#define GPIO_13_GPIO13 0x00061A00U +#define GPIO_13_EPWM7B 0x00061A01U +#define GPIO_13_CANRXB 0x00061A02U +#define GPIO_13_MDRB 0x00061A03U +#define GPIO_13_EQEP1I 0x00061A05U +#define GPIO_13_SCIRXDC 0x00061A06U +#define GPIO_13_UPP_D7 0x00061A0FU + +#define GPIO_14_GPIO14 0x00061C00U +#define GPIO_14_EPWM8A 0x00061C01U +#define GPIO_14_SCITXDB 0x00061C02U +#define GPIO_14_MCLKXB 0x00061C03U +#define GPIO_14_OUTPUTXBAR3 0x00061C06U +#define GPIO_14_UPP_D6 0x00061C0FU + +#define GPIO_15_GPIO15 0x00061E00U +#define GPIO_15_EPWM8B 0x00061E01U +#define GPIO_15_SCIRXDB 0x00061E02U +#define GPIO_15_MFSXB 0x00061E03U +#define GPIO_15_OUTPUTXBAR4 0x00061E06U +#define GPIO_15_UPP_D5 0x00061E0FU + +#define GPIO_16_GPIO16 0x00080000U +#define GPIO_16_SPISIMOA 0x00080001U +#define GPIO_16_CANTXB 0x00080002U +#define GPIO_16_OUTPUTXBAR7 0x00080003U +#define GPIO_16_EPWM9A 0x00080005U +#define GPIO_16_SD1_D1 0x00080007U +#define GPIO_16_UPP_D4 0x0008000FU + +#define GPIO_17_GPIO17 0x00080200U +#define GPIO_17_SPISOMIA 0x00080201U +#define GPIO_17_CANRXB 0x00080202U +#define GPIO_17_OUTPUTXBAR8 0x00080203U +#define GPIO_17_EPWM9B 0x00080205U +#define GPIO_17_SD1_C1 0x00080207U +#define GPIO_17_UPP_D3 0x0008020FU + +#define GPIO_18_GPIO18 0x00080400U +#define GPIO_18_SPICLKA 0x00080401U +#define GPIO_18_SCITXDB 0x00080402U +#define GPIO_18_CANRXA 0x00080403U +#define GPIO_18_EPWM10A 0x00080405U +#define GPIO_18_SD1_D2 0x00080407U +#define GPIO_18_UPP_D2 0x0008040FU + +#define GPIO_19_GPIO19 0x00080600U +#define GPIO_19_SPISTEA 0x00080601U +#define GPIO_19_SCIRXDB 0x00080602U +#define GPIO_19_CANTXA 0x00080603U +#define GPIO_19_EPWM10B 0x00080605U +#define GPIO_19_SD1_C2 0x00080607U +#define GPIO_19_UPP_D1 0x0008060FU + +#define GPIO_20_GPIO20 0x00080800U +#define GPIO_20_EQEP1A 0x00080801U +#define GPIO_20_MDXA 0x00080802U +#define GPIO_20_CANTXB 0x00080803U +#define GPIO_20_EPWM11A 0x00080805U +#define GPIO_20_SD1_D3 0x00080807U +#define GPIO_20_UPP_D0 0x0008080FU + +#define GPIO_21_GPIO21 0x00080A00U +#define GPIO_21_EQEP1B 0x00080A01U +#define GPIO_21_MDRA 0x00080A02U +#define GPIO_21_CANRXB 0x00080A03U +#define GPIO_21_EPWM11B 0x00080A05U +#define GPIO_21_SD1_C3 0x00080A07U +#define GPIO_21_UPP_CLK 0x00080A0FU + +#define GPIO_22_GPIO22 0x00080C00U +#define GPIO_22_EQEP1S 0x00080C01U +#define GPIO_22_MCLKXA 0x00080C02U +#define GPIO_22_SCITXDB 0x00080C03U +#define GPIO_22_EPWM12A 0x00080C05U +#define GPIO_22_SPICLKB 0x00080C06U +#define GPIO_22_SD1_D4 0x00080C07U + +#define GPIO_23_GPIO23 0x00080E00U +#define GPIO_23_EQEP1I 0x00080E01U +#define GPIO_23_MFSXA 0x00080E02U +#define GPIO_23_SCIRXDB 0x00080E03U +#define GPIO_23_EPWM12B 0x00080E05U +#define GPIO_23_SPISTEB 0x00080E06U +#define GPIO_23_SD1_C4 0x00080E07U + +#define GPIO_24_GPIO24 0x00081000U +#define GPIO_24_OUTPUTXBAR1 0x00081001U +#define GPIO_24_EQEP2A 0x00081002U +#define GPIO_24_MDXB 0x00081003U +#define GPIO_24_SPISIMOB 0x00081006U +#define GPIO_24_SD2_D1 0x00081007U + +#define GPIO_25_GPIO25 0x00081200U +#define GPIO_25_OUTPUTXBAR2 0x00081201U +#define GPIO_25_EQEP2B 0x00081202U +#define GPIO_25_MDRB 0x00081203U +#define GPIO_25_SPISOMIB 0x00081206U +#define GPIO_25_SD2_C1 0x00081207U + +#define GPIO_26_GPIO26 0x00081400U +#define GPIO_26_OUTPUTXBAR3 0x00081401U +#define GPIO_26_EQEP2I 0x00081402U +#define GPIO_26_MCLKXB 0x00081403U +#define GPIO_26_SPICLKB 0x00081406U +#define GPIO_26_SD2_D2 0x00081407U + +#define GPIO_27_GPIO27 0x00081600U +#define GPIO_27_OUTPUTXBAR4 0x00081601U +#define GPIO_27_EQEP2S 0x00081602U +#define GPIO_27_MFSXB 0x00081603U +#define GPIO_27_SPISTEB 0x00081606U +#define GPIO_27_SD2_C2 0x00081607U + +#define GPIO_28_GPIO28 0x00081800U +#define GPIO_28_SCIRXDA 0x00081801U +#define GPIO_28_EM1CS4N 0x00081802U +#define GPIO_28_OUTPUTXBAR5 0x00081805U +#define GPIO_28_EQEP3A 0x00081806U +#define GPIO_28_SD2_D3 0x00081807U + +#define GPIO_29_GPIO29 0x00081A00U +#define GPIO_29_SCITXDA 0x00081A01U +#define GPIO_29_EM1SDCKE 0x00081A02U +#define GPIO_29_OUTPUTXBAR6 0x00081A05U +#define GPIO_29_EQEP3B 0x00081A06U +#define GPIO_29_SD2_C3 0x00081A07U + +#define GPIO_30_GPIO30 0x00081C00U +#define GPIO_30_CANRXA 0x00081C01U +#define GPIO_30_EM1CLK 0x00081C02U +#define GPIO_30_OUTPUTXBAR7 0x00081C05U +#define GPIO_30_EQEP3S 0x00081C06U +#define GPIO_30_SD2_D4 0x00081C07U + +#define GPIO_31_GPIO31 0x00081E00U +#define GPIO_31_CANTXA 0x00081E01U +#define GPIO_31_EM1WEN 0x00081E02U +#define GPIO_31_OUTPUTXBAR8 0x00081E05U +#define GPIO_31_EQEP3I 0x00081E06U +#define GPIO_31_SD2_C4 0x00081E07U + +#define GPIO_32_GPIO32 0x00460000U +#define GPIO_32_SDAA 0x00460001U +#define GPIO_32_EM1CS0N 0x00460002U + +#define GPIO_33_GPIO33 0x00460200U +#define GPIO_33_SCLA 0x00460201U +#define GPIO_33_EM1RNW 0x00460202U + +#define GPIO_34_GPIO34 0x00460400U +#define GPIO_34_OUTPUTXBAR1 0x00460401U +#define GPIO_34_EM1CS2N 0x00460402U +#define GPIO_34_SDAB 0x00460406U +#define GPIO_34_OFSD_2_N 0x0046040FU + +#define GPIO_35_GPIO35 0x00460600U +#define GPIO_35_SCIRXDA 0x00460601U +#define GPIO_35_EM1CS3N 0x00460602U +#define GPIO_35_SCLB 0x00460606U +#define GPIO_35_IID 0x0046060FU + +#define GPIO_36_GPIO36 0x00460800U +#define GPIO_36_SCITXDA 0x00460801U +#define GPIO_36_EM1WAIT 0x00460802U +#define GPIO_36_CANRXA 0x00460806U +#define GPIO_36_ISESSEND 0x0046080FU + +#define GPIO_37_GPIO37 0x00460A00U +#define GPIO_37_OUTPUTXBAR2 0x00460A01U +#define GPIO_37_EM1OEN 0x00460A02U +#define GPIO_37_CANTXA 0x00460A06U +#define GPIO_37_IAVALID 0x00460A0FU + +#define GPIO_38_GPIO38 0x00460C00U +#define GPIO_38_EM1A0 0x00460C02U +#define GPIO_38_SCITXDC 0x00460C05U +#define GPIO_38_CANTXB 0x00460C06U + +#define GPIO_39_GPIO39 0x00460E00U +#define GPIO_39_EM1A1 0x00460E02U +#define GPIO_39_SCIRXDC 0x00460E05U +#define GPIO_39_CANRXB 0x00460E06U + +#define GPIO_40_GPIO40 0x00461000U +#define GPIO_40_EM1A2 0x00461002U +#define GPIO_40_SDAB 0x00461006U + +#define GPIO_41_GPIO41 0x00461200U +#define GPIO_41_EM1A3 0x00461202U +#define GPIO_41_EMU1 0x00461203U +#define GPIO_41_SCLB 0x00461206U + +#define GPIO_42_GPIO42 0x00461400U +#define GPIO_42_SDAA 0x00461406U +#define GPIO_42_SCITXDA 0x0046140FU + +#define GPIO_43_GPIO43 0x00461600U +#define GPIO_43_SCLA 0x00461606U +#define GPIO_43_SCIRXDA 0x0046160FU + +#define GPIO_44_GPIO44 0x00461800U +#define GPIO_44_EM1A4 0x00461802U +#define GPIO_44_IXRCV 0x0046180FU + +#define GPIO_45_GPIO45 0x00461A00U +#define GPIO_45_EM1A5 0x00461A02U +#define GPIO_45_IDM 0x00461A0FU + +#define GPIO_46_GPIO46 0x00461C00U +#define GPIO_46_EM1A6 0x00461C02U +#define GPIO_46_SCIRXDD 0x00461C06U +#define GPIO_46_IDP 0x00461C0FU + +#define GPIO_47_GPIO47 0x00461E00U +#define GPIO_47_EM1A7 0x00461E02U +#define GPIO_47_SCITXDD 0x00461E06U +#define GPIO_47_OFSD_1_N 0x00461E0FU + +#define GPIO_48_GPIO48 0x00480000U +#define GPIO_48_OUTPUTXBAR3 0x00480001U +#define GPIO_48_EM1A8 0x00480002U +#define GPIO_48_SCITXDA 0x00480006U +#define GPIO_48_SD1_D1 0x00480007U + +#define GPIO_49_GPIO49 0x00480200U +#define GPIO_49_OUTPUTXBAR4 0x00480201U +#define GPIO_49_EM1A9 0x00480202U +#define GPIO_49_SCIRXDA 0x00480206U +#define GPIO_49_SD1_C1 0x00480207U + +#define GPIO_50_GPIO50 0x00480400U +#define GPIO_50_EQEP1A 0x00480401U +#define GPIO_50_EM1A10 0x00480402U +#define GPIO_50_SPISIMOC 0x00480406U +#define GPIO_50_SD1_D2 0x00480407U + +#define GPIO_51_GPIO51 0x00480600U +#define GPIO_51_EQEP1B 0x00480601U +#define GPIO_51_EM1A11 0x00480602U +#define GPIO_51_SPISOMIC 0x00480606U +#define GPIO_51_SD1_C2 0x00480607U + +#define GPIO_52_GPIO52 0x00480800U +#define GPIO_52_EQEP1S 0x00480801U +#define GPIO_52_EM1A12 0x00480802U +#define GPIO_52_SPICLKC 0x00480806U +#define GPIO_52_SD1_D3 0x00480807U + +#define GPIO_53_GPIO53 0x00480A00U +#define GPIO_53_EQEP1I 0x00480A01U +#define GPIO_53_EM1D31 0x00480A02U +#define GPIO_53_EM2D15 0x00480A03U +#define GPIO_53_SPISTEC 0x00480A06U +#define GPIO_53_SD1_C3 0x00480A07U + +#define GPIO_54_GPIO54 0x00480C00U +#define GPIO_54_SPISIMOA 0x00480C01U +#define GPIO_54_EM1D30 0x00480C02U +#define GPIO_54_EM2D14 0x00480C03U +#define GPIO_54_EQEP2A 0x00480C05U +#define GPIO_54_SCITXDB 0x00480C06U +#define GPIO_54_SD1_D4 0x00480C07U + +#define GPIO_55_GPIO55 0x00480E00U +#define GPIO_55_SPISOMIA 0x00480E01U +#define GPIO_55_EM1D29 0x00480E02U +#define GPIO_55_EM2D13 0x00480E03U +#define GPIO_55_EQEP2B 0x00480E05U +#define GPIO_55_SCIRXDB 0x00480E06U +#define GPIO_55_SD1_C4 0x00480E07U + +#define GPIO_56_GPIO56 0x00481000U +#define GPIO_56_SPICLKA 0x00481001U +#define GPIO_56_EM1D28 0x00481002U +#define GPIO_56_EM2D12 0x00481003U +#define GPIO_56_EQEP2S 0x00481005U +#define GPIO_56_SCITXDC 0x00481006U +#define GPIO_56_SD2_D1 0x00481007U + +#define GPIO_57_GPIO57 0x00481200U +#define GPIO_57_SPISTEA 0x00481201U +#define GPIO_57_EM1D27 0x00481202U +#define GPIO_57_EM2D11 0x00481203U +#define GPIO_57_EQEP2I 0x00481205U +#define GPIO_57_SCIRXDC 0x00481206U +#define GPIO_57_SD2_C1 0x00481207U + +#define GPIO_58_GPIO58 0x00481400U +#define GPIO_58_MCLKRA 0x00481401U +#define GPIO_58_EM1D26 0x00481402U +#define GPIO_58_EM2D10 0x00481403U +#define GPIO_58_OUTPUTXBAR1 0x00481405U +#define GPIO_58_SPICLKB 0x00481406U +#define GPIO_58_SD2_D2 0x00481407U +#define GPIO_58_SPISIMOA 0x0048140FU + +#define GPIO_59_GPIO59 0x00481600U +#define GPIO_59_MFSRA 0x00481601U +#define GPIO_59_EM1D25 0x00481602U +#define GPIO_59_EM2D9 0x00481603U +#define GPIO_59_OUTPUTXBAR2 0x00481605U +#define GPIO_59_SPISTEB 0x00481606U +#define GPIO_59_SD2_C2 0x00481607U +#define GPIO_59_SPISOMIA 0x0048160FU + +#define GPIO_60_GPIO60 0x00481800U +#define GPIO_60_MCLKRB 0x00481801U +#define GPIO_60_EM1D24 0x00481802U +#define GPIO_60_EM2D8 0x00481803U +#define GPIO_60_OUTPUTXBAR3 0x00481805U +#define GPIO_60_SPISIMOB 0x00481806U +#define GPIO_60_SD2_D3 0x00481807U +#define GPIO_60_SPICLKA 0x0048180FU + +#define GPIO_61_GPIO61 0x00481A00U +#define GPIO_61_MFSRB 0x00481A01U +#define GPIO_61_EM1D23 0x00481A02U +#define GPIO_61_EM2D7 0x00481A03U +#define GPIO_61_OUTPUTXBAR4 0x00481A05U +#define GPIO_61_SPISOMIB 0x00481A06U +#define GPIO_61_SD2_C3 0x00481A07U +#define GPIO_61_SPISTEA 0x00481A0FU + +#define GPIO_62_GPIO62 0x00481C00U +#define GPIO_62_SCIRXDC 0x00481C01U +#define GPIO_62_EM1D22 0x00481C02U +#define GPIO_62_EM2D6 0x00481C03U +#define GPIO_62_EQEP3A 0x00481C05U +#define GPIO_62_CANRXA 0x00481C06U +#define GPIO_62_SD2_D4 0x00481C07U + +#define GPIO_63_GPIO63 0x00481E00U +#define GPIO_63_SCITXDC 0x00481E01U +#define GPIO_63_EM1D21 0x00481E02U +#define GPIO_63_EM2D5 0x00481E03U +#define GPIO_63_EQEP3B 0x00481E05U +#define GPIO_63_CANTXA 0x00481E06U +#define GPIO_63_SD2_C4 0x00481E07U +#define GPIO_63_SPISIMOB 0x00481E0FU + +#define GPIO_64_GPIO64 0x00860000U +#define GPIO_64_EM1D20 0x00860002U +#define GPIO_64_EM2D4 0x00860003U +#define GPIO_64_EQEP3S 0x00860005U +#define GPIO_64_SCIRXDA 0x00860006U +#define GPIO_64_SPISOMIB 0x0086000FU + +#define GPIO_65_GPIO65 0x00860200U +#define GPIO_65_EM1D19 0x00860202U +#define GPIO_65_EM2D3 0x00860203U +#define GPIO_65_EQEP3I 0x00860205U +#define GPIO_65_SCITXDA 0x00860206U +#define GPIO_65_SPICLKB 0x0086020FU + +#define GPIO_66_GPIO66 0x00860400U +#define GPIO_66_EM1D18 0x00860402U +#define GPIO_66_EM2D2 0x00860403U +#define GPIO_66_SDAB 0x00860406U +#define GPIO_66_SPISTEB 0x0086040FU + +#define GPIO_67_GPIO67 0x00860600U +#define GPIO_67_EM1D17 0x00860602U +#define GPIO_67_EM2D1 0x00860603U + +#define GPIO_68_GPIO68 0x00860800U +#define GPIO_68_EM1D16 0x00860802U +#define GPIO_68_EM2D0 0x00860803U + +#define GPIO_69_GPIO69 0x00860A00U +#define GPIO_69_EM1D15 0x00860A02U +#define GPIO_69_EMU0 0x00860A03U +#define GPIO_69_SCLB 0x00860A06U +#define GPIO_69_SPISIMOC 0x00860A0FU + +#define GPIO_70_GPIO70 0x00860C00U +#define GPIO_70_EM1D14 0x00860C02U +#define GPIO_70_EMU0 0x00860C03U +#define GPIO_70_CANRXA 0x00860C05U +#define GPIO_70_SCITXDB 0x00860C06U +#define GPIO_70_SPISOMIC 0x00860C0FU + +#define GPIO_71_GPIO71 0x00860E00U +#define GPIO_71_EM1D13 0x00860E02U +#define GPIO_71_EMU1 0x00860E03U +#define GPIO_71_CANTXA 0x00860E05U +#define GPIO_71_SCIRXDB 0x00860E06U +#define GPIO_71_SPICLKC 0x00860E0FU + +#define GPIO_72_GPIO72 0x00861000U +#define GPIO_72_EM1D12 0x00861002U +#define GPIO_72_CANTXB 0x00861005U +#define GPIO_72_SCITXDC 0x00861006U +#define GPIO_72_SPISTEC 0x0086100FU + +#define GPIO_73_GPIO73 0x00861200U +#define GPIO_73_EM1D11 0x00861202U +#define GPIO_73_XCLKOUT 0x00861203U +#define GPIO_73_CANRXB 0x00861205U +#define GPIO_73_SCIRXDC 0x00861206U + +#define GPIO_74_GPIO74 0x00861400U +#define GPIO_74_EM1D10 0x00861402U + +#define GPIO_75_GPIO75 0x00861600U +#define GPIO_75_EM1D9 0x00861602U + +#define GPIO_76_GPIO76 0x00861800U +#define GPIO_76_EM1D8 0x00861802U +#define GPIO_76_SCITXDD 0x00861806U + +#define GPIO_77_GPIO77 0x00861A00U +#define GPIO_77_EM1D7 0x00861A02U +#define GPIO_77_SCIRXDD 0x00861A06U + +#define GPIO_78_GPIO78 0x00861C00U +#define GPIO_78_EM1D6 0x00861C02U +#define GPIO_78_EQEP2A 0x00861C06U + +#define GPIO_79_GPIO79 0x00861E00U +#define GPIO_79_EM1D5 0x00861E02U +#define GPIO_79_EQEP2B 0x00861E06U + +#define GPIO_80_GPIO80 0x00880000U +#define GPIO_80_EM1D4 0x00880002U +#define GPIO_80_EQEP2S 0x00880006U + +#define GPIO_81_GPIO81 0x00880200U +#define GPIO_81_EM1D3 0x00880202U +#define GPIO_81_EQEP2I 0x00880206U + +#define GPIO_82_GPIO82 0x00880400U +#define GPIO_82_EM1D2 0x00880402U + +#define GPIO_83_GPIO83 0x00880600U +#define GPIO_83_EM1D1 0x00880602U + +#define GPIO_84_GPIO84 0x00880800U +#define GPIO_84_SCITXDA 0x00880805U +#define GPIO_84_MDXB 0x00880806U +#define GPIO_84_MDXA 0x0088080FU + +#define GPIO_85_GPIO85 0x00880A00U +#define GPIO_85_EM1D0 0x00880A02U +#define GPIO_85_SCIRXDA 0x00880A05U +#define GPIO_85_MDRB 0x00880A06U +#define GPIO_85_MDRA 0x00880A0FU + +#define GPIO_86_GPIO86 0x00880C00U +#define GPIO_86_EM1A13 0x00880C02U +#define GPIO_86_EM1CAS 0x00880C03U +#define GPIO_86_SCITXDB 0x00880C05U +#define GPIO_86_MCLKXB 0x00880C06U +#define GPIO_86_MCLKXA 0x00880C0FU + +#define GPIO_87_GPIO87 0x00880E00U +#define GPIO_87_EM1A14 0x00880E02U +#define GPIO_87_EM1RAS 0x00880E03U +#define GPIO_87_SCIRXDB 0x00880E05U +#define GPIO_87_MFSXB 0x00880E06U +#define GPIO_87_MFSXA 0x00880E0FU + +#define GPIO_88_GPIO88 0x00881000U +#define GPIO_88_EM1A15 0x00881002U +#define GPIO_88_EM1DQM0 0x00881003U + +#define GPIO_89_GPIO89 0x00881200U +#define GPIO_89_EM1A16 0x00881202U +#define GPIO_89_EM1DQM1 0x00881203U +#define GPIO_89_SCITXDC 0x00881206U + +#define GPIO_90_GPIO90 0x00881400U +#define GPIO_90_EM1A17 0x00881402U +#define GPIO_90_EM1DQM2 0x00881403U +#define GPIO_90_SCIRXDC 0x00881406U + +#define GPIO_91_GPIO91 0x00881600U +#define GPIO_91_EM1A18 0x00881602U +#define GPIO_91_EM1DQM3 0x00881603U +#define GPIO_91_SDAA 0x00881606U + +#define GPIO_92_GPIO92 0x00881800U +#define GPIO_92_EM1A19 0x00881802U +#define GPIO_92_EM1BA1 0x00881803U +#define GPIO_92_SCLA 0x00881806U + +#define GPIO_93_GPIO93 0x00881A00U +#define GPIO_93_EM1A20 0x00881A02U +#define GPIO_93_EM1BA0 0x00881A03U +#define GPIO_93_SCITXDD 0x00881A06U + +#define GPIO_94_GPIO94 0x00881C00U +#define GPIO_94_EM1A21 0x00881C02U +#define GPIO_94_SCIRXDD 0x00881C06U + +#define GPIO_95_GPIO95 0x00881E00U + +#define GPIO_96_GPIO96 0x00C60000U +#define GPIO_96_EM2DQM1 0x00C60003U +#define GPIO_96_EQEP1A 0x00C60005U + +#define GPIO_97_GPIO97 0x00C60200U +#define GPIO_97_EM2DQM0 0x00C60203U +#define GPIO_97_EQEP1B 0x00C60205U + +#define GPIO_98_GPIO98 0x00C60400U +#define GPIO_98_EM2A0 0x00C60403U +#define GPIO_98_EQEP1S 0x00C60405U + +#define GPIO_99_GPIO99 0x00C60600U +#define GPIO_99_EM2A1 0x00C60603U +#define GPIO_99_EQEP1I 0x00C60605U + +#define GPIO_100_GPIO100 0x00C60800U +#define GPIO_100_EM2A2 0x00C60803U +#define GPIO_100_EQEP2A 0x00C60805U +#define GPIO_100_SPISIMOC 0x00C60806U + +#define GPIO_101_GPIO101 0x00C60A00U +#define GPIO_101_EM2A3 0x00C60A03U +#define GPIO_101_EQEP2B 0x00C60A05U +#define GPIO_101_SPISOMIC 0x00C60A06U + +#define GPIO_102_GPIO102 0x00C60C00U +#define GPIO_102_EM2A4 0x00C60C03U +#define GPIO_102_EQEP2S 0x00C60C05U +#define GPIO_102_SPICLKC 0x00C60C06U + +#define GPIO_103_GPIO103 0x00C60E00U +#define GPIO_103_EM2A5 0x00C60E03U +#define GPIO_103_EQEP2I 0x00C60E05U +#define GPIO_103_SPISTEC 0x00C60E06U + +#define GPIO_104_GPIO104 0x00C61000U +#define GPIO_104_SDAA 0x00C61001U +#define GPIO_104_EM2A6 0x00C61003U +#define GPIO_104_EQEP3A 0x00C61005U +#define GPIO_104_SCITXDD 0x00C61006U + +#define GPIO_105_GPIO105 0x00C61200U +#define GPIO_105_SCLA 0x00C61201U +#define GPIO_105_EM2A7 0x00C61203U +#define GPIO_105_EQEP3B 0x00C61205U +#define GPIO_105_SCIRXDD 0x00C61206U + +#define GPIO_106_GPIO106 0x00C61400U +#define GPIO_106_EM2A8 0x00C61403U +#define GPIO_106_EQEP3S 0x00C61405U +#define GPIO_106_SCITXDC 0x00C61406U + +#define GPIO_107_GPIO107 0x00C61600U +#define GPIO_107_EM2A9 0x00C61603U +#define GPIO_107_EQEP3I 0x00C61605U +#define GPIO_107_SCIRXDC 0x00C61606U + +#define GPIO_108_GPIO108 0x00C61800U +#define GPIO_108_EM2A10 0x00C61803U + +#define GPIO_109_GPIO109 0x00C61A00U +#define GPIO_109_EM2A11 0x00C61A03U + +#define GPIO_110_GPIO110 0x00C61C00U +#define GPIO_110_EM2WAIT 0x00C61C03U + +#define GPIO_111_GPIO111 0x00C61E00U +#define GPIO_111_EM2BA0 0x00C61E03U + +#define GPIO_112_GPIO112 0x00C80000U +#define GPIO_112_EM2BA1 0x00C80003U + +#define GPIO_113_GPIO113 0x00C80200U +#define GPIO_113_EM2CAS 0x00C80203U + +#define GPIO_114_GPIO114 0x00C80400U +#define GPIO_114_EM2RAS 0x00C80403U + +#define GPIO_115_GPIO115 0x00C80600U +#define GPIO_115_EM2CS0N 0x00C80603U + +#define GPIO_116_GPIO116 0x00C80800U +#define GPIO_116_EM2CS2N 0x00C80803U + +#define GPIO_117_GPIO117 0x00C80A00U +#define GPIO_117_EM2SDCKE 0x00C80A03U + +#define GPIO_118_GPIO118 0x00C80C00U +#define GPIO_118_EM2CLK 0x00C80C03U + +#define GPIO_119_GPIO119 0x00C80E00U +#define GPIO_119_EM2RNW 0x00C80E03U + +#define GPIO_120_GPIO120 0x00C81000U +#define GPIO_120_EM2WEN 0x00C81003U +#define GPIO_120_USB0PFLT 0x00C8100FU + +#define GPIO_121_GPIO121 0x00C81200U +#define GPIO_121_EM2OEN 0x00C81203U +#define GPIO_121_USB0EPEN 0x00C8120FU + +#define GPIO_122_GPIO122 0x00C81400U +#define GPIO_122_SPISIMOC 0x00C81406U +#define GPIO_122_SD1_D1 0x00C81407U +#define GPIO_122_ODISCHRGVBUS 0x00C8140FU + +#define GPIO_123_GPIO123 0x00C81600U +#define GPIO_123_SPISOMIC 0x00C81606U +#define GPIO_123_SD1_C1 0x00C81607U +#define GPIO_123_OCHRGVBUS 0x00C8160FU + +#define GPIO_124_GPIO124 0x00C81800U +#define GPIO_124_SPICLKC 0x00C81806U +#define GPIO_124_SD1_D2 0x00C81807U +#define GPIO_124_ODMPULLDN 0x00C8180FU + +#define GPIO_125_GPIO125 0x00C81A00U +#define GPIO_125_SPISTEC 0x00C81A06U +#define GPIO_125_SD1_C2 0x00C81A07U +#define GPIO_125_ODPPULLDN 0x00C81A0FU + +#define GPIO_126_GPIO126 0x00C81C00U +#define GPIO_126_SD1_D3 0x00C81C07U +#define GPIO_126_OLSD_2_N 0x00C81C0FU + +#define GPIO_127_GPIO127 0x00C81E00U +#define GPIO_127_SD1_C3 0x00C81E07U +#define GPIO_127_OLSD_1_N 0x00C81E0FU + +#define GPIO_128_GPIO128 0x01060000U +#define GPIO_128_SD1_D4 0x01060007U +#define GPIO_128_OIDPULLUP 0x0106000FU + +#define GPIO_129_GPIO129 0x01060200U +#define GPIO_129_SD1_C4 0x01060207U +#define GPIO_129_OSPEED 0x0106020FU + +#define GPIO_130_GPIO130 0x01060400U +#define GPIO_130_SD2_D1 0x01060407U +#define GPIO_130_OSUSPEND 0x0106040FU + +#define GPIO_131_GPIO131 0x01060600U +#define GPIO_131_SD2_C1 0x01060607U +#define GPIO_131_OOE 0x0106060FU + +#define GPIO_132_GPIO132 0x01060800U +#define GPIO_132_SD2_D2 0x01060807U +#define GPIO_132_ODMSE1 0x0106080FU + +#define GPIO_133_GPIO133 0x01060A00U +#define GPIO_133_SD2_C2 0x01060A07U +#define GPIO_133_ODPDAT 0x01060A0FU + +#define GPIO_134_GPIO134 0x01060C00U +#define GPIO_134_SD2_D3 0x01060C07U +#define GPIO_134_IVBUSVALID 0x01060C0FU + +#define GPIO_135_GPIO135 0x01060E00U +#define GPIO_135_SCITXDA 0x01060E06U +#define GPIO_135_SD2_C3 0x01060E07U + +#define GPIO_136_GPIO136 0x01061000U +#define GPIO_136_SCIRXDA 0x01061006U +#define GPIO_136_SD2_D4 0x01061007U + +#define GPIO_137_GPIO137 0x01061200U +#define GPIO_137_SCITXDB 0x01061206U +#define GPIO_137_SD2_C4 0x01061207U + +#define GPIO_138_GPIO138 0x01061400U +#define GPIO_138_SCIRXDB 0x01061406U + +#define GPIO_139_GPIO139 0x01061600U +#define GPIO_139_SCIRXDC 0x01061606U + +#define GPIO_140_GPIO140 0x01061800U +#define GPIO_140_SCITXDC 0x01061806U + +#define GPIO_141_GPIO141 0x01061A00U +#define GPIO_141_SCIRXDD 0x01061A06U + +#define GPIO_142_GPIO142 0x01061C00U +#define GPIO_142_SCITXDD 0x01061C06U + +#define GPIO_143_GPIO143 0x01061E00U + +#define GPIO_144_GPIO144 0x01080000U + +#define GPIO_145_GPIO145 0x01080200U +#define GPIO_145_EPWM1A 0x01080201U + +#define GPIO_146_GPIO146 0x01080400U +#define GPIO_146_EPWM1B 0x01080401U + +#define GPIO_147_GPIO147 0x01080600U +#define GPIO_147_EPWM2A 0x01080601U + +#define GPIO_148_GPIO148 0x01080800U +#define GPIO_148_EPWM2B 0x01080801U + +#define GPIO_149_GPIO149 0x01080A00U +#define GPIO_149_EPWM3A 0x01080A01U + +#define GPIO_150_GPIO150 0x01080C00U +#define GPIO_150_EPWM3B 0x01080C01U + +#define GPIO_151_GPIO151 0x01080E00U +#define GPIO_151_EPWM4A 0x01080E01U + +#define GPIO_152_GPIO152 0x01081000U +#define GPIO_152_EPWM4B 0x01081001U + +#define GPIO_153_GPIO153 0x01081200U +#define GPIO_153_EPWM5A 0x01081201U + +#define GPIO_154_GPIO154 0x01081400U +#define GPIO_154_EPWM5B 0x01081401U + +#define GPIO_155_GPIO155 0x01081600U +#define GPIO_155_EPWM6A 0x01081601U + +#define GPIO_156_GPIO156 0x01081800U +#define GPIO_156_EPWM6B 0x01081801U + +#define GPIO_157_GPIO157 0x01081A00U +#define GPIO_157_EPWM7A 0x01081A01U + +#define GPIO_158_GPIO158 0x01081C00U +#define GPIO_158_EPWM7B 0x01081C01U + +#define GPIO_159_GPIO159 0x01081E00U +#define GPIO_159_EPWM8A 0x01081E01U + +#define GPIO_160_GPIO160 0x01460000U +#define GPIO_160_EPWM8B 0x01460001U + +#define GPIO_161_GPIO161 0x01460200U +#define GPIO_161_EPWM9A 0x01460201U + +#define GPIO_162_GPIO162 0x01460400U +#define GPIO_162_EPWM9B 0x01460401U + +#define GPIO_163_GPIO163 0x01460600U +#define GPIO_163_EPWM10A 0x01460601U + +#define GPIO_164_GPIO164 0x01460800U +#define GPIO_164_EPWM10B 0x01460801U + +#define GPIO_165_GPIO165 0x01460A00U +#define GPIO_165_EPWM11A 0x01460A01U + +#define GPIO_166_GPIO166 0x01460C00U +#define GPIO_166_EPWM11B 0x01460C01U + +#define GPIO_167_GPIO167 0x01460E00U +#define GPIO_167_EPWM12A 0x01460E01U + +#define GPIO_168_GPIO168 0x01461000U +#define GPIO_168_EPWM12B 0x01461001U + +#endif // PIN_MAP_H diff --git a/gpio_bitfield_cpu2/device/driverlib/pin_map_legacy.h b/gpio_bitfield_cpu2/device/driverlib/pin_map_legacy.h new file mode 100644 index 0000000..c503ad4 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/pin_map_legacy.h @@ -0,0 +1,95 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Legacy definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef __PIN_MAP_LEGACY_H__ +#define __PIN_MAP_LEGACY_H__ + + +#include "pin_map.h" + +//***************************************************************************** +// Legacy pinmuxing MACROS - Retained for portability across devices ONLY +// Not recommended for new users +//***************************************************************************** +#define GPIO_16_SD_D1 GPIO_16_SD1_D1 + +#define GPIO_17_SD_C1 GPIO_17_SD1_C1 + +#define GPIO_18_SD_D2 GPIO_18_SD1_D2 + +#define GPIO_19_SD_C2 GPIO_19_SD1_C2 + +#define GPIO_20_SD_D3 GPIO_20_SD1_D3 + +#define GPIO_21_SD_C3 GPIO_21_SD1_C3 + +#define GPIO_22_SD_D4 GPIO_22_SD1_D4 + +#define GPIO_23_SD_C4 GPIO_23_SD1_C4 + +#define GPIO_24_SD_D5 GPIO_24_SD2_D1 + +#define GPIO_25_SD_C5 GPIO_25_SD2_C1 + +#define GPIO_26_SD_D6 GPIO_26_SD2_D2 + +#define GPIO_27_SD_C6 GPIO_27_SD2_C2 + +#define GPIO_28_SD_D7 GPIO_28_SD2_D3 + +#define GPIO_29_SD_C7 GPIO_29_SD2_C3 + +#define GPIO_30_SD_D8 GPIO_30_SD2_D4 + +#define GPIO_31_SD_C8 GPIO_31_SD2_C4 + +#define GPIO_36_EM1WAIT1 GPIO_36_EM1WAIT + +#define GPIO_110_EM2WAIT1 GPIO_110_EM2WAIT + +#define GPIO_115_EM2CS0 GPIO_115_EM2CS0N + +#define GPIO_116_EM2CS2 GPIO_116_EM2CS2N + +#define GPIO_132_ODMSE0 GPIO_132_ODMSE1 + +#endif // __PIN_MAP_LEGACY_H__ diff --git a/gpio_bitfield_cpu2/device/driverlib/sci.c b/gpio_bitfield_cpu2/device/driverlib/sci.c new file mode 100644 index 0000000..dfd8e30 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sci.c @@ -0,0 +1,421 @@ +//########################################################################### +// +// FILE: sci.c +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "sci.h" + +//***************************************************************************** +// +// SCI_setConfig +// +//***************************************************************************** +void +SCI_setConfig(uint32_t base, uint32_t lspclkHz, uint32_t baud, uint32_t config) +{ + uint32_t divider; + + // + // Check the arguments. + // Is the required baud rate greater than the maximum rate supported? + // + ASSERT(SCI_isBaseValid(base)); + ASSERT(baud != 0U); + ASSERT((baud * 16U) <= lspclkHz); + + // + // Stop the SCI. + // + SCI_disableModule(base); + + // + // Compute the baud rate divider. + // + divider = ((lspclkHz / (baud * 8U)) - 1U); + + // + // Set the baud rate. + // + HWREGH(base + SCI_O_HBAUD) = (divider & 0xFF00U) >> 8U; + HWREGH(base + SCI_O_LBAUD) = divider & 0x00FFU; + + // + // Set parity, data length, and number of stop bits. + // + HWREGH(base + SCI_O_CCR) = ((HWREGH(base + SCI_O_CCR) & + ~(SCI_CONFIG_PAR_MASK | + SCI_CONFIG_STOP_MASK | + SCI_CONFIG_WLEN_MASK)) | config); + + // + // Start the SCI. + // + SCI_enableModule(base); +} + +//***************************************************************************** +// +// SCI_writeCharArray +// +//***************************************************************************** +void +SCI_writeCharArray(uint32_t base, const uint16_t * const array, + uint16_t length) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + uint16_t i; + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // FIFO is enabled. + // For loop to write (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until space is available in the transmit FIFO. + // + while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = array[i]; + } + } + else + { + // + // FIFO is not enabled. + // For loop to write (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until space is available in the transmit buffer. + // + while(!SCI_isSpaceAvailableNonFIFO(base)) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = array[i]; + } + } +} + +//***************************************************************************** +// +// SCI_readCharArray +// +//***************************************************************************** +void +SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + uint16_t i; + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // FIFO is enabled. + // For loop to read (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until a character is available in the receive FIFO. + // + while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0) + { + } + + // + // Return the character from the receive buffer. + // + array[i] = (uint16_t) + (HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M); + } + } + else + { + // + // FIFO is not enabled. + // For loop to read (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until a character is available in the receive buffer. + // + while(!SCI_isDataAvailableNonFIFO(base)) + { + } + + // + // Return the character from the receive buffer. + // + array[i] = (uint16_t) + (HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M); + } + } +} + +//***************************************************************************** +// +// SCI_enableInterrupt +// +//***************************************************************************** +void +SCI_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the specified interrupts. + // + if((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) + { + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_RXERRINTENA; + } + if((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) + { + HWREGH(base + SCI_O_CTL2) |= SCI_CTL2_RXBKINTENA; + } + if((intFlags & SCI_INT_TXRDY) == SCI_INT_TXRDY) + { + HWREGH(base + SCI_O_CTL2) |= SCI_CTL2_TXINTENA; + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFFIENA; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SCI_disableInterrupt +// +//***************************************************************************** +void +SCI_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the specified interrupts. + // + if((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) + { + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_RXERRINTENA; + } + if((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) + { + HWREGH(base + SCI_O_CTL2) &= ~SCI_CTL2_RXBKINTENA; + } + if((intFlags & SCI_INT_TXRDY) == SCI_INT_TXRDY) + { + HWREGH(base + SCI_O_CTL2) &= ~SCI_CTL2_TXINTENA; + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_TXFFIENA; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) &= ~SCI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SCI_getInterruptStatus +// +//***************************************************************************** +uint32_t +SCI_getInterruptStatus(uint32_t base) +{ + uint32_t interruptStatus = 0; + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the interrupt status. + // + if((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXRDY) == SCI_CTL2_TXRDY) + { + interruptStatus |= SCI_INT_TXRDY; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXERROR) == SCI_RXST_RXERROR) + { + interruptStatus |= SCI_INT_RXERR; + } + if(((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXRDY) == SCI_RXST_RXRDY) || + ((HWREGH(base + SCI_O_RXST) & SCI_RXST_BRKDT) == SCI_RXST_BRKDT)) + { + interruptStatus |= SCI_INT_RXRDY_BRKDT; + } + if((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFINT) == SCI_FFTX_TXFFINT) + { + interruptStatus |= SCI_INT_TXFF; + } + if((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFINT) == SCI_FFRX_RXFFINT) + { + interruptStatus |= SCI_INT_RXFF; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_FE) == SCI_RXST_FE) + { + interruptStatus |= SCI_INT_FE; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_OE) == SCI_RXST_OE) + { + interruptStatus |= SCI_INT_OE; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_PE) == SCI_RXST_PE) + { + interruptStatus |= SCI_INT_PE; + } + + return(interruptStatus); +} + +//***************************************************************************** +// +// SCI_clearInterruptStatus +// +//***************************************************************************** +void +SCI_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + if(((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) || + ((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) || + ((intFlags & SCI_INT_FE) == SCI_INT_FE) || + ((intFlags & SCI_INT_OE) == SCI_INT_OE) || + ((intFlags & SCI_INT_PE) == SCI_INT_PE)) + { + SCI_performSoftwareReset(base); + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFFINTCLR; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFINTCLR; + } +} + +//***************************************************************************** +// +// SCI_setBaud +// +//***************************************************************************** +void SCI_setBaud(uint32_t base, uint32_t lspclkHz, uint32_t baud) +{ + uint32_t divider; + + // + // Compute the baud rate divider {ROUND TO NEAREST INTEGER} + // + divider = ((float)((float)lspclkHz / ((float)baud * 8.0F)) - 1.0F) + 0.5F; + + // + // Set the baud rate. + // + HWREGH(base + SCI_O_HBAUD) = (divider & 0xFF00U) >> 8U; + HWREGH(base + SCI_O_LBAUD) = divider & 0x00FFU; +} + +//***************************************************************************** +// +// SCI_setWakeFlag +// +//***************************************************************************** +void SCI_setWakeFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the TX wake flag bit to indicate + // that the next frame is an address frame. + // + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_TXWAKE; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/sci.h b/gpio_bitfield_cpu2/device/driverlib/sci.h new file mode 100644 index 0000000..454ee12 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sci.h @@ -0,0 +1,1646 @@ +//########################################################################### +// +// FILE: sci.h +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SCI_H +#define SCI_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sci_api SCI +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_sci.h" +#include "inc/hw_types.h" +#include "debug.h" + +//***************************************************************************** +// +// Values that can be passed to SCI_enableInterrupt, SCI_disableInterrupt, and +// SCI_clearInterruptStatus as the intFlags parameter, and returned from +// SCI_getInterruptStatus. +// +//***************************************************************************** +#define SCI_INT_RXERR 0x01U //!< RXERR interrupt +#define SCI_INT_RXRDY_BRKDT 0x02U //!< RXRDY interrupt +#define SCI_INT_TXRDY 0x04U //!< TXRDY interrupt +#define SCI_INT_TXFF 0x08U //!< TX FIFO level interrupt +#define SCI_INT_RXFF 0x10U //!< RX FIFO level interrupt +#define SCI_INT_FE 0x20U //!< Frame Error +#define SCI_INT_OE 0x40U //!< Overrun Error +#define SCI_INT_PE 0x80U //!< Parity Error + +//***************************************************************************** +// +// Values that can be passed to SCI_setConfig as the config parameter +// and returned by SCI_getConfig in the config parameter. +// Additionally, the SCI_CONFIG_PAR_* enum subset can be passed to +// SCI_setParityMode as the parity parameter, and are returned by +// SCI_getParityMode. +// +//***************************************************************************** +#define SCI_CONFIG_WLEN_MASK 0x0007U //!< Mask for extracting word length +#define SCI_CONFIG_WLEN_8 0x0007U //!< 8 bit data +#define SCI_CONFIG_WLEN_7 0x0006U //!< 7 bit data +#define SCI_CONFIG_WLEN_6 0x0005U //!< 6 bit data +#define SCI_CONFIG_WLEN_5 0x0004U //!< 5 bit data +#define SCI_CONFIG_WLEN_4 0x0003U //!< 4 bit data +#define SCI_CONFIG_WLEN_3 0x0002U //!< 3 bit data +#define SCI_CONFIG_WLEN_2 0x0001U //!< 2 bit data +#define SCI_CONFIG_WLEN_1 0x0000U //!< 1 bit data +#define SCI_CONFIG_STOP_MASK 0x0080U //!< Mask for extracting stop bits +#define SCI_CONFIG_STOP_ONE 0x0000U //!< One stop bit +#define SCI_CONFIG_STOP_TWO 0x0080U //!< Two stop bits +#define SCI_CONFIG_PAR_MASK 0x0060U //!< Parity Mask + +//***************************************************************************** +// +//! Values that can be used with SCI_setParityMode() and SCI_getParityMode() to +//! describe the parity of the SCI communication. +// +//***************************************************************************** +typedef enum +{ + SCI_CONFIG_PAR_NONE = 0x0000U, //!< No parity + SCI_CONFIG_PAR_EVEN = 0x0060U, //!< Even parity + SCI_CONFIG_PAR_ODD = 0x0020U //!< Odd parity +} SCI_ParityType; + +//***************************************************************************** +// +//! Values that can be passed to SCI_setFIFOInterruptLevel() as the txLevel +//! parameter and returned by SCI_getFIFOInteruptLevel() and +//! SCI_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SCI_FIFO_TX0 = 0x0000U, //!< Transmit interrupt empty + SCI_FIFO_TX1 = 0x0001U, //!< Transmit interrupt 1/16 full + SCI_FIFO_TX2 = 0x0002U, //!< Transmit interrupt 2/16 full + SCI_FIFO_TX3 = 0x0003U, //!< Transmit interrupt 3/16 full + SCI_FIFO_TX4 = 0x0004U, //!< Transmit interrupt 4/16 full + SCI_FIFO_TX5 = 0x0005U, //!< Transmit interrupt 5/16 full + SCI_FIFO_TX6 = 0x0006U, //!< Transmit interrupt 6/16 full + SCI_FIFO_TX7 = 0x0007U, //!< Transmit interrupt 7/16 full + SCI_FIFO_TX8 = 0x0008U, //!< Transmit interrupt 8/16 full + SCI_FIFO_TX9 = 0x0009U, //!< Transmit interrupt 9/16 full + SCI_FIFO_TX10 = 0x000AU, //!< Transmit interrupt 10/16 full + SCI_FIFO_TX11 = 0x000BU, //!< Transmit interrupt 11/16 full + SCI_FIFO_TX12 = 0x000CU, //!< Transmit interrupt 12/16 full + SCI_FIFO_TX13 = 0x000DU, //!< Transmit interrupt 13/16 full + SCI_FIFO_TX14 = 0x000EU, //!< Transmit interrupt 14/16 full + SCI_FIFO_TX15 = 0x000FU, //!< Transmit interrupt 15/16 full + SCI_FIFO_TX16 = 0x0010U //!< Transmit interrupt full +} SCI_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SCI_setFIFOInterruptLevel() as the rxLevel +//! parameter and returned by SCI_getFIFOInterruptLevel() and +//! SCI_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SCI_FIFO_RX0 = 0x0000U, //!< Receive interrupt empty + SCI_FIFO_RX1 = 0x0001U, //!< Receive interrupt 1/16 full + SCI_FIFO_RX2 = 0x0002U, //!< Receive interrupt 2/16 full + SCI_FIFO_RX3 = 0x0003U, //!< Receive interrupt 3/16 full + SCI_FIFO_RX4 = 0x0004U, //!< Receive interrupt 4/16 full + SCI_FIFO_RX5 = 0x0005U, //!< Receive interrupt 5/16 full + SCI_FIFO_RX6 = 0x0006U, //!< Receive interrupt 6/16 full + SCI_FIFO_RX7 = 0x0007U, //!< Receive interrupt 7/16 full + SCI_FIFO_RX8 = 0x0008U, //!< Receive interrupt 8/16 full + SCI_FIFO_RX9 = 0x0009U, //!< Receive interrupt 9/16 full + SCI_FIFO_RX10 = 0x000AU, //!< Receive interrupt 10/16 full + SCI_FIFO_RX11 = 0x000BU, //!< Receive interrupt 11/16 full + SCI_FIFO_RX12 = 0x000CU, //!< Receive interrupt 12/16 full + SCI_FIFO_RX13 = 0x000DU, //!< Receive interrupt 13/16 full + SCI_FIFO_RX14 = 0x000EU, //!< Receive interrupt 14/16 full + SCI_FIFO_RX15 = 0x000FU, //!< Receive interrupt 15/16 full + SCI_FIFO_RX16 = 0x0010U //!< Receive interrupt full +} SCI_RxFIFOLevel; + +//***************************************************************************** +// +// Values returned from SCI_getRxStatus(). These correspond to the different +// bits and flags of the SCIRXST register. +// +//***************************************************************************** +#define SCI_RXSTATUS_WAKE 0x0002U //!< Receiver wake up detect +#define SCI_RXSTATUS_PARITY 0x0004U //!< Parity error +#define SCI_RXSTATUS_OVERRUN 0x0008U //!< Overrun error +#define SCI_RXSTATUS_FRAMING 0x0010U //!< Framing error +#define SCI_RXSTATUS_BREAK 0x0020U //!< Break detect +#define SCI_RXSTATUS_READY 0x0040U //!< Receiver ready +#define SCI_RXSTATUS_ERROR 0x0080U //!< Receiver error + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a SCI base address. +//! +//! \param base is the base address of the SCI port. +//! +//! This function determines if a SCI port base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SCI_isBaseValid(uint32_t base) +{ + return( + (base == SCIA_BASE) || + (base == SCIB_BASE) || + (base == SCIC_BASE) || + (base == SCID_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Sets the type of parity. +//! +//! \param base is the base address of the SCI port. +//! \param parity specifies the type of parity to use. +//! +//! Sets the type of parity to use for transmitting and expect when receiving. +//! The \e parity parameter must be one of the following: +//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setParityMode(uint32_t base, SCI_ParityType parity) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the parity mode. + // + HWREGH(base + SCI_O_CCR) = ((HWREGH(base + SCI_O_CCR) & + ~(SCI_CONFIG_PAR_MASK)) | (uint16_t)parity); +} + +//***************************************************************************** +// +//! Gets the type of parity currently being used. +//! +//! \param base is the base address of the SCI port. +//! +//! This function gets the type of parity used for transmitting data and +//! expected when receiving data. +//! +//! \return Returns the current parity settings, specified as one of the +//! following: +//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD. +// +//***************************************************************************** +static inline SCI_ParityType +SCI_getParityMode(uint32_t base) +{ + uint16_t parity; + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current parity setting. + // + parity = (HWREGH(base + SCI_O_CCR) & (SCI_CONFIG_PAR_MASK)); + + return((SCI_ParityType)parity); +} + +//***************************************************************************** +// +//! Sets the multiprocessor protocol to address-bit mode. +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the multi-processor protocol to address-bit mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setAddrMultiProcessorMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the address-bit mode protocol + // + HWREGH(base + SCI_O_CCR) |= SCI_CCR_ADDRIDLE_MODE; +} + +//***************************************************************************** +// +//! Sets the multiprocessor protocol to idle-line mode. +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the multi-processor protocol to idle-line protocol. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setIdleMultiProcessorMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the address-bit mode protocol + // + HWREGH(base + SCI_O_CCR) &= ~SCI_CCR_ADDRIDLE_MODE; +} + +//***************************************************************************** +// +//! Locks Autobaud. +//! +//! \param base is the base address of the SCI port. +//! +//! This function performs an autobaud lock for the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_lockAutobaud(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Prime the baud register + // + HWREGH(base + SCI_O_HBAUD) = 0x0U; + HWREGH(base + SCI_O_LBAUD) = 0x1U; + + // + // Prepare for autobaud detection. + // Set the CDC bit to enable autobaud detection and clear the ABD bit. + // + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_CDC; + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR; + + // + // Wait until we correctly read an 'A' or 'a' and lock + // + while((HWREGH(base + SCI_O_FFCT) & SCI_FFCT_ABD) != SCI_FFCT_ABD) + { + } + + // + // After autobaud lock, clear the ABD and CDC bits + // + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR; + HWREGH(base + SCI_O_FFCT) &= ~SCI_FFCT_CDC; +} + +//***************************************************************************** +// +//! Sets the FIFO interrupt level at which interrupts are generated. +//! +//! \param base is the base address of the SCI port. +//! \param txLevel is the transmit FIFO interrupt level, specified as one of +//! the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, . . . or +//! \b SCI_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as one of +//! the following +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel txLevel, + SCI_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + SCI_O_FFTX) = (HWREGH(base + SCI_O_FFTX) & + (~SCI_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + SCI_O_FFRX) = (HWREGH(base + SCI_O_FFRX) & + (~SCI_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO interrupt level at which interrupts are generated. +//! +//! \param base is the base address of the SCI port. +//! \param txLevel is a pointer to storage for the transmit FIFO interrupt +//! level, returned as one of the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, ... or \b SCI_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO interrupt +//! level, returned as one of the following: +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_getFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel *txLevel, + SCI_RxFIFOLevel *rxLevel) +{ + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (SCI_TxFIFOLevel)(HWREGH(base + SCI_O_FFTX) & + SCI_FFTX_TXFFIL_M); + *rxLevel = (SCI_RxFIFOLevel)(HWREGH(base + SCI_O_FFRX) & + SCI_FFRX_RXFFIL_M); +} + +//***************************************************************************** +// +//! Gets the current configuration of a SCI. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is a pointer to storage for the baud rate. +//! \param config is a pointer to storage for the data format. +//! +//! The baud rate and data format for the SCI is determined, given an +//! explicitly provided peripheral clock (hence the ExpClk suffix). The +//! returned baud rate is the actual baud rate; it may not be the exact baud +//! rate requested or an ``official'' baud rate. The data format returned in +//! \e config is enumerated the same as the \e config parameter of +//! SCI_setConfig(). +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSeedClock(), or it can be explicitly +//! hard coded if it is constant and known (to save the code/execution overhead +//! of a call to SysCtl_getLowSpeedClock()). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_getConfig(uint32_t base, uint32_t lspclkHz, uint32_t *baud, + uint32_t *config) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Compute the baud rate. + // + *baud = lspclkHz / + ((1U + (((uint32_t)HWREGH(base + SCI_O_HBAUD) << 8U) | + HWREGH(base + SCI_O_LBAUD))) * 8U); + + // + // Get the parity, data length, and number of stop bits. + // + *config = (uint32_t)HWREGH(base + SCI_O_CCR) & (SCI_CONFIG_PAR_MASK | + SCI_CONFIG_STOP_MASK | + SCI_CONFIG_WLEN_MASK); +} + +//***************************************************************************** +// +//! Enables transmitting and receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the TXENA, and +//! RXENA bits which enables transmit and receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable RX, TX, and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_TXENA | SCI_CTL1_RXENA | + SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables transmitting and receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Clears the SCIEN, TXE, and RXE bits. The user should ensure that all the +//! data has been sent before disable the module during transmission. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~(SCI_FFTX_SCIFFENA); + + // + // Disable the SCI. + // + HWREGH(base + SCI_O_CTL1) &= ~(SCI_CTL1_TXENA | SCI_CTL1_RXENA); +} + +//***************************************************************************** +// +//! Enables transmitting. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the TXENA bit +//! which enables transmit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableTxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable TX and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_TXENA | SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables transmitting. +//! +//! \param base is the base address of the SCI port. +//! +//! Disables SCI by taking SCI out of the software reset. Clears the TXENA bit +//! which disables transmit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableTxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable TX. + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_TXENA; +} + +//***************************************************************************** +// +//! Enables receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the RXENA bit +//! which enables receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableRxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable RX and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_RXENA | SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Disables SCI by taking SCI out of the software reset. Clears the RXENA bit +//! which disables receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableRxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable RX. + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_RXENA; +} + +//***************************************************************************** +// +//! Enables Sleep Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Enables the sleep mode in SCI by setting the SLEEP bit in SCICTL1 register +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableSleepMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set sleep bit + // + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_SLEEP; +} + +//***************************************************************************** +// +//! Disables Sleep Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Disables the sleep mode in SCI by clearing the SLEEP bit in SCICTL1 register +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableSleepMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear sleep bit + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_SLEEP; +} + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions enables the transmit and receive FIFOs in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIRST; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIFFENA | SCI_FFTX_TXFIFORESET; + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions disables the transmit and receive FIFOs in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_SCIFFENA; +} + +//***************************************************************************** +// +//! Determines if the FIFO enhancement is enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not the FIFO enhancement +//! is enabled. +//! +//! \return Returns \b true if the FIFO enhancement is enabled or \b false +//! if the FIFO enhancement is disabled. +// +//***************************************************************************** +static inline bool +SCI_isFIFOEnabled(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return true if the FIFO is enabled and false if it is disabled. + // + return(((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_SCIFFENA) == + SCI_FFTX_SCIFFENA) ? true : false); +} + +//***************************************************************************** +// +//! Resets the receive FIFO. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets the receive FIFO of the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetRxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the specified FIFO. + // + HWREGH(base + SCI_O_FFRX) &= ~SCI_FFRX_RXFIFORESET; + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the transmit FIFO. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets the transmit FIFO of the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetTxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the specified FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_TXFIFORESET; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the SCI Transmit and Receive Channels +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets transmit and receive channels in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetChannels(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the Tx and Rx Channels + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_SCIRST; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIRST; +} + +//***************************************************************************** +// +//! Determines if there are any characters in the receive buffer when the +//! FIFO enhancement is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not there is data +//! available in the receive buffer. +//! +//! \return Returns \b true if there is data in the receive buffer or \b false +//! if there is no data in the receive buffer. +// +//***************************************************************************** +static inline bool +SCI_isDataAvailableNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the availability of characters with FIFO disabled. + // + return(((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXRDY) == + SCI_RXST_RXRDY) ? true : false); +} + +//***************************************************************************** +// +//! Determines if there is any space in the transmit buffer when the FIFO +//! enhancement is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not there is space +//! available in the transmit buffer when not using the FIFO enhancement. +//! +//! \return Returns \b true if there is space available in the transmit buffer +//! or \b false if there is no space available in the transmit buffer. +// +//***************************************************************************** +static inline bool +SCI_isSpaceAvailableNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the availability of space. + // + return(((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXRDY) == + SCI_CTL2_TXRDY) ? true : false); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, \b SCI_FIFO_TX3 +//! \b SCI_FIFO_TX4, ..., or \b SCI_FIFO_TX16 +// +//***************************************************************************** +static inline SCI_TxFIFOLevel +SCI_getTxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SCI_TxFIFOLevel)((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFST_M) >> + SCI_FFTX_TXFFST_S)); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, \b SCI_FIFO_RX3 +//! \b SCI_FIFO_RX4, ..., or \b SCI_FIFO_RX16 +// +//***************************************************************************** +static inline SCI_RxFIFOLevel +SCI_getRxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SCI_RxFIFOLevel)((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFST_M) >> + SCI_FFRX_RXFFST_S)); +} + +//***************************************************************************** +// +//! Determines whether the SCI transmitter is busy or not. +//! +//! \param base is the base address of the SCI port. +//! +//! Allows the caller to determine whether all transmitted bytes have cleared +//! the transmitter hardware when the FIFO is not enabled. When the FIFO is +//! enabled, this function allows the caller to determine whether there is any +//! data in the FIFO. +//! +//! Without the FIFO enabled, if \b false is returned, the transmit buffer and +//! shift registers are empty and the transmitter is not busy. With the FIFO +//! enabled, if \b false is returned, the FIFO is empty. This does not +//! necessarily mean that the transmitter is not busy. The empty FIFO does not +//! reflect the status of the transmitter shift register. The FIFO may be empty +//! while the transmitter is still transmitting data. +//! +//! \return Returns \b true if the SCI is transmitting or \b false if +//! transmissions are complete. +// +//***************************************************************************** +static inline bool +SCI_isTransmitterBusy(uint32_t base) +{ + // + // Check the argument. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // With FIFO enhancement, determine if the SCI is busy. + // + return(((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFST_M) != + 0U) ? true : false); + } + else + { + // + // Without FIFO enhancement, determine if the SCI is busy. + // Check if the transmit buffer and shift register empty. + // + return(((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXEMPTY) == + SCI_CTL2_TXEMPTY) ? false : true); + } +} + +//***************************************************************************** +// +//! Waits to send a character from the specified port when the FIFO enhancement +//! is enabled. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Sends the character \e data to the transmit buffer for the specified port. +//! If there is no space available in the transmit FIFO, this function waits +//! until there is space available before returning. \e data is a uint16_t but +//! only 8 bits are written to the SCI port. SCI only transmits 8 bit +//! characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharBlockingFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until space is available in the transmit FIFO. + // + while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits to send a character from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Sends the character \e data to the transmit buffer for the specified port. +//! If there is no space available in the transmit buffer, or the transmit +//! FIFO if it is enabled, this function waits until there is space available +//! before returning. \e data is a uint16_t but only 8 bits are written to the +//! SCI port. SCI only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharBlockingNonFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until space is available in the transmit buffer. + // + while(!SCI_isSpaceAvailableNonFIFO(base)) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Sends a character to the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Writes the character \e data to the transmit buffer for the specified port. +//! This function does not block and only writes to the transmit buffer. +//! The user should use SCI_isSpaceAvailableNonFIFO() or SCI_getTxFIFOStatus() +//! to determine if the transmit buffer or FIFO have space available. +//! \e data is a uint16_t but only 8 bits are written to the SCI port. SCI +//! only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Gets current receiver status flags. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns the current receiver status flags. The returned +//! error flags are equivalent to the error bits returned via the previous +//! reading or receiving of a character with the exception that the overrun +//! error is set immediately the overrun occurs rather than when a character +//! is next read. +//! +//! \return Returns a bitwise OR combination of the receiver status flags, +//! \b SCI_RXSTATUS_WAKE, \b SCI_RXSTATUS_PARITY, \b SCI_RXSTATUS_OVERRUN, +//! \b SCI_RXSTATUS_FRAMING, \b SCI_RXSTATUS_BREAK, \b SCI_RXSTATUS_READY, +//! and \b SCI_RXSTATUS_ERROR. +// +//***************************************************************************** +static inline uint16_t +SCI_getRxStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current value of the receive status register. + // + return(HWREGH(base + SCI_O_RXST)); +} + +//***************************************************************************** +// +//! Waits for a character from the specified port when the FIFO enhancement +//! is enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive FIFO for the specified port. If there +//! are no characters available, this function waits until a character is +//! received before returning. Returns immediately in case of Error. +//! +//! \return Returns the character read from the specified port as \e uint16_t +//! or 0x0 in case of Error. The application must use +//! SCI_getRxStatus() API to check if some error occurred before +//! consuming the data +// +//***************************************************************************** +static inline uint16_t +SCI_readCharBlockingFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until a character is available in the receive FIFO. + // + while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0) + { + // + //If there is any error return + // + if((SCI_getRxStatus(base) & SCI_RXSTATUS_ERROR) != 0U) + { + return(0U); + } + } + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Waits for a character from the specified port when the FIFO enhancement +//! is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive buffer for the specified port. If there +//! is no characters available, this function waits until a character is +//! received before returning. +//! +//! \return Returns the character read from the specified port as \e uint16_t. +// +//***************************************************************************** +static inline uint16_t +SCI_readCharBlockingNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until a character is available in the receive FIFO. + // + while(!SCI_isDataAvailableNonFIFO(base)) + { + } + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Receives a character from the specified port. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive buffer for the specified port. This +//! function does not block and only reads the receive buffer. The user should +//! use SCI_isDataAvailableNonFIFO() or SCI_getRxFIFOStatus() to determine if +//! the receive buffer or FIFO have data available. +//! +//! \return Returns \e uin16_t which is read from the receive buffer. +// +//***************************************************************************** +static inline uint16_t +SCI_readCharNonBlocking(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Performs a software reset of the SCI and Clears all reported receiver +//! status flags. +//! +//! \param base is the base address of the SCI port. +//! +//! This function performs a software reset of the SCI port. It affects the +//! operating flags of the SCI, but it neither affects the configuration bits +//! nor restores the reset values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_performSoftwareReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // To clear all errors a sw reset of the module is required + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_SWRESET; + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_SWRESET; +} + +//***************************************************************************** +// +//! Enables Loop Back Test Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Enables the loop back test mode where the Tx pin is internally connected +//! to the Rx pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the loop back mode. + // + HWREGH(base + SCI_O_CCR) |= SCI_CCR_LOOPBKENA; +} + +//***************************************************************************** +// +//! Disables Loop Back Test Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Disables the loop back test mode where the Tx pin is no longer internally +//! connected to the Rx pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the loop back mode. + // + HWREGH(base + SCI_O_CCR) &= ~SCI_CCR_LOOPBKENA; +} + +//***************************************************************************** +// +//! Get the receive FIFO Overflow flag status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the receive FIFO overflow flag status. +//! +//! \return Returns \b true if overflow has occurred, else returned \b false if +//! an overflow hasn't occurred. +// +//***************************************************************************** +static inline bool +SCI_getOverflowStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current FIFO overflow status + // + return((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFOVF) == SCI_FFRX_RXFFOVF); +} + +//***************************************************************************** +// +//! Clear the receive FIFO Overflow flag status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions clears the receive FIFO overflow flag status. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_clearOverflowStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the current FIFO overflow status + // + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFOVRCLR; +} + +//***************************************************************************** +// +//! Sets the configuration of a SCI. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is the desired baud rate. +//! \param config is the data format for the port (number of data bits, +//! number of stop bits, and parity). +//! +//! This function configures the SCI for operation in the specified data +//! format. The baud rate is provided in the \e baud parameter and the data +//! format in the \e config parameter. +//! +//! The \e config parameter is the bitwise OR of three values: the number of +//! data bits, the number of stop bits, and the parity. \b SCI_CONFIG_WLEN_8, +//! \b SCI_CONFIG_WLEN_7, \b SCI_CONFIG_WLEN_6, \b SCI_CONFIG_WLEN_5, +//! \b SCI_CONFIG_WLEN_4, \b SCI_CONFIG_WLEN_3, \b SCI_CONFIG_WLEN_2, and +//! \b SCI_CONFIG_WLEN_1. Select from eight to one data bits per byte +//! (respectively). +//! \b SCI_CONFIG_STOP_ONE and \b SCI_CONFIG_STOP_TWO select one or two stop +//! bits (respectively). \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, +//! \b SCI_CONFIG_PAR_ODD, select the parity mode (no parity bit, even parity +//! bit, odd parity bit respectively). +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSpeedClock(), or it can be explicitly +//! hard coded if it is constant and known (to save the code/execution overhead +//! of a call to SysCtl_getLowSpeedClock()). +//! +//! A baud rate divider (BRR) is used in this function to calculate the +//! baud rate. The value of BRR is calculated in float and type casted as int +//! to be fed in the \b SCIHBAUD and \b SCILBAUD registers. This conversion +//! brings an error in the calculated baud rate and the requested. Error will +//! be significant when operating at higher baud rates. The error is due to +//! lower BRR integer value granularity at higher baud rates. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setConfig(uint32_t base, uint32_t lspclkHz, uint32_t baud, + uint32_t config); + +//***************************************************************************** +// +//! Waits to send an array of characters from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param array is the address of the array of characters to be transmitted. +//! It is pointer to the array of characters to be transmitted. +//! \param length is the length of the array, or number of characters in the +//! array to be transmitted. +//! +//! Sends the number of characters specified by \e length, starting at the +//! address \e array, out of the transmit buffer for the specified port. +//! If there is no space available in the transmit buffer, or the transmit +//! FIFO if it is enabled, this function waits until there is space available +//! and \e length number of characters are transmitted before returning. +//! \e array is a pointer to uint16_ts but only the least significant 8 bits +//! are written to the SCI port. SCI only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_writeCharArray(uint32_t base, const uint16_t * const array, + uint16_t length); + +//***************************************************************************** +// +//! Waits to receive an array of characters from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param array is the address of the array of characters to be received. +//! It is a pointer to the array of characters to be received. +//! \param length is the length of the array, or number of characters in the +//! array to be received. +//! +//! Receives an array of characters from the receive buffer for the specified +//! port, and stores them as an array of characters starting at address +//! \e array. This function waits until the \e length number of characters are +//! received before returning. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length); + +//***************************************************************************** +// +//! Enables individual SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated SCI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The \e intFlags parameter is the bitwise OR of any of the following: +//! +//! - \b SCI_INT_RXERR - RXERR Interrupt +//! - \b SCI_INT_RXRDY_BRKDT - RXRDY/BRKDT Interrupt +//! - \b SCI_INT_TXRDY - TXRDY Interrupt +//! - \b SCI_INT_TXFF - TX FIFO Level Interrupt +//! - \b SCI_INT_RXFF - RX FIFO Level Interrupt +//! - \b SCI_INT_FE - Frame Error +//! - \b SCI_INT_OE - Overrun Error +//! - \b SCI_INT_PE - Parity Error +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables individual SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated SCI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to SCI_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base is the base address of the SCI port. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! values described in SCI_enableInterrupt(). +// +//***************************************************************************** +extern uint32_t +SCI_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified SCI interrupt sources are cleared, so that they no longer +//! assert. This function must be called in the interrupt handler to keep the +//! interrupt from being recognized again immediately upon exit. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to SCI_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_clearInterruptStatus(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Sets SCI Baud rate. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is the desired baud rate. +//! +//! This function configures the SCI for operation in the specified baud rate +//! The baud rate is provided in the \e baud parameter. +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSpeedClock() +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setBaud(uint32_t base, uint32_t lspclkHz, uint32_t baud); + +//***************************************************************************** +// +//! Sets the SCI TXWAKE flag +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the TXWAKE flag bit to indicate that the next frame +//! is an address frame. +//! TXWAKE bit controls selection of data-transmit feature based on +//! which mode is selected from idle-line and address-bit. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setWakeFlag(uint32_t base); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SCI_H diff --git a/gpio_bitfield_cpu2/device/driverlib/sdfm.c b/gpio_bitfield_cpu2/device/driverlib/sdfm.c new file mode 100644 index 0000000..41bc605 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sdfm.c @@ -0,0 +1,188 @@ +//########################################################################### +// +// FILE: sdfm.c +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "sdfm.h" + +//***************************************************************************** +// +// Defines for filter configurations. Not intended for use by application code. +// +//***************************************************************************** +// +// Get filter oversampling ratio +// +#define SDFM_GET_OSR(C) ((C) >> 8U) + +// +// Maximum acceptable comparator filter oversampling ratio +// +#define SDFM_MAX_COMP_FILTER_OSR 31U + +// +// Maximum acceptable data filter oversampling ratio +// +#define SDFM_MAX_DATA_FILTER_OSR 255U + +// +// Get the filter type +// +#define SDFM_GET_FILTER_TYPE(C) ((C) & 0x30U) + +// +// Get the filter number +// +#define SDFM_GET_FILTER_NUMBER(C) ((C) & 0x3U) + + +// +// Get data shift value +// +#define SDFM_GET_SHIFT_VALUE(C) (((C) >> 2U) & 0x1FU) + +//***************************************************************************** +// +// SDFM_configComparator +// +//***************************************************************************** +void SDFM_configComparator(uint32_t base, uint16_t config1, uint32_t config2) +{ + SDFM_FilterNumber filter; + uint16_t ratio; + SDFM_FilterType filterType; + + filter = (SDFM_FilterNumber)(SDFM_GET_FILTER_NUMBER(config1)); + ratio = SDFM_GET_OSR(config1); + filterType = (SDFM_FilterType)SDFM_GET_FILTER_TYPE(config1); + + // + // Limit the oversampling ratio + // + if(ratio > SDFM_MAX_COMP_FILTER_OSR) + { + ratio = SDFM_MAX_COMP_FILTER_OSR; + } + + // + // Set the comparator filter type + // + SDFM_setComparatorFilterType(base, filter, filterType); + + // + // Set the comparator filter over sampling ratio + // + SDFM_setCompFilterOverSamplingRatio(base, filter, ratio); + + // + // Set the comparator high threshold value + // + SDFM_setCompFilterHighThreshold(base, filter, + SDFM_GET_HIGH_THRESHOLD(config2)); + + // + // Set the comparator low threshold value + // + SDFM_setCompFilterLowThreshold(base, filter, + SDFM_GET_LOW_THRESHOLD(config2)); + +} + +//***************************************************************************** +// +// SDFM_configDataFilter +// +//***************************************************************************** +void SDFM_configDataFilter(uint32_t base, uint16_t config1, uint16_t config2) +{ + SDFM_FilterNumber filter; + uint16_t ratio; + SDFM_FilterType filterType; + + filter = (SDFM_FilterNumber)(SDFM_GET_FILTER_NUMBER(config1)); + ratio = SDFM_GET_OSR(config1); + filterType = (SDFM_FilterType)SDFM_GET_FILTER_TYPE(config1); + + // + // Limit the oversampling ratio + // + if(ratio > SDFM_MAX_DATA_FILTER_OSR) + { + ratio = SDFM_MAX_DATA_FILTER_OSR; + } + + // + // Set the comparator filter type + // + SDFM_setFilterType(base, filter, filterType); + + // + // Set the comparator filter over sampling ratio + // + SDFM_setFilterOverSamplingRatio(base, filter, ratio); + + // + // If filter switch on + // + if((config2 & SDFM_FILTER_ENABLE) == SDFM_FILTER_ENABLE) + { + SDFM_enableFilter(base, filter); + } + else + { + SDFM_disableFilter(base, filter); + } + + // + // Set output data format + // + SDFM_setOutputDataFormat(base, filter, + (SDFM_OutputDataFormat)(config2 & 0x1U)); + + // + // Set the shift value if data is in 16-bit 2's complement format + // + if((config2 & 0x1U) == (uint16_t)(SDFM_DATA_FORMAT_16_BIT)) + { + SDFM_setDataShiftValue(base, filter, SDFM_GET_SHIFT_VALUE(config2)); + } +} + + diff --git a/gpio_bitfield_cpu2/device/driverlib/sdfm.h b/gpio_bitfield_cpu2/device/driverlib/sdfm.h new file mode 100644 index 0000000..afbdfb7 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sdfm.h @@ -0,0 +1,1178 @@ +//########################################################################### +// +// FILE: sdfm.h +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef SDFM_H +#define SDFM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sdfm_api SDFM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_sdfm.h" +#include "inc/hw_memmap.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//! Macro to get the low threshold +//! +#define SDFM_GET_LOW_THRESHOLD(C) ((uint16_t)(C)) + +//! Macro to get the high threshold +//! +#define SDFM_GET_HIGH_THRESHOLD(C) ((uint16_t)((uint32_t)(C) >> 16U)) + + +//! Macro to convert comparator over sampling ratio to acceptable bit location +//! +#define SDFM_SET_OSR(X) (((X) - 1U) << 8U) +//! Macro to convert the data shift bit values to acceptable bit location +//! +#define SDFM_SHIFT_VALUE(X) ((X) << 2U) + +//! Macro to combine high threshold and low threshold values +//! +#define SDFM_THRESHOLD(H, L) ((((uint32_t)(H)) << 16U) | (L)) + +//! Macro to set the FIFO level to acceptable bit location +//! +#define SDFM_SET_FIFO_LEVEL(X) ((X) << 7U) + +//! Macro to set and enable the zero cross threshold value. +//! +#define SDFM_SET_ZERO_CROSS_THRESH_VALUE(X) (0x8000 | (X)) + +//! Macros to enable or disable filter. +//! +#define SDFM_FILTER_DISABLE 0x0U +#define SDFM_FILTER_ENABLE 0x2U + +//***************************************************************************** +// +//! Values that can be returned from SDFM_getThresholdStatus() +// +//***************************************************************************** +typedef enum +{ + SDFM_OUTPUT_WITHIN_THRESHOLD = 0, //!< SDFM output is within threshold + SDFM_OUTPUT_ABOVE_THRESHOLD = 1, //!< SDFM output is above threshold + SDFM_OUTPUT_BELOW_THRESHOLD = 2 //!< SDFM output is below threshold +} SDFM_OutputThresholdStatus; + +//***************************************************************************** +// +//! Values that can be passed to all functions as the \e filterNumber +//! parameter. +// +//***************************************************************************** +typedef enum +{ + SDFM_FILTER_1 = 0, //!< Digital filter 1 + SDFM_FILTER_2 = 1, //!< Digital filter 2 + SDFM_FILTER_3 = 2, //!< Digital filter 3 + SDFM_FILTER_4 = 3 //!< Digital filter 4 +} SDFM_FilterNumber; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setFilterType(), +//! SDFM_setComparatorFilterType() as the \e filterType parameter. +// +//***************************************************************************** +typedef enum +{ + //! Digital filter with SincFast structure. + SDFM_FILTER_SINC_FAST = 0x00, + //! Digital filter with Sinc1 structure + SDFM_FILTER_SINC_1 = 0x10, + //! Digital filter with Sinc3 structure. + SDFM_FILTER_SINC_2 = 0x20, + //! Digital filter with Sinc4 structure. + SDFM_FILTER_SINC_3 = 0x30 +} SDFM_FilterType; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setupModulatorClock(),as the +//! \e clockMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Modulator clock is identical to the data rate + SDFM_MODULATOR_CLK_EQUAL_DATA_RATE = 0, + //! Modulator clock is half the data rate + SDFM_MODULATOR_CLK_HALF_DATA_RATE = 1, + //! Modulator clock is off. Data is Manchester coded. + SDFM_MODULATOR_CLK_OFF = 2, + //! Modulator clock is double the data rate. + SDFM_MODULATOR_CLK_DOUBLE_DATA_RATE = 3 +} SDFM_ModulatorClockMode; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setOutputDataFormat(),as the +//! \e dataFormat parameter. +// +//***************************************************************************** +typedef enum +{ + //! Filter output is in 16 bits 2's complement format. + SDFM_DATA_FORMAT_16_BIT = 0, + //! Filter output is in 32 bits 2's complement format. + SDFM_DATA_FORMAT_32_BIT = 1 +} SDFM_OutputDataFormat; + +//***************************************************************************** +// +// Values that can be passed to SDFM_enableInterrupt and SDFM_disableInterrupt +// as intFlags parameter +// +//***************************************************************************** +//! Interrupt is generated if Modulator fails. +//! +#define SDFM_MODULATOR_FAILURE_INTERRUPT 0x200U +//! Interrupt on Comparator low-level threshold. +//! +#define SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT 0x40U +//! Interrupt on Comparator high-level threshold. +//! +#define SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT 0x20U +//! Interrupt on Acknowledge flag +//! +#define SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT 0x1U + +//***************************************************************************** +// +// Values that can be passed to SDFM_clearInterruptFlag flags parameter +// +//***************************************************************************** +//! Main interrupt flag +//! +#define SDFM_MAIN_INTERRUPT_FLAG 0x80000000U +//! Filter 1 high -level threshold flag +//! +#define SDFM_FILTER_1_HIGH_THRESHOLD_FLAG 0x1U +//! Filter 1 low -level threshold flag +//! +#define SDFM_FILTER_1_LOW_THRESHOLD_FLAG 0x2U +//! Filter 2 high -level threshold flag +//! +#define SDFM_FILTER_2_HIGH_THRESHOLD_FLAG 0x4U +//! Filter 2 low -level threshold flag +//! +#define SDFM_FILTER_2_LOW_THRESHOLD_FLAG 0x8U +//! Filter 3 high -level threshold flag +//! +#define SDFM_FILTER_3_HIGH_THRESHOLD_FLAG 0x10U +//! Filter 3 low -level threshold flag +//! +#define SDFM_FILTER_3_LOW_THRESHOLD_FLAG 0x20U +//! Filter 4 high -level threshold flag +//! +#define SDFM_FILTER_4_HIGH_THRESHOLD_FLAG 0x40U +//! Filter 4 low -level threshold flag +//! +#define SDFM_FILTER_4_LOW_THRESHOLD_FLAG 0x80U +//! Filter 1 modulator failed flag +//! +#define SDFM_FILTER_1_MOD_FAILED_FLAG 0x100U +//! Filter 2 modulator failed flag +//! +#define SDFM_FILTER_2_MOD_FAILED_FLAG 0x200U +//! Filter 3 modulator failed flag +//! +#define SDFM_FILTER_3_MOD_FAILED_FLAG 0x400U +//! Filter 4 modulator failed flag +//! +#define SDFM_FILTER_4_MOD_FAILED_FLAG 0x800U +//! Filter 1 new data flag +//! +#define SDFM_FILTER_1_NEW_DATA_FLAG 0x1000U +//! Filter 2 new data flag +//! +#define SDFM_FILTER_2_NEW_DATA_FLAG 0x2000U +//! Filter 3 new data flag +//! +#define SDFM_FILTER_3_NEW_DATA_FLAG 0x4000U +//! Filter 4 new data flag +//! +#define SDFM_FILTER_4_NEW_DATA_FLAG 0x8000U + +//***************************************************************************** +// +//! \internal +//! Checks SDFM base address. +//! +//! \param base specifies the SDFM module base address. +//! +//! This function determines if SDFM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SDFM_isBaseValid(uint32_t base) +{ + return( + (base == SDFM1_BASE) || + (base == SDFM2_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enable external reset +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function enables data filter to be reset by an external source (PWM +//! compare output). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set the SDSYNCEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) |= + SDFM_SDDFPARM1_SDSYNCEN; + EDIS; +} + +//***************************************************************************** +// +//! Disable external reset +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function disables data filter from being reset by an external source +//! (PWM compare output). +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_disableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear the SDSYNCEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) &= + ~SDFM_SDDFPARM1_SDSYNCEN; + EDIS; +} + +//***************************************************************************** +// +//! Enable filter +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function enables the filter specified by the \e filterNumber variable. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableFilter(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set the FEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) |= + SDFM_SDDFPARM1_FEN; + EDIS; +} + +//***************************************************************************** +// +//! Disable filter +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function disables the filter specified by the \e filterNumber +//! variable. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_disableFilter(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear the FEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) &= + ~SDFM_SDDFPARM1_FEN; + EDIS; +} + +//***************************************************************************** +// +//! Set filter type. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param filterType is the filter type or structure. +//! +//! This function sets the filter type or structure to be used as specified by +//! filterType for the selected filter number as specified by filterNumber. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setFilterType(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_FilterType filterType) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to SST bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDFPARM1_SST_M)) | + ((uint16_t)filterType << 6U); + EDIS; +} + +//***************************************************************************** +// +//! Set data filter over sampling ratio. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param overSamplingRatio is the data filter over sampling ratio. +//! +//! This function sets the filter oversampling ratio for the filter specified +//! by the filterNumber variable.Valid values for the variable +//! overSamplingRatio are 0 to 255 inclusive. The actual oversampling ratio +//! will be this value plus one. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setFilterOverSamplingRatio(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t overSamplingRatio) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(overSamplingRatio < 256U); + + address = base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to DOSR bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDFPARM1_DOSR_M)) | + overSamplingRatio; + EDIS; +} + +//***************************************************************************** +// +//! Set modulator clock mode. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param clockMode is the modulator clock mode. +//! +//! This function sets the modulator clock mode specified by clockMode +//! for the filter specified by filterNumber. +//! +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setupModulatorClock(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_ModulatorClockMode clockMode) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDCTLPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to MOD bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCTLPARM1_MOD_M)) | + (uint16_t)clockMode; + + EDIS; +} + +//***************************************************************************** +// +//! Set the output data format +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param dataFormat is the output data format. +//! +//! This function sets the output data format for the filter specified by +//! filterNumber. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setOutputDataFormat(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_OutputDataFormat dataFormat) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDDPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to DR bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDPARM1_DR)) | + ((uint16_t)dataFormat << 10U); + EDIS; +} + +//***************************************************************************** +// +//! Set data shift value. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param shiftValue is the data shift value. +//! +//! This function sets the shift value for the 16 bit 2's complement data +//! format. The valid maximum value for shiftValue is 31. +//! +//! \b Note: Use this function with 16 bit 2's complement data format only. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setDataShiftValue(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t shiftValue) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(shiftValue < 32U); + + address = base + SDFM_O_SDDPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to SH bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDPARM1_SH_M)) | + (shiftValue << SDFM_SDDPARM1_SH_S); + EDIS; +} + +//***************************************************************************** +// +//! Set Filter output high-level threshold. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param highThreshold is the high-level threshold. +//! +//! This function sets the unsigned high-level threshold value for the +//! Comparator filter output. If the output value of the filter exceeds +//! highThreshold and interrupt generation is enabled, an interrupt will be +//! issued. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setCompFilterHighThreshold(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t highThreshold) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(highThreshold < 0x7FFFU); + + address = base + SDFM_O_SDCMPH1 + ((uint32_t)filterNumber * 16U); + + // + // Write to HLT bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & ~SDFM_SDCMPH1_HLT_M) | highThreshold; + EDIS; +} + +//***************************************************************************** +// +//! Set Filter output low-level threshold. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param lowThreshold is the low-level threshold. +//! +//! This function sets the unsigned low-level threshold value for the +//! Comparator filter output. If the output value of the filter gets below +//! lowThreshold and interrupt generation is enabled, an interrupt will be +//! issued. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setCompFilterLowThreshold(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t lowThreshold) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(lowThreshold < 0x7FFFU); + + address = base + SDFM_O_SDCMPL1 + ((uint32_t)filterNumber * 16U); + + // + // Write to LLT bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & ~SDFM_SDCMPL1_LLT_M) | lowThreshold; + EDIS; +} + +//***************************************************************************** +// +//! Enable SDFM interrupts. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param intFlags is the interrupt source. +//! +//! This function enables the low threshold , high threshold or modulator +//! failure interrupt as determined by intFlags for the filter specified +//! by filterNumber. +//! Valid values for intFlags are: +//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT, +//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t intFlags) +{ + uint16_t offset; + + ASSERT(SDFM_isBaseValid(base)); + + offset = (uint16_t)filterNumber * 16U; + + EALLOW; + + // + // Low, high threshold, Modulator failure + // + if((intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)) != 0U) + { + // + // Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx + // + HWREGH(base + SDFM_O_SDCPARM1 + offset) |= + (intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)); + } + + // + // Data filter acknowledge interrupt + // + if((intFlags & SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT) != 0U) + { + HWREGH(base + SDFM_O_SDDFPARM1 + offset) |= SDFM_SDDFPARM1_AE; + } + EDIS; +} + +//***************************************************************************** +// +//! Disable SDFM interrupts. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param intFlags is the interrupt source. +//! +//! This function disables the low threshold , high threshold or modulator +//! failure interrupt as determined by intFlags for the filter +//! specified by filterNumber. +//! Valid values for intFlags are: +//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT, +//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_disableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t intFlags) +{ + uint16_t offset; + + ASSERT(SDFM_isBaseValid(base)); + + offset = (uint16_t)filterNumber * 16U; + + EALLOW; + + // + // Low, high threshold, modulator failure interrupts + // + if((intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)) != 0U) + { + // + // Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx + // + HWREGH(base + SDFM_O_SDCPARM1 + offset) &= + ~(intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)); + } + + // + // Data filter acknowledge interrupt + // + if((intFlags & SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT) != 0U) + { + HWREGH(base + SDFM_O_SDDFPARM1 + offset) &= ~SDFM_SDDFPARM1_AE; + } + EDIS; +} + +//***************************************************************************** +// +//! Set the comparator filter type. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param filterType is the comparator filter type or structure. +//! +//! This function sets the Comparator filter type or structure to be used as +//! specified by filterType for the selected filter number as specified by +//! filterNumber. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setComparatorFilterType(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_FilterType filterType) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDCPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to CS1_CS0 bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCPARM1_CS1_CS0_M)) | + ((uint16_t)filterType << 3U); + EDIS; +} + +//***************************************************************************** +// +//! Set Comparator filter over sampling ratio. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param overSamplingRatio is the comparator filter over sampling ration. +//! +//! This function sets the comparator filter oversampling ratio for the filter +//! specified by the filterNumber.Valid values for the variable +//! overSamplingRatio are 0 to 31 inclusive. +//! The actual oversampling ratio will be this value plus one. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setCompFilterOverSamplingRatio(uint32_t base, + SDFM_FilterNumber filterNumber, + uint16_t overSamplingRatio) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(overSamplingRatio < 32U); + + address = base + SDFM_O_SDCPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to COSR bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCPARM1_COSR_M)) | + overSamplingRatio; + EDIS; +} + +//***************************************************************************** +// +//! Get the filter data output. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the latest data filter output. Depending on the +//! filter data output format selected, the valid value will be the lower 16 +//! bits or the whole 32 bits of the returned value. +//! +//! \return Returns the latest data filter output. +//***************************************************************************** +static inline uint32_t +SDFM_getFilterData(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDDATA bits + // + return(HWREG(base + SDFM_O_SDDATA1 + ((uint32_t)filterNumber * 16U))); +} + +//***************************************************************************** +// +//! Get the Comparator threshold status. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the Comparator output threshold status for the given +//! filterNumber. +//! +//! \return Returns the following status flags. +//! - \b SDFM_OUTPUT_WITHIN_THRESHOLD if the output is within the +//! specified threshold. +//! - \b SDFM_OUTPUT_ABOVE_THRESHOLD if the output is above the high +//! threshold +//! - \b SDFM_OUTPUT_BELOW_THRESHOLD if the output is below the low +//! threshold. +//! +//***************************************************************************** +static inline SDFM_OutputThresholdStatus +SDFM_getThresholdStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG high/low threshold bits + // + return((SDFM_OutputThresholdStatus)((HWREG(base + SDFM_O_SDIFLG) >> + (2U * (uint16_t)filterNumber)) & 0x3U)); +} + +//***************************************************************************** +// +//! Get the Modulator status. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the Modulator status. +//! +//! \return Returns true if the Modulator is operating normally +//! Returns false if the Modulator has failed +//! +//***************************************************************************** +static inline bool +SDFM_getModulatorStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG MF1, MF2, MF3 OR MF4 bits + // + return(((HWREG(base + SDFM_O_SDIFLG) >> ((uint16_t)filterNumber + 8U)) & + 0x1U) != 0x1U); +} + +//***************************************************************************** +// +//! Check if new Filter data is available. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns new filter data status. +//! +//! \return Returns \b true if new filter data is available +//! Returns \b false if no new filter data is available +//! +//***************************************************************************** +static inline bool +SDFM_getNewFilterDataStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG AF1, AF2, AF3 OR AF4 bits + // + return(((HWREG(base + SDFM_O_SDIFLG) >> ((uint16_t)filterNumber + 12U)) & + 0x1U) == 0x1U); +} + +//***************************************************************************** +// +//! Get pending interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function returns any pending interrupt status. +//! +//! \return Returns \b true if there is a pending interrupt. +//! Returns \b false if no interrupt is pending. +//! +//***************************************************************************** +static inline bool +SDFM_getIsrStatus(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG MIF + // + return((HWREG(base + SDFM_O_SDIFLG) >> 31U) == 0x1U); +} + +//***************************************************************************** +// +//! Clear pending flags. +//! +//! \param base is the base address of the SDFM module +//! \param flag is the SDFM status +//! +//! This function clears the specified pending interrupt flag. +//! Valid values are +//! SDFM_MAIN_INTERRUPT_FLAG,SDFM_FILTER_1_NEW_DATA_FLAG, +//! SDFM_FILTER_2_NEW_DATA_FLAG,SDFM_FILTER_3_NEW_DATA_FLAG, +//! SDFM_FILTER_4_NEW_DATA_FLAG,SDFM_FILTER_1_MOD_FAILED_FLAG, +//! SDFM_FILTER_2_MOD_FAILED_FLAG,SDFM_FILTER_3_MOD_FAILED_FLAG, +//! SDFM_FILTER_4_MOD_FAILED_FLAG,SDFM_FILTER_1_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_1_LOW_THRESHOLD_FLAG,SDFM_FILTER_2_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_2_LOW_THRESHOLD_FLAG,SDFM_FILTER_3_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_3_LOW_THRESHOLD_FLAG,SDFM_FILTER_4_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_4_LOW_THRESHOLD_FLAG or any combination of the above +//! flags. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_clearInterruptFlag(uint32_t base, uint32_t flag) +{ + ASSERT(SDFM_isBaseValid(base)); + ASSERT((flag & 0x8000FFFFU) == flag); + + // + // Write to SDIFLGCLR register + // + HWREG(base + SDFM_O_SDIFLGCLR) |= flag; +} + +//***************************************************************************** +// +//! Enable main interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function enables the main SDFM interrupt. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_enableMainInterrupt(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set SDCTL MIE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDCTL) |= SDFM_SDCTL_MIE; + EDIS; +} + +//***************************************************************************** +// +//! Disable main interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function disables the main SDFM interrupt. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_disableMainInterrupt(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear SDCTL MIE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDCTL) &= ~SDFM_SDCTL_MIE; + EDIS; +} + +//***************************************************************************** +// +//! Enable main filter. +//! +//! \param base is the base address of the SDFM module +//! +//! This function enables main filter. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_enableMainFilter(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set SDMFILEN MFE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDMFILEN) |= SDFM_SDMFILEN_MFE; + EDIS; +} + +//***************************************************************************** +// +//! Disable main filter. +//! +//! \param base is the base address of the SDFM module +//! +//! This function disables main filter. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_disableMainFilter(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear SDMFILEN MFE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDMFILEN) &= ~SDFM_SDMFILEN_MFE; + EDIS; +} + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Configures SDFM comparator for filter config & threshold values +//! +//! \param base is the base address of the SDFM module +//! \param config1 is the filter number, filter type and over sampling ratio. +//! \param config2 is high-level and low-level threshold values. +//! +//! This function configures the comparator filter for filter config and +//! threshold values based on provided inputs. +//! +//! The config1 parameter is the logical OR of the filter number, filter type +//! and oversampling ratio. +//! The bit definitions for config1 are as follow: +//! - config1.[3:0] filter number +//! - config1.[7:4] filter type +//! - config1.[15:8] Over sampling Ratio +//! Valid values for filter number and filter type are defined in +//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively. +//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling +//! ratio ,which ranges [1,32] inclusive, in the appropriate bit location. +//! For example the value +//! (SDFM_FILTER_1 | SDFM_FILTER_SINC_2 | SDFM_SET_OSR(16)) +//! will select Filter 1, SINC 2 type with an oversampling ratio of 16. +//! +//! The config2 parameter is the logical OR of the filter high and low +//! threshold values. +//! The bit definitions for config2 are as follow: +//! - config2.[15:0] low threshold +//! - config2.[31:16] high threshold +//! The upper 16 bits define the high threshold and the lower +//! 16 bits define the low threshold. +//! SDFM_THRESHOLD(H,L) can be used to combine the high and low thresholds. +//! +//! \return None. +//! +//***************************************************************************** +extern void +SDFM_configComparator(uint32_t base, uint16_t config1, uint32_t config2); + +//***************************************************************************** +// +//! Configure SDFM data filter +//! +//! \param base is the base address of the SDFM module +//! \param config1 is the filter number, filter type and over sampling ratio +//! configuration. +//! \param config2 is filter switch, data representation and data shift values +//! configuration. +//! +//! This function configures the data filter based on configurations +//! config1 and config2. +//! +//! The config1 parameter is the logical OR of the filter number, filter type +//! and oversampling ratio. +//! The bit definitions for config1 are as follow: +//! - config1.[3:0] Filter number +//! - config1.[7:4] Filter type +//! - config1.[15:8] Over sampling Ratio +//! Valid values for filter number and filter type are defined in +//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively. +//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling +//! ratio , which ranges [1,256] inclusive , in the appropriate bit location +//! for config1. For example the value +//! (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(64)) +//! will select Filter 2 , SINC 3 type with an oversampling ratio of 64. +//! +//! The config2 parameter is the logical OR of data representation, filter +//! switch, and data shift values +//! The bit definitions for config2 are as follow: +//! - config2.[0] Data representation +//! - config2.[1] Filter switch +//! - config2.[15:2] Shift values +//! Valid values for data representation are given in SDFM_OutputDataFormat +//! enumeration. SDFM_FILTER_DISABLE or SDFM_FILTER_ENABLE will define the +//! filter switch values.SDFM_SHIFT_VALUE(X) macro can be used to set the value +//! of the data shift value,which ranges [0,31] inclusive, in the appropriate +//! bit location for config2. +//! The shift value is valid only in SDFM_DATA_FORMAT_16_BIT data +//! representation format. +//! +//! \return None. +//! +//***************************************************************************** +extern void +SDFM_configDataFilter(uint32_t base, uint16_t config1, uint16_t config2); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif +#endif // SDFM_H diff --git a/gpio_bitfield_cpu2/device/driverlib/spi.c b/gpio_bitfield_cpu2/device/driverlib/spi.c new file mode 100644 index 0000000..b077369 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/spi.c @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: spi.c +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "spi.h" + +//***************************************************************************** +// +// SPI_setConfig +// +//***************************************************************************** +void +SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol, + SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth) +{ + uint16_t regValue; + uint32_t baud; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(bitRate <= (lspclkHz / 4U)); + ASSERT((lspclkHz / bitRate) <= 128U); + ASSERT((dataWidth >= 1U) && (dataWidth <= 16U)); + ASSERT((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPISWRESET) == 0U); + + // + // Set polarity and data width. + // + regValue = (((uint16_t)protocol << 6U) & SPI_CCR_CLKPOLARITY) | + (dataWidth - 1U); + + HWREGH(base + SPI_O_CCR) = (HWREGH(base + SPI_O_CCR) & + ~(SPI_CCR_CLKPOLARITY | SPI_CCR_SPICHAR_M)) | + regValue; + + // + // Set the mode and phase. + // + regValue = (uint16_t)mode | (((uint16_t)protocol << 2U) & + SPI_CTL_CLK_PHASE); + + HWREGH(base + SPI_O_CTL) = (HWREGH(base + SPI_O_CTL) & + ~(SPI_CTL_TALK | SPI_CTL_CONTROLLER_PERIPHERAL | + SPI_CTL_CLK_PHASE)) | regValue; + + // + // Set the clock. + // + baud = (lspclkHz / bitRate) - 1U; + HWREGH(base + SPI_O_BRR) = (uint16_t)baud; +} + +//***************************************************************************** +// +// SPI_setBaudRate +// +//***************************************************************************** +void +SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate) +{ + uint32_t baud; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(bitRate <= (lspclkHz / 4U)); + ASSERT((lspclkHz / bitRate) <= 128U); + + // + // Set the clock. + // + baud = (lspclkHz / bitRate) - 1U; + HWREGH(base + SPI_O_BRR) = (uint16_t)baud; +} + +//***************************************************************************** +// +// SPI_enableInterrupt +// +//***************************************************************************** +void +SPI_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Enable the specified non-FIFO interrupts. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CTL) |= SPI_CTL_SPIINTENA; + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_CTL) |= SPI_CTL_OVERRUNINTENA; + } + + // + // Enable the specified FIFO-mode interrupts. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFFIENA; + } + + if((intFlags & (SPI_INT_RXFF | SPI_INT_RXFF_OVERFLOW)) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SPI_disableInterrupt +// +//***************************************************************************** +void +SPI_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Disable the specified non-FIFO interrupts. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CTL) &= ~(SPI_CTL_SPIINTENA); + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_CTL) &= ~(SPI_CTL_OVERRUNINTENA); + } + + // + // Disable the specified FIFO-mode interrupts. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) &= ~(SPI_FFTX_TXFFIENA); + } + + if((intFlags & (SPI_INT_RXFF | SPI_INT_RXFF_OVERFLOW)) != 0U) + { + HWREGH(base + SPI_O_FFRX) &= ~(SPI_FFRX_RXFFIENA); + } +} + +//***************************************************************************** +// +// SPI_getInterruptStatus +// +//***************************************************************************** +uint32_t +SPI_getInterruptStatus(uint32_t base) +{ + uint32_t temp = 0; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + if((HWREGH(base + SPI_O_STS) & SPI_STS_INT_FLAG) != 0U) + { + temp |= SPI_INT_RX_DATA_TX_EMPTY; + } + + if((HWREGH(base + SPI_O_STS) & SPI_STS_OVERRUN_FLAG) != 0U) + { + temp |= SPI_INT_RX_OVERRUN; + } + + if((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFINT) != 0U) + { + temp |= SPI_INT_TXFF; + } + + if((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFINT) != 0U) + { + temp |= SPI_INT_RXFF; + } + + if((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFOVF) != 0U) + { + temp |= SPI_INT_RXFF_OVERFLOW; + } + + return(temp); +} + +//***************************************************************************** +// +// SPI_clearInterruptStatus +// +//***************************************************************************** +void +SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the specified non-FIFO interrupt sources. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CCR) &= ~(SPI_CCR_SPISWRESET); + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPISWRESET; + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_STS) |= SPI_STS_OVERRUN_FLAG; + } + + // + // Clear the specified FIFO-mode interrupt sources. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFFINTCLR; + } + + if((intFlags & SPI_INT_RXFF) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFINTCLR; + } + + if((intFlags & SPI_INT_RXFF_OVERFLOW) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFOVFCLR; + } +} +//***************************************************************************** +// +// SPI_pollingNonFIFOTransaction +// +//***************************************************************************** +uint16_t +SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength, uint16_t data) +{ + uint16_t rxData; + + ASSERT(((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPICHAR_M) + 1U) == charLength); + ASSERT(data < ((uint32_t)1U << charLength)); + + // + // Write to SPI Transmit buffer + // + SPI_writeDataBlockingNonFIFO(base, data << (16U - charLength)); + + // + // Read SPI Receive buffer + // + rxData = SPI_readDataBlockingNonFIFO(base); + + return(rxData); +} +//***************************************************************************** +// +// SPI_pollingFIFOTransaction +// +//***************************************************************************** + +void +SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t *pTxBuffer, uint16_t *pRxBuffer, + uint16_t numOfWords, uint16_t txDelay) +{ + ASSERT(((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPICHAR_M) + 1U) == charLength); + + // + // Reset the TX / RX FIFO buffers to default state + // + SPI_disableFIFO(base); // Disable FIFO register + SPI_enableFIFO(base); // Enable FIFO register + + // + // Configure the FIFO Transmit Delay + // + SPI_setTxFifoTransmitDelay(base, txDelay); + + // + // Determine the number of 16-level words from number of words to be + // transmitted / received + // + uint16_t numOfSixteenWords = numOfWords / (uint16_t)SPI_FIFO_TXFULL; + + // + // Determine the number of remaining words from number of words to be + // transmitted / received + // + uint16_t remainingWords = numOfWords % (uint16_t)SPI_FIFO_TXFULL; + + uint16_t count = 0; + uint16_t i = 0; + uint16_t txBuffer_pos = 0; + uint16_t rxBuffer_pos = 0; + + // + // Number of transactions is based on numOfSixteenWords + // Each transaction will transmit and receive 16 words. + // + while(count < numOfSixteenWords) + { + // + // Fill-up the SPI Transmit FIFO buffers + // + for(i = 1; i <= (uint16_t)SPI_FIFO_TXFULL; i++) + { + SPI_writeDataBlockingFIFO(base, pTxBuffer[txBuffer_pos] << + (16U - charLength)); + txBuffer_pos++; + } + + // + // Wait till SPI Receive FIFO buffer is full + // + while(SPI_getRxFIFOStatus(base) < SPI_FIFO_RXFULL) + { + } + + // + // Read the SPI Receive FIFO buffers + // + for(i = 1U; i <= (uint16_t)SPI_FIFO_RXFULL; i++) + { + if(pRxBuffer == NULL) + { + SPI_readDataBlockingFIFO(base); + } + else + { + pRxBuffer[rxBuffer_pos] = SPI_readDataBlockingFIFO(base); + rxBuffer_pos++; + } + } + + count++; + } + + // + // Number of transactions is based on remainingWords + // + for(i = 0U; i < remainingWords; i++) + { + SPI_writeDataBlockingFIFO(base, pTxBuffer[txBuffer_pos] << + (16U - charLength)); + txBuffer_pos++; + } + + // + // Wait till SPI Receive FIFO buffer remaining words + // + while((uint16_t)SPI_getRxFIFOStatus(base) < remainingWords) + { + } + + // + // Read the SPI Receive FIFO buffers + // + for(i = 0; i < remainingWords; i++) + { + if(pRxBuffer == NULL) + { + SPI_readDataBlockingFIFO(base); + } + else + { + pRxBuffer[rxBuffer_pos] = SPI_readDataBlockingFIFO(base); + rxBuffer_pos++; + } + } + + // + // Disable SPI FIFO + // + SPI_disableFIFO(base); +} + +//***************************************************************************** +// +// SPI_transmit24Bits +// +//***************************************************************************** +void +SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay) +{ + uint16_t i; + uint16_t rxBuffer[3]; + uint16_t txBuffer[3]; + + ASSERT(data < ((uint32_t)1U << 24U)); + + // + // Empty Receive buffer + // + for(i = 0U; i < 3U; i++) + { + rxBuffer[i] = 0U; + } + + // + // Fill Transmit buffer with appropriate data + // + txBuffer[0] = (uint16_t)(data >> 16U); // data[23:16] + txBuffer[1] = (uint16_t)(data) >> 8U; // data[15:8] + txBuffer[2] = (uint16_t)(data) & 0x00FFU; // data[7:0] + + // + // Three 8-bits make a 24-bit + // Character length = 8 + // number of bytes = 3 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 3U, txDelay); +} +//***************************************************************************** +// +// SPI_receive16Bits +// +//***************************************************************************** + +uint16_t +SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[2]; + uint16_t rxBuffer[2]; + uint16_t rxData = 0U; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 2U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 2U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = (rxBuffer[1] << 8) | rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = (rxBuffer[0] << 8) | rxBuffer[1]; + } + + return(rxData); +} +//***************************************************************************** +// +// SPI_receive24Bits +// +//***************************************************************************** + +uint32_t +SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[3]; + uint16_t rxBuffer[3]; + uint32_t rxData = 0; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 3U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // Two 8-bits make a 16-bit + // Character length = 8 + // number of bytes = 2 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 3U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = ((uint32_t)rxBuffer[2] << 16) | + ((uint32_t)rxBuffer[1] << 8) | + (uint32_t)rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = ((uint32_t)rxBuffer[0] << 16) | + ((uint32_t)rxBuffer[1] << 8) | + (uint32_t)rxBuffer[2]; + } + + return(rxData); +} +//***************************************************************************** +// +// SPI_transmit32Bits +// +//***************************************************************************** + +void +SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[2]; + uint16_t rxBuffer[2]; + + // + // Empty Receive buffer + // + for(i = 0U; i < 2U; i++) + { + rxBuffer[i] = 0U; + } + + // + // Fill Transmit buffer with appropriate data + // + txBuffer[0] = (uint16_t)(data >> 16U); // data[31:16] + txBuffer[1] = (uint16_t)(data); // data[15:0] + + // + // Two 16-bits make a 32-bit + // Character length = 16 + // number of bytes = 2 + // + SPI_pollingFIFOTransaction(base, 16U, txBuffer, rxBuffer, 2U, txDelay); +} +//***************************************************************************** +// +// SPI_receive32Bits +// +//***************************************************************************** + +uint32_t +SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[4]; + uint16_t rxBuffer[4]; + uint32_t rxData = 0U; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 4U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // Four 8-bits make a 32-bit + // Character length = 8 + // number of bytes = 4 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 4U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = ((uint32_t)rxBuffer[3] << 24U) | + ((uint32_t)rxBuffer[2] << 16U) | + ((uint32_t)rxBuffer[1] << 8U) | + (uint32_t)rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = ((uint32_t)rxBuffer[0] << 24U) | + ((uint32_t)rxBuffer[1] << 16U) | + ((uint32_t)rxBuffer[2] << 8U) | + (uint32_t)rxBuffer[3]; + } + + return(rxData); +} diff --git a/gpio_bitfield_cpu2/device/driverlib/spi.h b/gpio_bitfield_cpu2/device/driverlib/spi.h new file mode 100644 index 0000000..b9e0d38 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/spi.h @@ -0,0 +1,1743 @@ +//########################################################################### +// +// FILE: spi.h +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SPI_H +#define SPI_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup spi_api SPI +//! \brief This module is used for SPI configurations. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_spi.h" +#include "debug.h" +#include "hw_reg_inclusive_terminology.h" + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to SPI_enableInterrupt(), SPI_disableInterrupt(), +// and SPI_clearInterruptStatus() as the intFlags parameter, and returned by +// SPI_getInterruptStatus(). +// +//***************************************************************************** +#define SPI_INT_RX_OVERRUN 0x0001U //!< Receive overrun interrupt +#define SPI_INT_RX_DATA_TX_EMPTY 0x0002U //!< Data received, transmit empty +#define SPI_INT_RXFF 0x0004U //!< RX FIFO level interrupt +#define SPI_INT_TXFF 0x0008U //!< TX FIFO level interrupt +#define SPI_INT_RXFF_OVERFLOW 0x0010U //!< RX FIFO overflow +#endif + + +//***************************************************************************** +// +//! This macro definition is used to transmit a byte of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! +//! This macro definition is to transmit a byte of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitByte(base, txData) \ + SPI_pollingNonFIFOTransaction(base, 8U, txData) + +//***************************************************************************** +// +//! This macro definition is used to transmit a 16-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! +//! This macro definition is to transmit a 16-bit word of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmit16Bits(base, txData) \ + SPI_pollingNonFIFOTransaction(base, 16U, txData) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' bytes of data +//! +//! \param base specifies the SPI module base address. +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of bytes to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This macro definition can be used to transmit 'N' bytes of data. +//! This macro definition uses SPI_pollingFIFOTransaction function. +//! +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitNBytes(base, txBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 8U, txBuffer, NULL, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' 16-bit words of data +//! +//! \param base specifies the SPI module base address. +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of 16-bit word to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit 'N' 16-bit words of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitN16BitWord(base, txBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 16U, txBuffer, NULL, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' with previously +//! configured SPI character length +//! +//! \param base specifies the SPI module base address +//! \param charLength specifies the SPI character length +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of 16-bit word to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This macro definition can be used to transmit 'N' with configurable +//! SPI character length. +//! +//! This macro uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to required value BEFORE calling +//! the function, and passed as the charLength parameter. +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitNWordsWithCharLength(base, charLength, txBuffer, \ + numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, charLength, txBuffer, NULL, \ + numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition is used to receive a byte of data +//! +//! \param base specifies the SPI module base address. +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! +//! This macro definition is to receive a byte of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received byte. +// +//***************************************************************************** +#define SPI_receiveByte(base, dummyData) \ + SPI_pollingNonFIFOTransaction(base, 8U, dummyData) + +//***************************************************************************** +// +//! This macro is used to receive 'N' bytes of data +//! +//! \param base specifies the SPI module base address. +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of bytes to be received +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' bytes of data +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveNBytes(base, rxBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 8U, NULL, rxBuffer, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro is used to receive 'N' 16-bits words of data +//! +//! \param base specifies the SPI module base address. +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of 16-bit words to be received +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' 16-bit words of data +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveN16BitWord(base, rxBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 16U, NULL, rxBuffer, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro is used to receive 'N' words with previously configured character +//! length +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of words with specified character +//! length +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' words with specified character length +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to required value BEFORE calling +//! the function, and passed as the charLength parameter. +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveNWordsWithcharLength(base, charLength, rxBuffer, \ + numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, charLength, NULL, rxBuffer, \ + numOfWords, txDelay) + +//***************************************************************************** +// +//! Values that can be passed to SPI_setConfig() as the \e protocol parameter. +// +//***************************************************************************** +typedef enum +{ + //! Mode 0. Polarity 0, phase 0. Rising edge without delay. + SPI_PROT_POL0PHA0 = 0x0000U, + //! Mode 1. Polarity 0, phase 1. Rising edge with delay. + SPI_PROT_POL0PHA1 = 0x0002U, + //! Mode 2. Polarity 1, phase 0. Falling edge without delay. + SPI_PROT_POL1PHA0 = 0x0001U, + //! Mode 3. Polarity 1, phase 1. Falling edge with delay. + SPI_PROT_POL1PHA1 = 0x0003U +} SPI_TransferProtocol; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setConfig() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + SPI_MODE_PERIPHERAL = 0x0002U, //!< SPI peripheral + SPI_MODE_CONTROLLER = 0x0006U, //!< SPI controller + SPI_MODE_PERIPHERAL_OD = 0x0000U, //!< SPI peripheral w/ output disabled + SPI_MODE_CONTROLLER_OD = 0x0004U //!< SPI controller w/ output disabled +} SPI_Mode; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e txLevel +//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e txLevel +//! parameter, and returned by SPI_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SPI_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty + SPI_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty + SPI_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full + SPI_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full + SPI_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full + SPI_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full + SPI_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full + SPI_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full + SPI_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full + SPI_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full + SPI_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full + SPI_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full + SPI_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full + SPI_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full + SPI_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full + SPI_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full + SPI_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full + SPI_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full + SPI_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full +} SPI_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e rxLevel +//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e rxLevel +//! parameter, and returned by SPI_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SPI_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty + SPI_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty + SPI_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full + SPI_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full + SPI_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full + SPI_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full + SPI_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full + SPI_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full + SPI_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full + SPI_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full + SPI_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full + SPI_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full + SPI_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full + SPI_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full + SPI_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full + SPI_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full + SPI_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full + SPI_FIFO_RX16 = 0x0010U, //!< Receive FIFO full + SPI_FIFO_RXFULL = 0x0010U, //!< Receive FIFO full + SPI_FIFO_RXDEFAULT = 0x001FU //!< To prevent interrupt at reset +} SPI_RxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Transmission stops after midway in the bit stream + SPI_EMULATION_STOP_MIDWAY = 0x0000U, + //! Continue SPI operation regardless + SPI_EMULATION_FREE_RUN = 0x0010U, + //! Transmission will stop after a started transmission completes + SPI_EMULATION_STOP_AFTER_TRANSMIT = 0x0020U +} SPI_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setPTESignalPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + SPI_PTE_ACTIVE_LOW = 0x0000U, //!< SPIPTE is active low (normal) + SPI_PTE_ACTIVE_HIGH = SPI_PRI_PTEINV //!< SPIPTE is active high (inverted) +} SPI_PTEPolarity; + +//***************************************************************************** +// +//! Values that can be passed to SPI_receive16Bits(), SPI_receive24Bits(), +//! SPI_receive32Bits() +// +//***************************************************************************** +typedef enum +{ + SPI_DATA_LITTLE_ENDIAN = 0U, //!< LITTLE ENDIAN + SPI_DATA_BIG_ENDIAN = 1U, //!< BIG ENDIAN +} SPI_endianess; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an SPI base address. +//! +//! \param base specifies the SPI module base address. +//! +//! This function determines if a SPI module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SPI_isBaseValid(uint32_t base) +{ + return( + (base == SPIA_BASE) || + (base == SPIB_BASE) || + (base == SPIC_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! +//! This function enables operation of the serial peripheral interface. The +//! serial peripheral interface must be configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPISWRESET; +} + +//***************************************************************************** +// +//! Disables the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! +//! This function disables operation of the serial peripheral interface. Call +//! this function before doing any configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + HWREGH(base + SPI_O_CCR) &= ~(SPI_CCR_SPISWRESET); +} + +//***************************************************************************** +// +//! Sets the character length of SPI transaction +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the character length of SPI transaction +//! +//! This function configures the character length of SPI transaction. +//! SPI character length can be from anywhere between 1-bit word to 16 bit word +//! of character length +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setcharLength(uint32_t base, uint16_t charLength) +{ + // + // Check the arguments. + // + ASSERT((charLength >= 1U) && (charLength <= 16U)); + + bool originalStatus = ((HWREGH(base + SPI_O_CCR) & (SPI_CCR_SPISWRESET)) + == SPI_CCR_SPISWRESET ); + + SPI_disableModule(base); + HWREGH(base + SPI_O_CCR) = (HWREGH(base + SPI_O_CCR) & ~SPI_CCR_SPICHAR_M) | + (charLength - 1U); + // + // Restore original status + // + if(originalStatus){ + SPI_enableModule(base); + } +} + + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SPI port. +//! +//! This functions enables the transmit and receive FIFOs in the SPI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO; + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SPI port. +//! +//! This functions disables the transmit and receive FIFOs in the SPI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~(SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO); + HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the transmit FIFO. +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the transmit FIFO, setting the FIFO pointer back to +//! zero. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_resetTxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Reset the TX FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_TXFIFO; + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFIFO; +} + +//***************************************************************************** +// +//! Resets the receive FIFO. +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the receive FIFO, setting the FIFO pointer back to +//! zero. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_resetRxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Reset the RX FIFO. + // + HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Sets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the SPI port. +//! \param txLevel is the transmit FIFO interrupt level, specified as +//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, . . . or +//! \b SPI_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as +//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, . . . or +//! \b SPI_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel txLevel, + SPI_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + SPI_O_FFTX) = (HWREGH(base + SPI_O_FFTX) & + (~SPI_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + SPI_O_FFRX) = (HWREGH(base + SPI_O_FFRX) & + (~SPI_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the SPI port. +//! \param txLevel is a pointer to storage for the transmit FIFO level, +//! returned as one of \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, +//! \b SPI_FIFO_TX2, . . . or \b SPI_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO level, +//! returned as one of \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, +//! \b SPI_FIFO_RX2, . . . or \b SPI_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_getFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel *txLevel, + SPI_RxFIFOLevel *rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (SPI_TxFIFOLevel)((uint16_t)(HWREGH(base + SPI_O_FFTX) & + SPI_FFTX_TXFFIL_M)); + *rxLevel = (SPI_RxFIFOLevel)((uint16_t)(HWREGH(base + SPI_O_FFRX) & + SPI_FFRX_RXFFIL_M)); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the SPI port. +//! +//! This function gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, \b SPI_FIFO_TX3, +//! ..., or \b SPI_FIFO_TX16 +// +//***************************************************************************** +static inline SPI_TxFIFOLevel +SPI_getTxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SPI_TxFIFOLevel)((uint16_t)((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) >> + SPI_FFTX_TXFFST_S))); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the SPI port. +//! +//! This function gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, \b SPI_FIFO_RX3, +//! ..., or \b SPI_FIFO_RX16 +// +//***************************************************************************** +static inline SPI_RxFIFOLevel +SPI_getRxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SPI_RxFIFOLevel)((uint16_t)((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFST_M) >> + SPI_FFRX_RXFFST_S))); +} + +//***************************************************************************** +// +//! Determines whether the SPI transmitter is busy or not. +//! +//! \param base is the base address of the SPI port. +//! +//! This function allows the caller to determine whether all transmitted bytes +//! have cleared the transmitter hardware. If \b false is returned, then the +//! transmit FIFO is empty and all bits of the last transmitted word have left +//! the hardware shift register. This function is only valid when operating in +//! FIFO mode. +//! +//! \return Returns \b true if the SPI is transmitting or \b false if all +//! transmissions are complete. +// +//***************************************************************************** +static inline bool +SPI_isBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Determine if the SPI is busy. + // + return((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) != 0U); +} + +//***************************************************************************** +// +//! Puts a data element into the SPI transmit buffer. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Gets a data element from the SPI receive buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function gets received data from the receive buffer of the specified +//! SPI module and returns it. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataNonBlocking(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Waits for space in the FIFO and then puts data into the transmit buffer. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module once space is available in the transmit FIFO. This +//! function should only be used when the FIFO is enabled. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until space is available in the receive FIFO. + // + while(SPI_getTxFIFOStatus(base) == SPI_FIFO_TXFULL) + { + } + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits for data in the FIFO and then reads it from the receive buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function waits until there is data in the receive FIFO and then reads +//! received data from the receive buffer. This function should only be used +//! when FIFO mode is enabled. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataBlockingFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until data is available in the receive FIFO. + // + while(SPI_getRxFIFOStatus(base) == SPI_FIFO_RXEMPTY) + { + } + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Waits for the transmit buffer to empty and then writes data to it. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module once it is empty. This function should not be used +//! when FIFO mode is enabled. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataBlockingNonFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until the transmit buffer is not full. + // + while((HWREGH(base + SPI_O_STS) & SPI_STS_BUFFULL_FLAG) != 0U) + { + } + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits for data to be received and then reads it from the buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function waits for data to be received and then reads it from the +//! receive buffer of the specified SPI module. This function should not be +//! used when FIFO mode is enabled. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataBlockingNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until data has been received. + // + while((HWREGH(base + SPI_O_STS) & SPI_STS_INT_FLAG) == 0U) + { + } + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Enables SPI 3-wire mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables 3-wire mode. When in controller mode, this allows +//! SPIPICO to become SPICOCI and SPIPOCI to become free for non-SPI use. +//! When in peripheral mode, SPIPOCI because the SPIPIPO pin and SPIPICO is +//! free for non-SPI use. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableTriWire(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the tri-wire bit to enable 3-wire mode. + // + HWREGH(base + SPI_O_PRI) |= SPI_PRI_TRIWIRE; +} + +//***************************************************************************** +// +//! Disables SPI 3-wire mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables 3-wire mode. SPI will operate in normal 4-wire mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableTriWire(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the tri-wire bit to disable 3-wire mode. + // + HWREGH(base + SPI_O_PRI) &= ~SPI_PRI_TRIWIRE; +} + +//***************************************************************************** +// +//! Enables SPI loopback mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables loopback mode. This mode is only valid during +//! controller mode and is helpful during device testing as it internally +//! connects PICO and POCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the bit that enables loopback mode. + // + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPILBK; +} + +//***************************************************************************** +// +//! Disables SPI loopback mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables loopback mode. Loopback mode is disabled by default +//! after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the bit that enables loopback mode. + // + HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_SPILBK; +} + +//***************************************************************************** +// +//! Set the peripheral select (SPIPTE) signal polarity. +//! +//! \param base is the base address of the SPI port. +//! \param polarity is the SPIPTE signal polarity. +//! +//! This function sets the polarity of the peripheral select (SPIPTE) signal. +//! The two modes to choose from for the \e polarity parameter are +//! \b SPI_PTE_ACTIVE_LOW for active-low polarity (typical) and +//! \b SPI_PTE_ACTIVE_HIGH for active-high polarity (considered inverted). +//! +//! \note This has no effect on the PTE signal when in controller mode. It is +//! only applicable to peripheral mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setPTESignalPolarity(uint32_t base, SPI_PTEPolarity polarity) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write the polarity of the SPIPTE signal to the register. + // + HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & ~SPI_PRI_PTEINV) | + (uint16_t)polarity; +} + +//***************************************************************************** +// +//! Enables SPI high speed mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables high speed mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableHighSpeedMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the bit that enables high speed mode. + // + HWREGH(base + SPI_O_CCR) |= SPI_CCR_HS_MODE; +} + +//***************************************************************************** +// +//! Disables SPI high speed mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables high speed mode. High speed mode is disabled by +//! default after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableHighSpeedMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the bit that enables high speed mode. + // + HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_HS_MODE; +} + +//***************************************************************************** +// +//! Sets SPI emulation mode. +//! +//! \param base is the base address of the SPI port. +//! \param mode is the emulation mode. +//! +//! This function sets the behavior of the SPI operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b SPI_EMULATION_STOP_MIDWAY - Transmission stops midway through the bit +//! stream. The rest of the bits will be transmitting after the suspend is +//! deasserted. +//! - \b SPI_EMULATION_STOP_AFTER_TRANSMIT - If the suspend occurs before the +//! first SPICLK pulse, the transmission will not start. If it occurs later, +//! the transmission will be completed. +//! - \b SPI_EMULATION_FREE_RUN - SPI operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setEmulationMode(uint32_t base, SPI_EmulationMode mode) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write the desired emulation mode to the register. + // + HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & + ~(SPI_PRI_FREE | SPI_PRI_SOFT)) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Configures the FIFO Transmit Delay +//! +//! \param base is the base address of the SPI port. +//! \param delay Tx FIFO delay to be configured in cycles (0..0xFF) +//! +//! This function sets the delay between every transfer from FIFO +//! transmit buffer to transmit shift register. The delay is defined in +//! number SPI serial clock cycles. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_setTxFifoTransmitDelay(uint32_t base, uint16_t delay) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(delay <= 0xFFU); + + // + // Configure the FIFO Transmit Delay Bits + // + HWREGH(base + SPI_O_FFCT) = delay; +} + +//***************************************************************************** +// +//! Returns the Emulation Buffer Received Data +//! +//! \param base is the base address of the SPI port. +//! +//! This function returns the Emulation Buffer Received Data +//! +//! \return Rx emulation buffer data +// +//***************************************************************************** +static inline uint16_t +SPI_readRxEmulationBuffer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Return Emulation Buffer Received Data + // + return(HWREGH(base + SPI_O_RXEMU)); +} + +//***************************************************************************** +// +//! Enable Trasnmit +//! +//! \param base is the base address of the SPI port. +//! +//! This function sets the TALK bit enabling the data trasnmission. +//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as +//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_enableTalk(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the TALK bit + // + HWREGH(base + SPI_O_CTL) |= SPI_CTL_TALK; +} + +//***************************************************************************** +// +//! Disable Trasnmit +//! +//! \param base is the base address of the SPI port. +//! +//! This function clears the TALK bit disabling the data trasnmission. The +//! output pin will be put in high-impedance state. +//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as +//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_disableTalk(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the TALK bit + // + HWREGH(base + SPI_O_CTL) &= ~SPI_CTL_TALK; +} + +//***************************************************************************** +// +//! Reset SPI transmit and receive channels +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the SPI transmit and receive channels. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_reset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write to SPRST bit the TX FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_SPIRST; + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIRST; +} + +//***************************************************************************** +// +//! Configures the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! \param lspclkHz is the rate of the clock supplied to the SPI module +//! (LSPCLK) in Hz. +//! \param protocol specifies the data transfer protocol. +//! \param mode specifies the mode of operation. +//! \param bitRate specifies the clock rate in Hz. +//! \param dataWidth specifies number of bits transferred per frame. +//! +//! This function configures the serial peripheral interface. It sets the SPI +//! protocol, mode of operation, bit rate, and data width. +//! +//! The \e protocol parameter defines the data frame format. The \e protocol +//! parameter can be one of the following values: \b SPI_PROT_POL0PHA0, +//! \b SPI_PROT_POL0PHA1, \b SPI_PROT_POL1PHA0, or +//! \b SPI_PROT_POL1PHA1. These frame formats encode the following polarity +//! and phase configurations: +//! +//!

    +//! Polarity Phase       Mode
    +//!   0       0   SPI_PROT_POL0PHA0
    +//!   0       1   SPI_PROT_POL0PHA1
    +//!   1       0   SPI_PROT_POL1PHA0
    +//!   1       1   SPI_PROT_POL1PHA1
    +//! 
    +//! +//! The \e mode parameter defines the operating mode of the SPI module. The +//! SPI module can operate as a controller or peripheral; the SPI can also be be +//! configured to disable output on its serial output line. The \e mode +//! parameter can be one of the following values: \b SPI_MODE_CONTROLLER, +//! \b SPI_MODE_PERIPHERAL, \b SPI_MODE_CONTROLLER_OD or +//! \b SPI_MODE_PERIPHERAL_OD ("OD" indicates "output disabled"). +//! +//! The \e bitRate parameter defines the bit rate for the SPI. This bit rate +//! must satisfy the following clock ratio criteria: +//! +//! - \e bitRate can be no greater than lspclkHz divided by 4. +//! - \e lspclkHz / \e bitRate cannot be greater than 128. +//! +//! The \e dataWidth parameter defines the width of the data transfers and +//! can be a value between 1 and 16, inclusive. +//! +//! The peripheral clock is the low speed peripheral clock. This value is +//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded +//! if it is constant and known (to save the code/execution overhead of a call +//! to SysCtl_getLowSpeedClock()). +//! +//! \note SPI operation should be disabled via SPI_disableModule() before any +//! changes to its configuration. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol, + SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth); + +//***************************************************************************** +// +//! Configures the baud rate of the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! \param lspclkHz is the rate of the clock supplied to the SPI module +//! (LSPCLK) in Hz. +//! \param bitRate specifies the clock rate in Hz. +//! +//! This function configures the SPI baud rate. The \e bitRate parameter +//! defines the bit rate for the SPI. This bit rate must satisfy the following +//! clock ratio criteria: +//! +//! - \e bitRate can be no greater than \e lspclkHz divided by 4. +//! - \e lspclkHz / \e bitRate cannot be greater than 128. +//! +//! The peripheral clock is the low speed peripheral clock. This value is +//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded +//! if it is constant and known (to save the code/execution overhead of a call +//! to SysCtl_getLowSpeedClock()). +//! +//! \note SPI_setConfig() also sets the baud rate. Use SPI_setBaudRate() +//! if you wish to configure it separately from protocol and mode. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate); + +//***************************************************************************** +// +//! Enables individual SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated SPI interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. The \e intFlags parameter can be +//! any of the following values: +//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt +//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty +//! - \b SPI_INT_RXFF (also enables \b SPI_INT_RXFF_OVERFLOW) - RX FIFO level +//! interrupt (and RX FIFO overflow) +//! - \b SPI_INT_TXFF - TX FIFO level interrupt +//! +//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables individual SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! +//! This function disables the indicated SPI interrupt sources. The +//! \e intFlags parameter can be any of the following values: +//! - \b SPI_INT_RX_OVERRUN +//! - \b SPI_INT_RX_DATA_TX_EMPTY +//! - \b SPI_INT_RXFF (also disables \b SPI_INT_RXFF_OVERFLOW) +//! - \b SPI_INT_TXFF +//! +//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base specifies the SPI module base address. +//! +//! This function returns the interrupt status for the SPI module. +//! +//! \return The current interrupt status, enumerated as a bit field of the +//! following values: +//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt +//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty +//! - \b SPI_INT_RXFF - RX FIFO level interrupt +//! - \b SPI_INT_RXFF_OVERFLOW - RX FIFO overflow +//! - \b SPI_INT_TXFF - TX FIFO level interrupt +// +//***************************************************************************** +extern uint32_t +SPI_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! This function clears the specified SPI interrupt sources so that they no +//! longer assert. This function must be called in the interrupt handler to +//! keep the interrupts from being triggered again immediately upon exit. The +//! \e intFlags parameter can consist of a bit field of the following values: +//! - \b SPI_INT_RX_OVERRUN +//! - \b SPI_INT_RX_DATA_TX_EMPTY +//! - \b SPI_INT_RXFF +//! - \b SPI_INT_RXFF_OVERFLOW +//! - \b SPI_INT_TXFF +//! +//! \note \b SPI_INT_RX_DATA_TX_EMPTY is cleared by a read of the receive +//! receive buffer, so it usually doesn't need to be cleared using this +//! function. +//! +//! \note Also note that \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags); + + +//***************************************************************************** +// +//! This function can be used to transmit a 24-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit a 24-bit word of data. +//! 24-bit word data is divided into three bytes of data. +//! +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay); + +//***************************************************************************** +// +//! This function can be used to transmit a 32-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit a 32-bit word of data. +//! 32-bit word data is divided into four bytes of data. +//! +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay); + + + +//***************************************************************************** +// +//! This function is used to receive a 16-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 16-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 16-bit word. +// +//***************************************************************************** +extern uint16_t +SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + +//***************************************************************************** +// +//! This function is used to receive a 24-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 24-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 24-bit word. +// +//***************************************************************************** +extern uint32_t +SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + +//***************************************************************************** +// +//! This function is used to receive a 32-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 32-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 32-bit word. +// +//***************************************************************************** +extern uint32_t +SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + + + +//***************************************************************************** +// +//! This function is used to initiate SPI transaction of specified character +//! length +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param data specified the data to be transmitted +//! +//! The SPI must be configured to the provided charLength BEFORE the function +//! is called. This function does not set/change the SPI char length. +//! +//! \return . +// +//***************************************************************************** +extern uint16_t +SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t data); + +//***************************************************************************** +// +//! This function is used to initiate SPI transaction of specified character +//! length and 'N' words of transaction +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param pTxBuffer specifies the pointer to transmit buffer +//! \param pRxBuffer specifies the pointer to receive buffer +//! \param numOfWords specified the number of data to be transmitted / received +//! +//! The SPI must be configured to the provided charLength BEFORE the function +//! is called. This function does not set/change the SPI char length. +//! +//! \return none +// +//***************************************************************************** +extern void +SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t *pTxBuffer, uint16_t *pRxBuffer, + uint16_t numOfWords, uint16_t txDelay); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SPI_H diff --git a/gpio_bitfield_cpu2/device/driverlib/sysctl.c b/gpio_bitfield_cpu2/device/driverlib/sysctl.c new file mode 100644 index 0000000..f4708f2 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sysctl.c @@ -0,0 +1,1469 @@ +//########################################################################### +// +// FILE: sysctl.c +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cputimer.h" +#include "sysctl.h" + +// +// Define to isolate inline assembly +// +#define SYSCTL_DELAY __asm(" .if __TI_EABI__\n" \ + " .asg SysCtl_delay , _SysCtl_delay\n" \ + " .endif\n" \ + " .def _SysCtl_delay\n" \ + " .sect \".TI.ramfunc\"\n" \ + " .global _SysCtl_delay\n" \ + "_SysCtl_delay:\n" \ + " SUB ACC,#1\n" \ + " BF _SysCtl_delay, GEQ\n" \ + " LRETR\n") +#define SYSCTL_CLRC_DBGM __asm(" CLRC DBGM") + +// +// Define Timer1 and Timer2 seed values +// +#define TMR1SYSCLKCTR 0xF0000000U +#define TMR2INPCLKCTR 0x800U + +#define XTAL_CPUTIMER_PERIOD 1023U + +//***************************************************************************** +// +// SysCtl_delay() +// +//***************************************************************************** +SYSCTL_DELAY; + + +static void +SysCtl_pollCpuTimer(void) +{ + // + // Delay for 1 ms while the XTAL powers up + // + // 2000 loops, 5 cycles per loop + 9 cycles overhead = 10009 cycles + // + SysCtl_delay(2000); + + // + // Wait for cpu timer 2 to overflow + // + while(CPUTimer_getTimerOverflowStatus(CPUTIMER2_BASE) == false); + { + // + // If your application is stuck in this loop, please check if the + // input clock source is valid. + // + } + + // + // Clear cpu timer 2 overflow flag + // + CPUTimer_clearOverflowFlag(CPUTIMER2_BASE); +} + +//***************************************************************************** +// +// SysCtl_getClock() +// +//***************************************************************************** +uint32_t +SysCtl_getClock(uint32_t clockInHz) +{ + uint32_t temp; + uint32_t oscSource; + uint32_t clockOut; + + // + // Don't proceed if an MCD failure is detected. + // + if(SysCtl_isMCDClockFailureDetected()) + { + // + // OSCCLKSRC2 failure detected. Returning the INTOSC1 rate. You need + // to handle the MCD and clear the failure. + // + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + // + // If one of the internal oscillators is being used, start from the + // known default frequency. Otherwise, use clockInHz parameter. + // + oscSource = HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (uint32_t)SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M; + + if((oscSource == (SYSCTL_OSCSRC_OSC2 >> SYSCTL_OSCSRC_S)) || + (oscSource == (SYSCTL_OSCSRC_OSC1 >> SYSCTL_OSCSRC_S))) + { + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + clockOut = clockInHz; + } + + // + // If the PLL is enabled calculate its effect on the clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) & + (SYSCTL_SYSPLLCTL1_PLLEN | SYSCTL_SYSPLLCTL1_PLLCLKEN)) == 3U) + { + // + // Calculate portion from fractional multiplier + // + temp = (clockInHz * ((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) & + SYSCTL_SYSPLLMULT_FMULT_M) >> + SYSCTL_SYSPLLMULT_FMULT_S)) / 4U; + + // + // Calculate integer multiplier and fixed divide by 2 + // + clockOut = clockOut * ((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) & + SYSCTL_SYSPLLMULT_IMULT_M) >> + SYSCTL_SYSPLLMULT_IMULT_S); + + // + // Add in fractional portion + // + clockOut += temp; + } + + if((HWREG(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) != 0U) + { + clockOut /= (2U * (HWREG(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M)); + } + } + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_getAuxClock() +// +//***************************************************************************** +uint32_t SysCtl_getAuxClock(uint32_t clockInHz) +{ + uint32_t temp; + uint32_t oscSource; + uint32_t clockOut; + + oscSource = HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + (uint32_t)SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M; + + // + // If one of the internal oscillators is being used, start from the + // known default frequency. Otherwise, use clockInHz parameter. + // + if(oscSource == (SYSCTL_AUXPLL_OSCSRC_OSC2 >> SYSCTL_OSCSRC_S)) + { + // + // 10MHz Internal Clock + // + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + clockOut = clockInHz; + } + + // + // If the PLL is enabled calculate its effect on the clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) & + (SYSCTL_AUXPLLCTL1_PLLEN | SYSCTL_AUXPLLCTL1_PLLCLKEN)) == 3U) + { + // + // Calculate portion from fractional multiplier + // + temp = (clockInHz * ((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_FMULT_M) >> + SYSCTL_AUXPLLMULT_FMULT_S)) / 4U; + + // + // Calculate integer multiplier + // + clockOut = clockOut * ((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_IMULT_M) >> + SYSCTL_AUXPLLMULT_IMULT_S); + + // + // Add in fractional portion + // + clockOut += temp; + } + + clockOut /= (1U << (HWREG(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) & + SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M)); + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_setClock() +// +//***************************************************************************** +bool +SysCtl_setClock(uint32_t config) +{ + uint16_t divSel; + uint16_t iMult = 0U, fMult = 0U, pllMult = 0U, div; + bool status, sysclkInvalidFreq = true; + uint16_t i, tempSCSR, tempWDCR, tempWDWCR, intStatus; + uint16_t t1TCR, t1TPR, t1TPRH, t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t1PRD, t2PRD, ctr1; + float32_t sysclkToInClkError, mult; + + // + // Check the arguments. + // + ASSERT((config & SYSCTL_OSCSRC_M) != SYSCTL_OSCSRC_M); // 3 is not valid + + // + // Don't proceed to the PLL initialization if an MCD failure is detected. + // + if(SysCtl_isMCDClockFailureDetected()) + { + // + // OSCCLKSRC2 failure detected. Returning false. You'll need to clear + // the MCD error. + // + status = false; + } + else + { + // + // Configure oscillator source + // + SysCtl_selectOscSource(config & SYSCTL_OSCSRC_M); + + // + // Bypass PLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLCLKEN; + EDIS; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Configure PLL if enabled + // + EALLOW; + if((config & SYSCTL_PLL_ENABLE) == SYSCTL_PLL_ENABLE) + { + if((HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) & + SYSCTL_SYSDBGCTL_BIT_0) != 0U) + { + // + // The user can optionally insert handler code here. This will + // only be executed if a watchdog reset occurred after a failed + // system PLL initialization. See your device user's guide for + // more information. + // + // If the application has a watchdog reset handler, this bit + // should be checked to determine if the watchdog reset + // occurred because of the PLL. + // + // No action here will continue with retrying the PLL as + // normal. + // + } + + // + // Set dividers to /1 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = 0U; + + // + // Get the PLL multiplier settings from config + // + iMult |= (uint16_t)(config & SYSCTL_IMULT_M); + fMult |= (uint16_t)((config & SYSCTL_FMULT_M) >> SYSCTL_FMULT_S); + pllMult |= (iMult << SYSCTL_SYSPLLMULT_IMULT_S) | + (fMult << SYSCTL_SYSPLLMULT_FMULT_S); + + // + // Lock the PLL five times. This helps ensure a successful start. + // Five is the minimum recommended number. The user can increase + // this number according to allotted system initialization time. + // + for(i = 0U; i < 5U; i++) + { + // + // Turn off PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLEN; + + asm(" RPT #60 || NOP"); + + // + // Write multiplier, which automatically turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) = pllMult; + + // + // Wait for the SYSPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_LOCKS) == 0U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + } + } + + // + // Configure Dividers. Set divider to produce slower output frequency + // to limit current increase. + // + divSel = (uint16_t)(config & SYSCTL_SYSDIV_M) >> SYSCTL_SYSDIV_S; + + if(divSel != (126U / 2U)) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(uint16_t)SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | (divSel + 1U); + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(uint16_t)SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | divSel; + } + + // + // *CAUTION* + // It is recommended to use the following watchdog code to monitor the + // PLLstartup sequence. If your application has already cleared the + // watchdog SCRS[WDOVERRIDE] bit this cannot be done. It is recommended + // not to clear this bit until after the PLL has been initiated. + // + + // + // Backup User Watchdog + // + tempSCSR = HWREGH(WD_BASE + SYSCTL_O_SCSR); + tempWDCR = HWREGH(WD_BASE + SYSCTL_O_WDCR); + tempWDWCR = HWREGH(WD_BASE + SYSCTL_O_WDWCR); + + // + // Disable windowed functionality, reset counter + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) = 0x0U; + SysCtl_serviceWatchdog(); + + // + // Disable global interrupts + // + intStatus = __disable_interrupts(); + + // + // Configure for watchdog reset and to run at max frequency + // + EALLOW; + HWREGH(WD_BASE + SYSCTL_O_SCSR) = 0x0U; + HWREGH(WD_BASE + SYSCTL_O_WDCR) = SYSCTL_WD_CHKBITS; + + // + // This bit is reset only by power-on-reset (POR) and will not be + // cleared by a WD reset + // + HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) |= SYSCTL_SYSDBGCTL_BIT_0; + + // + // Enable PLLSYSCLK is fed from system PLL clock + // + HWREGH(CLKCFG_BASE + + SYSCTL_O_SYSPLLCTL1) |= SYSCTL_SYSPLLCTL1_PLLCLKEN; + + EDIS; + + // + // Delay to ensure system is clocking from PLL prior to clearing + // status bit + // + SysCtl_delay(3U); + + // + // Slip Bit Monitor and SYSCLK Frequency Check using timers + // Re-lock routine for SLIP condition or if SYSCLK and CLKSRC timer + // counts are off by +/- 10%. At a minimum, SYSCLK check is performed. + // Re-lock attempt is carried out if SLIPS bit is set. + // This while loop is monitored by watchdog. + // In the event that the PLL does not successfully lock, the loop will + // be aborted by watchdog reset. + // + while(((config & SYSCTL_PLL_ENABLE) == SYSCTL_PLL_ENABLE) && + (sysclkInvalidFreq == true)) + { + EALLOW; + + // + // Perform PLL re-lock only if SLIPS bit is set, otherwise monitor + // SYSCLK frequency with timers + // + if((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_SLIPS) == 1U) + { + // + // Bypass PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLCLKEN; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Turn off PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLEN; + + SysCtl_delay(12U); + + // + // Write multiplier, which automatically turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) |= pllMult; + + // + // Wait for the SYSPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_LOCKS) == 0U) + { + ; + } + + // + // Enable PLLSYSCLK is fed from system PLL clock + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) |= + SYSCTL_SYSPLLCTL1_PLLCLKEN; + + // + // Delay to ensure system is clocking from PLL prior to + // clearing status bit + // + SysCtl_delay(12U); + } + + // + // Backup timer1 and timer2 settings + // + t1TCR = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR); + t1PRD = HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD); + t1TPR = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPR); + t1TPRH = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPRH); + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Set up timers 1 and 2 + // Configure timer1 to count SYSCLK cycles + // + + // + // Stop timer 1 + // Seed timer1 counter + // Set sysclock divider + // Reload timer with value in PRD + // Clear interrupt flag + // Enable interrupt + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD) = (uint32_t)TMR1SYSCLKCTR; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIE; + + // + // Configure timer2 to count Input clock cycles + // + switch (config & SYSCTL_OSCSRC_M) + { + case SYSCTL_OSCSRC_OSC1: + // + // Clk Src = INT_OSC1 + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 1U; + break; + + case SYSCTL_OSCSRC_OSC2: + // + // Clk Src = INT_OSC2 + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 2U; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Clk Src = XTAL + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 3U; + break; + + default: + // + // Do nothing. Not a valid clock source value. + // + break; + } + + // + // Clear interrupt flag + // Enable interrupt + // Stop timer 2 + // Seed timer2 counter + // Set sysclock divider + // Reload timer with value in PRD + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIE; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = (uint32_t)TMR2INPCLKCTR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + + // + // Stop/Start timer counters + // + + // + // Stop timer 1 + // Stop timer 2 + // Reload timer1 with value in PRD + // Reload timer2 with value in PRD + // Clear timer2 interrupt flag + // Start timer2 + // Start timer1 + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + + // + // Wait for Timers - Stop if either timer overflows + // + while(((HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) == 0U) && + ((HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) == 0U)) + { + ; + } + + // + // Stop timer 1 and 2 + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + + // + // Calculate elapsed counts on timer1 + // + ctr1 = (uint32_t)TMR1SYSCLKCTR - HWREG(CPUTIMER1_BASE + + CPUTIMER_O_TIM); + + // + // Restore timer settings + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) = t1TCR; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD) = t1PRD; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPR) = t1TPR; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPRH) = t1TPRH; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + + // + // Calculate Clock Error: + // Error = (mult/div) - (timer1 count/timer2 count) + // + mult = (float32_t)iMult + ((float32_t)fMult / 4.0F); + + if((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & 0x3FU) == 0U) + { + div = 1U; + } + else + { + div = (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + 0x3FU) << 1; + } + + sysclkToInClkError = (mult / (float32_t)div) - + ((float32_t)ctr1 / (float32_t)TMR2INPCLKCTR); + + // + // sysclkInvalidFreq will be set to true if sysclkToInClkError is + // off by 10% + // + sysclkInvalidFreq = ((sysclkToInClkError > 0.10F) || + (sysclkToInClkError < -0.10F)); + + EDIS; + } + + // + // Clear bit + // + EALLOW; + HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) &= ~SYSCTL_SYSDBGCTL_BIT_0; + EDIS; + + // + // Restore user watchdog, first resetting counter + // + SysCtl_serviceWatchdog(); + + // + // Set the KEY bits and make sure not to set the WDOVERRIDE bit + // + EALLOW; + HWREGH(WD_BASE + SYSCTL_O_WDCR) = tempWDCR | SYSCTL_WD_CHKBITS; + HWREGH(WD_BASE + SYSCTL_O_WDWCR) = tempWDWCR; + HWREGH(WD_BASE + SYSCTL_O_SCSR) = tempSCSR & ~SYSCTL_SCSR_WDOVERRIDE; + EDIS; + + // + // Restore state of ST1[INTM]. This was set by the + // __disable_interrupts() intrinsic previously. + // + if((intStatus & 0x1U) == 0U) + { + EINT; + } + + // + // Restore state of ST1[DBGM]. This was set by the + // __disable_interrupts() intrinsic previously. + // + if((intStatus & 0x2U) == 0U) + { + SYSCTL_CLRC_DBGM; + } + + // + // ~200 PLLSYSCLK delay to allow voltage regulator to stabilize prior + // to increasing entire system clock frequency. + // + SysCtl_delay(40U); + + // + // Set the divider to user value + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | divSel; + SYSCTL_REGWRITE_DELAY; + EDIS; + + status = true; + } + + return(status); +} +//***************************************************************************** +// +// SysCtl_setAuxClock() +// +//***************************************************************************** +void SysCtl_setAuxClock(uint32_t config) +{ + uint16_t pllMult = 0U; + uint16_t counter = 0U, started = 0U, attempts = 0U; + uint16_t mult; + uint16_t i, t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t2PRD; + + // + // Check the arguments + // + ASSERT((config & SYSCTL_OSCSRC_M) != SYSCTL_OSCSRC_M); // 3 is not valid + + // + // Bypass PLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLCLKEN; + EDIS; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Configure oscillator source + // + SysCtl_selectOscSourceAuxPLL(config & SYSCTL_OSCSRC_M); + + // + // Get the PLL multiplier settings from config + // + pllMult |= (uint16_t)((config & SYSCTL_IMULT_M) << + SYSCTL_AUXPLLMULT_IMULT_S); + pllMult |= (uint16_t)(((config & SYSCTL_FMULT_M) >> SYSCTL_FMULT_S) << + SYSCTL_AUXPLLMULT_FMULT_S); + + // + // Get the PLL multipliers currently programmed + // + mult = (uint16_t)((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + (uint32_t)SYSCTL_AUXPLLMULT_IMULT_M) >> + (uint32_t)SYSCTL_AUXPLLMULT_IMULT_S); + mult |= (uint16_t)(HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_FMULT_M); + + // + // Lock PLL only if the multipliers need update + // + if(mult != pllMult) + { + + // + // Configure PLL if enabled + // + if((config & SYSCTL_AUXPLL_ENABLE) == SYSCTL_AUXPLL_ENABLE) + { + // + // Backup Timer 2 settings + // + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Configure Timer 2 for AUXPLL as source in known configuration + // - Clock source to AUXPLL + // - Clock divider to divide by 1 + // - Small period to detect overflow + // - Interrupt disabled + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = 6U; + + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = 10U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TIE; + + // + // Set AUX Divide by 8 to ensure that AUXPLLCLK <= SYSCLK / 2 + // while using Timer 2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = 0x3U; + SYSCTL_REGWRITE_DELAY; + EDIS; + + // + // Lock the PLL up to five times. + //CPU Timer 2 will monitor a successful + // lock and break out of the loop earlier if detected. + // + while((counter < 5U) && (started == 0U)) + { + EALLOW; + + // + // Turn off AUXPLL and delay for it to power down. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= + ~SYSCTL_AUXPLLCTL1_PLLEN; + SysCtl_delay(3U); + + // + // Set integer and fractional multiplier, which automatically + // turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) |= pllMult; + SYSCTL_REGWRITE_DELAY; + + // + // Enable AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= + SYSCTL_AUXPLLCTL1_PLLEN; + EDIS; + + // + // Wait for the AUXPLL lock counter + // + + while((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_LOCKS) != 1U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + + + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= + SYSCTL_AUXPLLCTL1_PLLCLKEN; + SysCtl_delay(3U); + + // + // CPU Timer 2 will now be setup to be clocked from AUXPLLCLK. + // This is used to test that the PLL has successfully started. + // + // Reload and start the timer + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + + // + // Check to see timer is counting properly + // + for(i = 0U; i < 1000U; i++) + { + // + // Check overflow flag + // + if((HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) != 0U) + { + // + // Clear overflow flag + // + HWREGH(CPUTIMER2_BASE + + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + + // + // Set flag to indicate PLL started and break out of + // for-loop + // + started = 1U; + break; + } + } + + // + // Stop timer + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + counter++; + EDIS; + } + + if(started == 0U) + { + // + // AUX PLL may not have started. Reset multiplier to 0 (bypass + // PLL). + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) = 0U; + EDIS; + + // + // The user should put some handler code here based on how + // this condition should be handled in their application. + // + ESTOP0; + } + + // + // Restore Timer 2 configuration + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + + // + // Reload period value + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + EDIS; + } + } + else + { + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLCLKEN; + SysCtl_delay(3U); + EDIS; + } + + // + // Slip Bit Monitor + // Re-lock routine for SLIP condition + // + while(((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_SLIPS) != 0U) && (attempts < 10U) && + ((config & SYSCTL_AUXPLL_ENABLE) == SYSCTL_AUXPLL_ENABLE)) + { + EALLOW; + + // + // Bypass AUXPLL + // + HWREGH(CLKCFG_BASE + + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLCLKEN; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Turn off AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLEN; + SysCtl_delay(3U); + + // + // Set integer and fractional multiplier, which automatically turns + // on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) |= pllMult; + + // + // Enable AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLEN; + + // + // Wait for the AUXPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_LOCKS) != 1U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLCLKEN; + + SysCtl_delay(3U); + + attempts++; + + EDIS; + } + + // + // Set divider to desired value + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = + (uint16_t)(config & SYSCTL_SYSDIV_M) >> SYSCTL_SYSDIV_S; + SYSCTL_REGWRITE_DELAY; + EDIS; + +} + + +//***************************************************************************** +// +// SysCtl_selectXTAL() +// +//***************************************************************************** +void +SysCtl_selectXTAL(void) +{ + uint16_t t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t2PRD; + + // + // Backup CPU timer2 settings + // + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Backup AUX clock settings + // + uint16_t clksrcctl2 = HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2); + uint16_t auxpllctl1 = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1); + uint16_t auxclkdivsel = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL); + + // + // Set AUX clock source to XTAL, bypass mode. + // AUXCLK is used as the CPUTimer Clock source. SYSCLK frequency must be + // atleast twice the frequency of AUXCLK. SYSCLK = INTOSC2(10MHz) + // Set the AUX divider to 8. The above condition will be met for XTAL + // frequencies up to 40MHz + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (1U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = 0x0U; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = SYSCTL_AUXPLLCLK_DIV_8; + SYSCTL_REGWRITE_DELAY; + + + // + // Disable cpu timer 2 interrupt + // + CPUTimer_disableInterrupt(CPUTIMER2_BASE); + + // + // Stop cpu timer 2 if running + // + CPUTimer_stopTimer(CPUTIMER2_BASE); + + // + // Initialize cpu timer 2 period + // + CPUTimer_setPeriod(CPUTIMER2_BASE, XTAL_CPUTIMER_PERIOD); + + // + // Set cpu timer 2 clock source to XTAL + // + CPUTimer_selectClockSource(CPUTIMER2_BASE, CPUTIMER_CLOCK_SOURCE_AUX, + CPUTIMER_CLOCK_PRESCALER_1); + + // + // Clear cpu timer 2 overflow flag + // + CPUTimer_clearOverflowFlag(CPUTIMER2_BASE); + + // + // Start cpu timer 2 + // + CPUTimer_startTimer(CPUTIMER2_BASE); + + EALLOW; + // + // Turn on XTAL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= ~SYSCTL_CLKSRCCTL1_XTALOFF; + EDIS; + + // + // Wait for the X1 clock to overflow cpu timer 2 + // + SysCtl_pollCpuTimer(); + + // + // Select XTAL as the oscillator source + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) | + (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S)); + EDIS; + + // + // If a missing clock failure was detected, try waiting for the cpu timer 2 + // to overflow again. + // + while(SysCtl_isMCDClockFailureDetected()) + { + // + // Clear the MCD failure + // + SysCtl_resetMCD(); + + // + // Wait for the X1 clock to overflow cpu timer 2 + // + SysCtl_pollCpuTimer(); + + // + // Select XTAL as the oscillator source + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) | + (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S)); + EDIS; + } + + // + // Stop cpu timer 2 + // + CPUTimer_stopTimer(CPUTIMER2_BASE); + + // + // Restore Timer 2 configuration + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + + // + // Restore AUX clock settings + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = clksrcctl2; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = auxpllctl1; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = auxclkdivsel; + SYSCTL_REGWRITE_DELAY; + EDIS; + + EDIS; +} + +//***************************************************************************** +// +// SysCtl_selectOscSource() +// +//***************************************************************************** +void +SysCtl_selectOscSource(uint32_t oscSource) +{ + ASSERT((oscSource == SYSCTL_OSCSRC_OSC1) || + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL)); + + // + // Select the specified source. + // + EALLOW; + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_INTOSC2OFF; + + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M; + + SYSCTL_CLKSRCCTL_DELAY; + + // + // Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Select XTAL in crystal mode and wait for it to power up + // + SysCtl_selectXTAL(); + break; + + case SYSCTL_OSCSRC_OSC1: + // + // Clk Src = INTOSC1 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + ~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M) | + (SYSCTL_OSCSRC_OSC1 >> SYSCTL_OSCSRC_S); + + SYSCTL_CLKSRCCTL_DELAY; + + // + //Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// SysCtl_selectOscSourceAuxPLL() +// +//***************************************************************************** +void +SysCtl_selectOscSourceAuxPLL(uint32_t oscSource) +{ + bool status = false; + + EALLOW; + + switch(oscSource) + { + case SYSCTL_AUXPLL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~(SYSCTL_CLKSRCCTL1_INTOSC2OFF); + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &= + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M); + break; + + case SYSCTL_AUXPLL_OSCSRC_XTAL: + // + // Turn on XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~(SYSCTL_CLKSRCCTL1_XTALOFF); + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = XTAL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (1U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + break; + + case SYSCTL_AUXPLL_OSCSRC_AUXCLKIN: + // + // Clk Src = AUXCLKIN + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (2U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + SYSCTL_CLKSRCCTL_DELAY; + break; + + default: + // + // Do nothing. Not a valid clock source value. + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// SysCtl_getLowSpeedClock() +// +//***************************************************************************** +uint32_t +SysCtl_getLowSpeedClock(uint32_t clockInHz) +{ + uint32_t clockOut; + + // + // Get the main system clock + // + clockOut = SysCtl_getClock(clockInHz); + + // + // Apply the divider to the main clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + SYSCTL_LOSPCP_LSPCLKDIV_M) != 0U) + { + clockOut /= (2U * (HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + SYSCTL_LOSPCP_LSPCLKDIV_M)); + } + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_getDeviceParametric() +// +//***************************************************************************** +uint16_t +SysCtl_getDeviceParametric(SysCtl_DeviceParametric parametric) +{ + uint32_t value; + + // + // Get requested parametric value + // + switch(parametric) + { + case SYSCTL_DEVICE_QUAL: + // + // Qualification Status + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_QUAL_M) >> SYSCTL_PARTIDL_QUAL_S); + break; + + case SYSCTL_DEVICE_PINCOUNT: + // + // Pin Count + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_PIN_COUNT_M) >> + SYSCTL_PARTIDL_PIN_COUNT_S); + break; + + case SYSCTL_DEVICE_INSTASPIN: + // + // InstaSPIN Feature Set + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_INSTASPIN_M) >> + SYSCTL_PARTIDL_INSTASPIN_S); + break; + + case SYSCTL_DEVICE_FLASH: + // + // Flash Size (KB) + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_FLASH_SIZE_M) >> + SYSCTL_PARTIDL_FLASH_SIZE_S); + break; + + case SYSCTL_DEVICE_PARTID: + // + // PARTID Format Revision + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_M) >> + SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_S); + break; + + case SYSCTL_DEVICE_FAMILY: + // + // Device Family + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_FAMILY_M) >> SYSCTL_PARTIDH_FAMILY_S); + break; + + case SYSCTL_DEVICE_PARTNO: + // + // Part Number + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_PARTNO_M) >> SYSCTL_PARTIDH_PARTNO_S); + break; + + case SYSCTL_DEVICE_CLASSID: + // + // Class ID + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_DEVICE_CLASS_ID_M) >> + SYSCTL_PARTIDH_DEVICE_CLASS_ID_S); + break; + + default: + // + // Not a valid value for PARTID register + // + value = 0U; + break; + } + + return((uint16_t)value); +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/sysctl.h b/gpio_bitfield_cpu2/device/driverlib/sysctl.h new file mode 100644 index 0000000..8b263eb --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/sysctl.h @@ -0,0 +1,3531 @@ +//########################################################################### +// +// FILE: sysctl.h +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SYSCTL_H +#define SYSCTL_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sysctl_api SysCtl +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_nmi.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_otp.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" + + +// +// Macro used for adding delay between 2 consecutive writes to CLKSRCCTL1 +// register. +// Delay = 300 NOPs +// +#define SYSCTL_CLKSRCCTL_DELAY asm(" RPT #250 || NOP \n RPT #50 || NOP") + +// +// Macro used for adding delay between 2 consecutive writes to memory mapped +// register in System control +// Total delay = 3 * (DEVICE_SYSCLK_FREQ / INTOSC1 Freq) + 9 +// +#define SYSCTL_REGWRITE_DELAY asm(" RPT #69 || NOP") + +//***************************************************************************** +// +// Defines for system control functions. Not intended for use by application +// code. +// +//***************************************************************************** + +// +// Shifted pattern for WDCR register's WDCHK field. +// +#define SYSCTL_WD_CHKBITS 0x0028U + +// +// Keys for WDKEY field. The first enables resets and the second resets. +// +#define SYSCTL_WD_ENRSTKEY 0x0055U +#define SYSCTL_WD_RSTKEY 0x00AAU + +// +// Values to help decode peripheral parameter +// +#define SYSCTL_PERIPH_REG_M 0x001FU +#define SYSCTL_PERIPH_REG_S 0x0000U +#define SYSCTL_PERIPH_BIT_M 0x1F00U +#define SYSCTL_PERIPH_BIT_S 0x0008U + +// +//Keys for the System control registers write protection +// +#define SYSCTL_REG_KEY 0xA5A50000U +#define SYSCTL_PLL_KEY 0XCAFE0000U + +// +//Values to help access shifting of bits +// +#define SYSCTL_TYPE_LOCK_S 0xFU + + +// +// LPM defines for LPMCR.LPM +// +#define SYSCTL_LPM_IDLE 0x0000U +#define SYSCTL_LPM_STANDBY 0x0001U +#define SYSCTL_LPM_HALT 0x0002U +#define SYSCTL_LPM_HIB 0x0003U + +// +// Bit shift for DAC to configure the CPUSEL register +// +#define SYSCTL_CPUSEL_DAC_S 0x10U + +// +// Default internal oscillator frequency, 10 MHz +// +#define SYSCTL_DEFAULT_OSC_FREQ 10000000U + +// +// Mask for SYNCSELECT.SYNCIN +// +#define SYSCTL_SYNCSELECT_SYNCIN_M SYSCTL_SYNCSELECT_EPWM4SYNCIN_M + +// +// Boot ROM Booting and Reset Status +// +#if defined(CPU2) +#define SYSCTL_BOOT_ROM_STATUS 0x0002U +#else +#define SYSCTL_BOOT_ROM_STATUS 0x002CU +#endif +#define SYSCTL_BOOT_ROM_POR 0x8000U +#define SYSCTL_BOOT_ROM_XRS 0x4000U + +#define SYSCTL_DEVICECAL_CONTEXT_SAVE asm(" PUSH ACC \n\ + PUSH DP \n\ + PUSH XAR0 \n\ + PUSH XAR2 \n\ + PUSH XAR3 \n\ + PUSH XAR4 \n\ + PUSH XAR5 \n\ + ") + +#define SYSCTL_DEVICECAL_CONTEXT_RESTORE asm(" POP XAR5 \n\ + POP XAR4 \n\ + POP XAR3 \n\ + POP XAR2 \n\ + POP XAR0 \n\ + POP DP \n\ + POP ACC \n\ + ") + +// +// Device_cal function which is available in OTP memory +// This function is called in SysCtl_resetPeripheral after resetting +// analog peripherals +// +#define Device_cal ((void (*)(void))((uintptr_t)0x070282)) + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_setClock() API as +// the config parameter. +// +//***************************************************************************** +// +// System clock divider (SYSDIV) +// + + + +#define SYSCTL_SYSDIV_M 0x00001F80UL // Mask for SYSDIV value in config +#define SYSCTL_SYSDIV_S 7U // Shift for SYSDIV value in config + +//! Macro to format system clock divider value. x must be 1 or even values up +//! to 126. +#define SYSCTL_SYSDIV(x) ((((x) / 2U) << SYSCTL_SYSDIV_S) & SYSCTL_SYSDIV_M) + +// +// Integer multiplier (IMULT) +// +#define SYSCTL_IMULT_M 0x0000007FUL // Mask for IMULT value in config +#define SYSCTL_IMULT_S 0U // Shift for IMULT value in config +//! Macro to format integer multiplier value. x is a number from 1 to 127. +//! +#define SYSCTL_IMULT(x) (((x) << SYSCTL_IMULT_S) & SYSCTL_IMULT_M) + +#ifndef DOXYGEN_PDF_IGNORE +// +// Fractional multiplier (FMULT) +// +#define SYSCTL_FMULT_M 0x00006000UL // Mask for FMULT value in config +#define SYSCTL_FMULT_S 13U // Shift for FMULT value in config +#define SYSCTL_FMULT_NONE 0x00000000UL //!< No fractional multiplier +#define SYSCTL_FMULT_0 0x00000000UL //!< No fractional multiplier +#define SYSCTL_FMULT_1_4 0x00002000UL //!< Fractional multiplier of 0.25 +#define SYSCTL_FMULT_1_2 0x00004000UL //!< Fractional multiplier of 0.50 +#define SYSCTL_FMULT_3_4 0x00006000UL //!< Fractional multiplier of 0.75 + +// +// Oscillator source +// +// Also used with the SysCtl_selectOscSource(), SysCtl_turnOnOsc(), +// and SysCtl_turnOffOsc() functions as the oscSource parameter. +// +#define SYSCTL_OSCSRC_M 0x00030000UL // Mask for OSCSRC value in config +#define SYSCTL_OSCSRC_S 16U // Shift for OSCSRC value in config +//! Internal oscillator INTOSC2 +#define SYSCTL_OSCSRC_OSC2 0x00000000UL +//! External oscillator (XTAL) in crystal mode +#define SYSCTL_OSCSRC_XTAL 0x00010000U +//! Internal oscillator INTOSC1 +#define SYSCTL_OSCSRC_OSC1 0x00020000UL + +// +// Enable/disable PLL +// +#define SYSCTL_PLL_ENABLE 0x80000000U //!< Enable PLL +#define SYSCTL_PLL_DISABLE 0x00000000U //!< Disable PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_setAuxClock() API +// as the config parameter. +// +//***************************************************************************** +// +// Auxiliary clock divider (AUXCLKDIV) +// +#define SYSCTL_AUXPLL_DIV_1 0x00000000UL //!< Auxiliary PLL divide by 1 +#define SYSCTL_AUXPLL_DIV_2 0x00000080UL //!< Auxiliary PLL divide by 2 +#define SYSCTL_AUXPLL_DIV_4 0x00000100UL //!< Auxiliary PLL divide by 4 +#define SYSCTL_AUXPLL_DIV_8 0x00000180UL //!< Auxiliary PLL divide by 8 + +// +// Integer multiplier (IMULT) +// +//! Macro to format integer multiplier value. x is a number from 1 to 127. +//! +#define SYSCTL_AUXPLL_IMULT(x) SYSCTL_IMULT((x)) + +// +// Fractional multiplier (FMULT) +// +#define SYSCTL_AUXPLL_FMULT_NONE 0x00000000U //!< No fractional multiplier +#define SYSCTL_AUXPLL_FMULT_0 0x00000000U //!< No fractional multiplier +#define SYSCTL_AUXPLL_FMULT_1_4 0x00002000UL //!< Fractional multiplier - 0.25 +#define SYSCTL_AUXPLL_FMULT_1_2 0x00004000UL //!< Fractional multiplier - 0.50 +#define SYSCTL_AUXPLL_FMULT_3_4 0x00006000UL //!< Fractional multiplier - 0.75 + +// +// Oscillator source +// +//! Internal oscillator INTOSC2 as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_OSC2 0x00000000UL +//! External oscillator (XTAL) as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_XTAL 0x00010000UL +//! AUXCLKIN (from GPIO) as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_AUXCLKIN 0x00020000U + +// +// Enable/disable PLL +// +#define SYSCTL_AUXPLL_ENABLE 0x80000000U //!< Enable AUXPLL +#define SYSCTL_AUXPLL_DISABLE 0x00000000U //!< Disable AUXPLL + +//***************************************************************************** +// +// Values that can be passed to SysCtl_selectSecController() as the +// periFrame1Config and periFrame2Config parameters. +// +//***************************************************************************** +//! Configure CLA as the secondary controller +#define SYSCTL_SEC_CONTROLLER_CLA 0x0U +//! Configure DMA a secondary controller +#define SYSCTL_SEC_CONTROLLER_DMA 0x1U + +//***************************************************************************** +// +// Values that can be passed to SysCtl_clearNMIStatus(), +// SysCtl_forceNMIFlags(), SysCtl_isNMIFlagSet(), and +// SysCtl_isNMIShadowFlagSet() as the nmiFlags parameter and returned by +// SysCtl_getNMIFlagStatus() and SysCtl_getNMIShadowFlagStatus(). +// +//***************************************************************************** +#define SYSCTL_NMI_NMIINT 0x1U //!< NMI Interrupt Flag +#define SYSCTL_NMI_CLOCKFAIL 0x2U //!< Clock Fail Interrupt Flag +#define SYSCTL_NMI_RAMUNCERR 0x4U //!< RAM Uncorrectable Error NMI Flag +#define SYSCTL_NMI_FLUNCERR 0x8U //!< Flash Uncorrectable Error NMI Flag +#define SYSCTL_NMI_CPU1HWBISTERR 0x10U //!< HW BIST Error NMI Flag +#define SYSCTL_NMI_CPU2HWBISTERR 0x20U //!< HW BIST Error NMI Flag +#define SYSCTL_NMI_PIEVECTERR 0x40U //!< PIE Vector Fetch Error Flag +#define SYSCTL_NMI_CLBNMI 0x100U //!< Configurable Logic Block NMI Flag +#define SYSCTL_NMI_CPU2WDRSN 0x200U //!< CPU2 WDRSn Reset Indication Flag +#define SYSCTL_NMI_CPU2NMIWDRSN 0x400U //!< CPU2 NMIWDRSn Reset Indication Flag + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_clearResetCause() +// API as rstCauses or returned by the SysCtl_getResetCause() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_POR 0x00000001U //!< Power-on reset +#define SYSCTL_CAUSE_XRS 0x00000002U //!< External reset pin +#define SYSCTL_CAUSE_WDRS 0x00000004U //!< Watchdog reset +#define SYSCTL_CAUSE_NMIWDRS 0x00000008U //!< NMI watchdog reset +#define SYSCTL_CAUSE_SCCRESET 0x00000100U //!< SCCRESETn by DCSM +//***************************************************************************** +// +//! The following are values that can be passed to SysCtl_enablePeripheral() +//! and SysCtl_disablePeripheral() as the \e peripheral parameter. +//! The EPWM Clock enable bit is also used to enable clocking for CLB. +//! The EPWM and CLB clock enable bits are mapped to same value, +// +//***************************************************************************** +#define SYSCTL_PERIPH_CLK_CLB1 SYSCTL_PERIPH_CLK_EPWM1 //!< CLB1 clock +#define SYSCTL_PERIPH_CLK_CLB2 SYSCTL_PERIPH_CLK_EPWM2 //!< CLB2 clock +#define SYSCTL_PERIPH_CLK_CLB3 SYSCTL_PERIPH_CLK_EPWM3 //!< CLB3 clock +#define SYSCTL_PERIPH_CLK_CLB4 SYSCTL_PERIPH_CLK_EPWM4 //!< CLB4 clock +//***************************************************************************** +// +// The following values define the adcsocSrc parameter for +// SysCtl_enableExtADCSOCSource() and SysCtl_disableExtADCSOCSource(). +// +//***************************************************************************** +#define SYSCTL_ADCSOC_SRC_PWM1SOCA 0x1U //! EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM4SYNCOUT, //!< EPWM4SYNCOUT --> EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM7SYNCOUT, //!< EPWM7SYNCOUT --> EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM10SYNCOUT //!< EPWM10SYNCOUT --> EXTSYNCOUT + +} SysCtl_SyncOutputSource; + +//***************************************************************************** +// +//! The following values define the \e parametric parameter for +//! SysCtl_getDeviceParametric(). +// +//***************************************************************************** +typedef enum +{ + SYSCTL_DEVICE_QUAL, //!< Device Qualification Status + SYSCTL_DEVICE_PINCOUNT, //!< Device Pin Count + SYSCTL_DEVICE_INSTASPIN, //!< Device InstaSPIN Feature Set + SYSCTL_DEVICE_FLASH, //!< Device Flash size (KB) + SYSCTL_DEVICE_PARTID, //!< Device Part ID Format Revision + SYSCTL_DEVICE_FAMILY, //!< Device Family + SYSCTL_DEVICE_PARTNO, //!< Device Part Number + SYSCTL_DEVICE_CLASSID //!< Device Class ID +} SysCtl_DeviceParametric; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setXClk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_XCLKOUT_DIV_1 = 0, //!< XCLKOUT = XCLKOUT / 1 + SYSCTL_XCLKOUT_DIV_2 = 1, //!< XCLKOUT = XCLKOUT / 2 + SYSCTL_XCLKOUT_DIV_4 = 2, //!< XCLKOUT = XCLKOUT / 4 + SYSCTL_XCLKOUT_DIV_8 = 3 //!< XCLKOUT = XCLKOUT / 8 + +}SysCtl_XClkDivider; + + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setAuxPLLClk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_AUXPLLCLK_DIV_1, //!< AUXPLL clock = AUXPLL clock / 1 + SYSCTL_AUXPLLCLK_DIV_2, //!< AUXPLL clock = AUXPLL clock / 2 + SYSCTL_AUXPLLCLK_DIV_4, //!< AUXPLL clock = AUXPLL clock / 4 + SYSCTL_AUXPLLCLK_DIV_8, //!< AUXPLL clock = AUXPLL clock / 8 + SYSCTL_AUXPLLCLK_DIV_3, //!< AUXPLL clock = AUXPLL clock / 3 + SYSCTL_AUXPLLCLK_DIV_5, //!< AUXPLL clock = AUXPLL clock / 5 + SYSCTL_AUXPLLCLK_DIV_6, //!< AUXPLL clock = AUXPLL clock / 6 + SYSCTL_AUXPLLCLK_DIV_7 //!< AUXPLL clock = AUXPLL clock / 7 + +}SysCtl_AuxPLLClkDivider; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setCputimer2Clk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_TMR2CLKPRESCALE_1, //!< Cputimer2 clock = Cputimer2 clock / 1 + SYSCTL_TMR2CLKPRESCALE_2, //!< Cputimer2 clock = Cputimer2 clock / 2 + SYSCTL_TMR2CLKPRESCALE_4, //!< Cputimer2 clock = Cputimer2 clock / 4 + SYSCTL_TMR2CLKPRESCALE_8, //!< Cputimer2 clock = Cputimer2 clock / 8 + SYSCTL_TMR2CLKPRESCALE_16 //!< Cputimer2 clock = Cputimer2 clock / 16 + +}SysCtl_Cputimer2ClkDivider; + +//***************************************************************************** +// +//! The following are values that can be passed to SysCtl_setCputimer2Clk() +//! as \e source parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_TMR2CLKSRCSEL_SYSCLK = 0U, //!< System Clock + SYSCTL_TMR2CLKSRCSEL_INTOSC1 = 1U, //!< Internal Oscillator 1 + SYSCTL_TMR2CLKSRCSEL_INTOSC2 = 2U, //!< Internal Oscillator 2 + SYSCTL_TMR2CLKSRCSEL_XTAL = 3U, //!< Crystal oscillator + SYSCTL_TMR2CLKSRCSEL_AUXPLLCLK = 6U //!< Aux PLL CLock + +}SysCtl_Cputimer2ClkSource; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Wrapper function for Device_cal function +//! +//! \param None +//! +//! This is a wrapper function for the Device_cal function available in the OTP +//! memory. +//! The function saves and restores the core registers which are being +//! used by the Device_cal function +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_deviceCal(void) +{ + // + // Save the core registers used by Device_cal function in the stack + // + SYSCTL_DEVICECAL_CONTEXT_SAVE; + + // + // Call the Device_cal function + // + Device_cal(); + + // + // Restore the core registers + // + SYSCTL_DEVICECAL_CONTEXT_RESTORE; +} + +//***************************************************************************** +// +//! Resets a peripheral +//! +//! \param peripheral is the peripheral to reset. +//! +//! This function uses the SOFTPRESx registers to reset a specified peripheral. +//! Module registers will be returned to their reset states. +//! +//! \note This includes registers containing trim values.The peripheral +//! software reset needed by CPU2 can be communicated to CPU1 via +//! IPC for all shared peripherals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetPeripheral(SysCtl_PeripheralSOFTPRES peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Sets the appropriate reset bit and then clears it. + // + HWREG(DEVCFG_BASE + SYSCTL_O_SOFTPRES0 + regIndex) |= (1UL << bitIndex); + HWREG(DEVCFG_BASE + SYSCTL_O_SOFTPRES0 + regIndex) &= ~(1UL << bitIndex); + + // + // Call Device_cal function + // + if((((uint16_t)peripheral & SYSCTL_PERIPH_REG_M) == 0xDU) || // ADCx + (((uint16_t)peripheral & SYSCTL_PERIPH_REG_M) == 0x10U) // DACx + ) + { + SysCtl_deviceCal(); + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables a peripheral. +//! +//! \param peripheral is the peripheral to enable. +//! +//! Peripherals are enabled with this function. At power-up, all peripherals +//! are disabled; they must be enabled in order to operate or respond to +//! register reads/writes. +//! +//! \note Note that there should be atleast 5 cycles delay between enabling the +//! peripheral clock and accessing the peripheral registers. The delay should be +//! added by the user if the peripheral is accessed immediately after this +//! function call. +//! Use asm(" RPT #5 || NOP"); to add 5 cycle delay post this function call. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Turn on the module clock. + // + HWREG(CPUSYS_BASE + SYSCTL_O_PCLKCR0 + regIndex) |= (1UL << bitIndex); + EDIS; +} + +//***************************************************************************** +// +//! Disables a peripheral. +//! +//! \param peripheral is the peripheral to disable. +//! +//! Peripherals are disabled with this function. Once disabled, they will not +//! operate or respond to register reads/writes. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Turn off the module clock. + // + HWREG(CPUSYS_BASE + SYSCTL_O_PCLKCR0 + regIndex) &= ~(1UL << bitIndex); + EDIS; +} + +//***************************************************************************** +// +//! Resets the device. +//! +//! This function performs a watchdog reset of the device. +//! +//! \return This function does not return. +// +//***************************************************************************** +static inline void +SysCtl_resetDevice(void) +{ + // + // Write an incorrect check value to the watchdog control register + // This will cause a device reset + // + EALLOW; + + // + // Enable the watchdog + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = SYSCTL_WD_CHKBITS; + SYSCTL_REGWRITE_DELAY; + + // + // Write a bad check value + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = 0U; + SYSCTL_REGWRITE_DELAY; + + EDIS; + + // + // The device should have reset, so this should never be reached. Just in + // case, loop forever. + // + while((bool)1) + { + } +} + +//***************************************************************************** +// +//! Gets the reason for a reset. +//! +//! This function will return the reason(s) for a reset. Since the reset +//! reasons are sticky until either cleared by software or an external reset, +//! multiple reset reasons may be returned if multiple resets have occurred. +//! The reset reason will be a logical OR of +//! - \b SYSCTL_CAUSE_POR - Power-on reset +//! - \b SYSCTL_CAUSE_XRS - External reset pin +//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset +//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset +//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM +//! +//! \note If you re-purpose the reserved boot ROM RAM, the POR and XRS reset +//! statuses won't be accurate. +//! +//! \return Returns the reason(s) for a reset. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getResetCause(void) +{ + uint32_t resetCauses; + + // + // Read CPU reset register + // + resetCauses = HWREG(CPUSYS_BASE + SYSCTL_O_RESC) & + ((uint32_t)SYSCTL_RESC_POR | (uint32_t)SYSCTL_RESC_XRSN | + (uint32_t)SYSCTL_RESC_WDRSN | + (uint32_t)SYSCTL_RESC_NMIWDRSN | + (uint32_t)SYSCTL_RESC_SCCRESETN + ); + + // + // Set POR and XRS Causes from boot ROM Status + // + if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_POR) == + (uint32_t)SYSCTL_BOOT_ROM_POR) + { + resetCauses |= SYSCTL_RESC_POR; + } + if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_XRS) == + (uint32_t)SYSCTL_BOOT_ROM_XRS) + { + resetCauses |= SYSCTL_RESC_XRSN; + } + + // + // Return the reset reasons. + // + return(resetCauses); +} + +//***************************************************************************** +// +//! Clears reset reasons. +//! +//! \param rstCauses are the reset causes to be cleared; must be a logical +//! OR of +//! - \b SYSCTL_CAUSE_POR - Power-on reset +//! - \b SYSCTL_CAUSE_XRS - External reset pin +//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset +//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset +//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM +//! +//! This function clears the specified sticky reset reasons. Once cleared, +//! another reset for the same reason can be detected, and a reset for a +//! different reason can be distinguished (instead of having two reset causes +//! set). If the reset reason is used by an application, all reset causes +//! should be cleared after they are retrieved with SysCtl_getResetCause(). +//! +//! \note Some reset causes are cleared by the boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearResetCause(uint32_t rstCauses) +{ + // + // Clear the given reset reasons. + // + HWREG(CPUSYS_BASE + SYSCTL_O_RESC) = rstCauses; +} + +//***************************************************************************** +// +//! Sets the low speed peripheral clock rate prescaler. +//! +//! \param prescaler is the LSPCLK rate relative to SYSCLK +//! +//! This function configures the clock rate of the low speed peripherals. The +//! \e prescaler parameter is the value by which the SYSCLK rate is divided to +//! get the LSPCLK rate. For example, a \e prescaler of +//! \b SYSCTL_LSPCLK_PRESCALE_4 will result in a LSPCLK rate that is a quarter +//! of the SYSCLK rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setLowSpeedClock(SysCtl_LSPCLKPrescaler prescaler) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = + (HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + ~(uint32_t)SYSCTL_LOSPCP_LSPCLKDIV_M) | (uint32_t)prescaler; + EDIS; +} + +//***************************************************************************** +// +//! Sets the ePWM clock divider. +//! +//! \param divider is the value by which PLLSYSCLK is divided +//! +//! This function configures the clock rate of the EPWMCLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EPWMCLK rate. For example, \b SYSCTL_EPWMCLK_DIV_2 will select an +//! EPWMCLK rate that is half the PLLSYSCLK rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEPWMClockDivider(SysCtl_EPWMCLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) & + ~SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_M) | (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets the EMIF1 clock divider. +//! +//! \param divider is the value by which PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) is divided +//! +//! This function configures the clock rate of the EMIF1CLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EMIF1CLK rate. For example, \b SYSCTL_EMIF1CLK_DIV_2 will select an +//! EMIF1CLK rate that is half the PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEMIF1ClockDivider(SysCtl_EMIF1CLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + if(divider == SYSCTL_EMIF1CLK_DIV_2) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) |= + SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) &= + ~SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the EMIF2 clock divider. +//! +//! \param divider is the value by which PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) is divided +//! +//! This function configures the clock rate of the EMIF2CLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EMIF2CLK rate. For example, \b SYSCTL_EMIF2CLK_DIV_2 will select an +//! EMIF2CLK rate that is half the PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEMIF2ClockDivider(SysCtl_EMIF2CLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + if(divider == SYSCTL_EMIF2CLK_DIV_2) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) |= + SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) &= + ~SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + EDIS; +} + +//***************************************************************************** +// +//! Selects a clock source to mux to an external GPIO pin (XCLKOUT). +//! +//! \param source is the internal clock source to be configured. +//! +//! This function configures the specified clock source to be muxed to an +//! external clock out (XCLKOUT) GPIO pin. The \e source parameter may take a +//! value of one of the following values: +//! - \b SYSCTL_CLOCKOUT_PLLSYS +//! - \b SYSCTL_CLOCKOUT_PLLRAW +//! - \b SYSCTL_CLOCKOUT_SYSCLK +//! - \b SYSCTL_CLOCKOUT_INTOSC1 +//! - \b SYSCTL_CLOCKOUT_INTOSC2 +//! - \b SYSCTL_CLOCKOUT_XTALOSC +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectClockOutSource(SysCtl_ClockOut source) +{ + EALLOW; + + // + // Clear clock out source + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL3) &= + ~SYSCTL_CLKSRCCTL3_XCLKOUTSEL_M; + SYSCTL_CLKSRCCTL_DELAY; + + // + // Set clock out source + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL3) |= (uint16_t)source; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the external oscillator counter value. +//! +//! This function returns the X1 clock counter value. When the return value +//! reaches 0x3FF, it freezes. Before switching from INTOSC2 to an external +//! oscillator (XTAL), an application should call this function to make sure +//! the counter is saturated. +//! +//! \return Returns the value of the 10-bit X1 clock counter. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getExternalOscCounterValue(void) +{ + return(HWREGH(CLKCFG_BASE + SYSCTL_O_X1CNT) & SYSCTL_X1CNT_X1CNT_M); +} + +//***************************************************************************** +// +//! Turns on the specified oscillator sources. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function turns on the oscillator specified by the \e oscSource +//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL +//! or \b SYSCTL_OSCSRC_OSC2. +//! +//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_turnOnOsc(uint32_t oscSource) +{ + ASSERT( + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL) + ); + + EALLOW; + + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_INTOSC2OFF; + SYSCTL_CLKSRCCTL_DELAY; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Turn on XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +//! Turns off the specified oscillator sources. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function turns off the oscillator specified by the \e oscSource +//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL +//! or \b SYSCTL_OSCSRC_OSC2. +//! +//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_turnOffOsc(uint32_t oscSource) +{ + ASSERT( + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL) + ); + + EALLOW; + + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn off INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_INTOSC2OFF; + SYSCTL_CLKSRCCTL_DELAY; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enters IDLE mode. +//! +//! This function puts the device into IDLE mode. The CPU clock is gated while +//! all peripheral clocks are left running. Any enabled interrupt will wake the +//! CPU up from IDLE mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterIdleMode(void) +{ + EALLOW; + + // + // Configure the device to go into IDLE mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_IDLE; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +} + +//***************************************************************************** +// +//! Enters STANDBY mode. +//! +//! This function puts the device into STANDBY mode. This will gate both the +//! CPU clock and any peripheral clocks derived from SYSCLK. The watchdog is +//! left active, and an NMI or an optional watchdog interrupt will wake the +//! CPU subsystem from STANDBY mode. +//! +//! GPIOs may be configured to wake the CPU subsystem. See +//! SysCtl_enableLPMWakeupPin(). +//! +//! The CPU will receive an interrupt (WAKEINT) on wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterStandbyMode(void) +{ + EALLOW; + + // + // Configure the device to go into STANDBY mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_STANDBY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +} + +//***************************************************************************** +// +//! Enters HALT mode. +//! +//! This function puts the device into HALT mode. This will gate almost all +//! systems and clocks and allows for the power-down of oscillators and analog +//! blocks. The watchdog may be left clocked to produce a reset. See +//! SysCtl_enableWatchdogInHalt() to enable this. GPIOs should be +//! configured to wake the CPU subsystem. See SysCtl_enableLPMWakeupPin(). +//! +//! Enter HALT mode (dual CPU). Puts CPU2 in IDLE mode first. +//! +//! The CPU will receive an interrupt (WAKEINT) on wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterHaltMode(void) +{ +#if defined(CPU2) + EALLOW; + // + // Configure the device to go into IDLE mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_IDLE; + + EDIS; + asm(" IDLE"); + +#elif defined(CPU1) + EALLOW; + + // + // Configure the device to go into HALT mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_HALT; + + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~(SYSCTL_SYSPLLCTL1_PLLCLKEN | SYSCTL_SYSPLLCTL1_PLLEN); + SYSCTL_REGWRITE_DELAY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +#endif +} + +//***************************************************************************** +// +//! Enters Hibernate mode. +//! +//! This function puts the device into Hibernate mode. Hibernate (HIB) is a +//! global low-power mode that gates the supply voltages to most of the system. +//! This mode affects both CPU subsystems. HIB is essentially a controlled +//! power-down with remote wakeup capability, and can be used to save power +//! during long periods of inactivity. +//! +//! To wake the device from HIB mode: +//! 1. Assert the dedicated GPIOHIBWAKE pin (GPIO41) low to enable the +//! power-up of the device clock sources. +//! 2. Assert GPIOHIBWAKE pin high again. This triggers the power-up of the +//! rest of the device. +//! +//! To enter Hibernate mode in dual CPU put CPU2 in STANDBY mode first. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterHibernateMode(void) +{ +#if defined(CPU2) + EALLOW; + // + // Configure the device to go into STANDBY mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_STANDBY; + + EDIS; + asm(" IDLE"); +#elif defined(CPU1) + EALLOW; + + // + // Configure the device to go into Hibernate mode when IDLE is executed + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_HIB; + + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~(SYSCTL_SYSPLLCTL1_PLLCLKEN | SYSCTL_SYSPLLCTL1_PLLEN); + SYSCTL_REGWRITE_DELAY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +#endif +} + +//***************************************************************************** +//! Enables a pin to wake up the device from the following mode(s): +//! - STANDBY +//! - HALT +//! +//! \param pin is the identifying number of the pin. +//! +//! This function connects a pin to the LPM circuit, allowing an event on the +//! pin to wake up the device when when it is in following mode(s): +//! - STANDBY +//! - HALT +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are capable of +//! being connected to the LPM circuit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableLPMWakeupPin(uint32_t pin) +{ + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(pin <= 63U); + + pinMask = 1UL << (pin % 32U); + + EALLOW; + + if(pin < 32U) + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL0) |= pinMask; + } + else + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL1) |= pinMask; + } + + EDIS; +} + +//***************************************************************************** +//! Disables a pin to wake up the device from the following mode(s): +//! - STANDBY +//! - HALT +//! +//! \param pin is the identifying number of the pin. +//! +//! This function disconnects a pin to the LPM circuit, disallowing an event on +//! the pin to wake up the device when when it is in following mode(s): +//! - STANDBY +//! - HALT +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are valid. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableLPMWakeupPin(uint32_t pin) +{ + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(pin <= 63U); + + pinMask = 1UL << (pin % 32U); + + EALLOW; + + if(pin < 32U) + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL0) &= ~pinMask; + } + else + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL1) &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the number of cycles to qualify an input on waking from STANDBY mode. +//! +//! \param cycles is the number of OSCCLK cycles. +//! +//! This function sets the number of OSCCLK clock cycles used to qualify the +//! selected inputs when waking from STANDBY mode. The \e cycles parameter +//! should be passed a cycle count between 2 and 65 cycles inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setStandbyQualificationPeriod(uint16_t cycles) +{ + // + // Check the arguments. + // + ASSERT((cycles >= 2U) && (cycles <= 65U)); + + EALLOW; + + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint16_t)SYSCTL_LPMCR_QUALSTDBY_M) | + ((cycles - 2U) << SYSCTL_LPMCR_QUALSTDBY_S); + + EDIS; +} + +//***************************************************************************** +// +//! Enable the device to wake from STANDBY mode upon a watchdog interrupt. +//! +//! \note In order to use this option, you must configure the watchdog to +//! generate an interrupt using SysCtl_setWatchdogMode(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogStandbyWakeup(void) +{ + EALLOW; + + // + // Set the bit enables the watchdog to wake up the device from STANDBY. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) |= SYSCTL_LPMCR_WDINTE; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the device from waking from STANDBY mode upon a watchdog interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdogStandbyWakeup(void) +{ + EALLOW; + + // + // Clear the bit enables the watchdog to wake up the device from STANDBY. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) &= ~SYSCTL_LPMCR_WDINTE; + + EDIS; +} + +//***************************************************************************** +// +//! Enable the watchdog to run while in HALT mode. +//! +//! This function configures the watchdog to continue to run while in HALT +//! mode. Additionally, INTOSC1 and INTOSC2 are not powered down when the +//! system enters HALT mode. By default the watchdog is gated when the system +//! enters HALT. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogInHalt(void) +{ + EALLOW; + + // + // Set the watchdog HALT mode ignore bit. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= SYSCTL_CLKSRCCTL1_WDHALTI; + SYSCTL_CLKSRCCTL_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the watchdog from running while in HALT mode. +//! +//! This function gates the watchdog when the system enters HALT mode. INTOSC1 +//! and INTOSC2 will be powered down. This is the default behavior of the +//! device. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdogInHalt(void) +{ + EALLOW; + + // + // Clear the watchdog HALT mode ignore bit. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= ~SYSCTL_CLKSRCCTL1_WDHALTI; + SYSCTL_CLKSRCCTL_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Configures whether the watchdog generates a reset or an interrupt signal. +//! +//! \param mode is a flag to select the watchdog mode. +//! +//! This function configures the action taken when the watchdog counter reaches +//! its maximum value. When the \e mode parameter is +//! \b SYSCTL_WD_MODE_INTERRUPT, the watchdog is enabled to generate a watchdog +//! interrupt signal and disables the generation of a reset signal. This will +//! allow the watchdog module to wake up the device from IDLE +//! or STANDBY if desired (see SysCtl_enableWatchdogStandbyWakeup()). +//! +//! When the \e mode parameter is \b SYSCTL_WD_MODE_RESET, the watchdog will +//! be put into reset mode and generation of a watchdog interrupt signal will +//! be disabled. This is how the watchdog is configured by default. +//! +//! \note Check the status of the watchdog interrupt using +//! SysCtl_isWatchdogInterruptActive() before calling this function. If the +//! interrupt is still active, switching from interrupt mode to reset mode will +//! immediately reset the device. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogMode(SysCtl_WDMode mode) +{ + EALLOW; + + // + // Either set or clear the WDENINT bit to that will determine whether the + // watchdog will generate a reset signal or an interrupt signal. Take care + // not to write a 1 to WDOVERRIDE. + // + if(mode == SYSCTL_WD_MODE_INTERRUPT) + { + HWREGH(WD_BASE + SYSCTL_O_SCSR) = + (HWREGH(WD_BASE + SYSCTL_O_SCSR) & ~SYSCTL_SCSR_WDOVERRIDE) | + SYSCTL_SCSR_WDENINT; + } + else + { + HWREGH(WD_BASE + SYSCTL_O_SCSR) &= ~(SYSCTL_SCSR_WDENINT | + SYSCTL_SCSR_WDOVERRIDE); + } + + EDIS; +} + +//***************************************************************************** +// +//! Gets the status of the watchdog interrupt signal. +//! +//! This function returns the status of the watchdog interrupt signal. If the +//! interrupt is active, this function will return \b true. If \b false, the +//! interrupt is NOT active. +//! +//! \note Make sure to call this function to ensure that the interrupt is not +//! active before making any changes to the configuration of the watchdog to +//! prevent any unexpected behavior. For instance, switching from interrupt +//! mode to reset mode while the interrupt is active will immediately reset the +//! device. +//! +//! \return \b true if the interrupt is active and \b false if it is not. +// +//***************************************************************************** +static inline bool +SysCtl_isWatchdogInterruptActive(void) +{ + // + // If the status bit is cleared, the WDINTn signal is active. + // + return((HWREGH(WD_BASE + SYSCTL_O_SCSR) & SYSCTL_SCSR_WDINTS) == 0U); +} + +//***************************************************************************** +// +//! Disables the watchdog. +//! +//! This function disables the watchdog timer. Note that the watchdog timer is +//! enabled on reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdog(void) +{ + EALLOW; + + // + // Set the disable bit. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) |= SYSCTL_WD_CHKBITS | SYSCTL_WDCR_WDDIS; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Enables the watchdog. +//! +//! This function enables the watchdog timer. Note that the watchdog timer is +//! enabled on reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdog(void) +{ + EALLOW; + + // + // Clear the disable bit. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = (HWREGH(WD_BASE + SYSCTL_O_WDCR) & + ~SYSCTL_WDCR_WDDIS) | SYSCTL_WD_CHKBITS; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Checks if the watchdog is enabled or not +//! +//! This function returns the watchdog status whether it is enabled or disabled +//! +//! \return \b true if the watchdog is enabled & \b false if the watchdog is +//! disabled +// +//***************************************************************************** +static inline bool +SysCtl_isWatchdogEnabled(void) +{ + + // + // Get the watchdog enable status + // + return ((HWREGH(WD_BASE + SYSCTL_O_WDCR) & SYSCTL_WDCR_WDDIS) == 0U); +} + +//***************************************************************************** +// +//! Services the watchdog. +//! +//! This function resets the watchdog. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_serviceWatchdog(void) +{ + EALLOW; + + // + // Enable the counter to be reset and then reset it. + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_ENRSTKEY; + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_RSTKEY; + + EDIS; +} + +//***************************************************************************** +// +//! Writes the first key to enter the watchdog reset. +//! +//! This function writes the first key to enter the watchdog reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogReset(void) +{ + EALLOW; + + // + // Enable the counter to be reset + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_ENRSTKEY; + + EDIS; +} + +//***************************************************************************** +// +//! Writes the second key to reset the watchdog. +//! +//! This function writes the second key to reset the watchdog. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetWatchdog(void) +{ + EALLOW; + + // + // Reset the watchdog counter + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_RSTKEY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up watchdog clock (WDCLK) prescaler. +//! +//! \param prescaler is the value that configures the watchdog clock relative +//! to the value from the pre-divider. +//! +//! This function sets up the watchdog clock (WDCLK) prescaler. The +//! \e prescaler parameter divides INTOSC1 down to WDCLK. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogPrescaler(SysCtl_WDPrescaler prescaler) +{ + uint16_t regVal; + + regVal = (uint16_t)prescaler | (uint16_t)SYSCTL_WD_CHKBITS; + + EALLOW; + + // + // Write the prescaler to the appropriate register. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = (HWREGH(WD_BASE + SYSCTL_O_WDCR) & + ~(SYSCTL_WDCR_WDPS_M)) | regVal; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the watchdog counter value. +//! +//! \return Returns the current value of the 8-bit watchdog counter. If this +//! count value overflows, a watchdog output pulse is generated. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getWatchdogCounterValue(void) +{ + // + // Read and return the value of the watchdog counter. + // + return(HWREGH(WD_BASE + SYSCTL_O_WDCNTR)); +} + +//***************************************************************************** +// +//! Gets the watchdog reset status. +//! +//! This function returns the watchdog reset status. If this function returns +//! \b true, that indicates that a watchdog reset generated the last reset +//! condition. Otherwise, it was an external device or power-up reset +//! condition. +//! +//! \return Returns \b true if the watchdog generated the last reset condition. +// +//***************************************************************************** +static inline bool +SysCtl_getWatchdogResetStatus(void) +{ + // + // Read and return the status of the watchdog reset status flag. + // + return((HWREGH(CPUSYS_BASE + SYSCTL_O_RESC) & SYSCTL_RESC_WDRSN) != 0U); +} + +//***************************************************************************** +// +//! Clears the watchdog reset status. +//! +//! This function clears the watchdog reset status. To check if it was set +//! first, see SysCtl_getWatchdogResetStatus(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearWatchdogResetStatus(void) +{ + EALLOW; + + // + // Read and return the status of the watchdog reset status flag. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_RESC) = SYSCTL_RESC_WDRSN; + + EDIS; +} + +//***************************************************************************** +// +//! Set the minimum threshold value for windowed watchdog +//! +//! \param value is the value to set the window threshold +//! +//! This function sets the minimum threshold value used to define the lower +//! limit of the windowed watchdog functionality. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogWindowValue(uint16_t value) +{ + EALLOW; + + // + // Clear the windowed value + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) &= ~SYSCTL_WDWCR_MIN_M; + + // + // Set the windowed value + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) |= (value & SYSCTL_WDWCR_MIN_M); + + EDIS; +} + +//***************************************************************************** +// +//! Clears the watchdog override. +//! +//! This function clears the watchdog override and locks the watchdog timer +//! module to remain in its prior state which could be either enable /disable. +//! The watchdog timer will remain in this state until the next system reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearWatchdogOverride(void) +{ + EALLOW; + + HWREGH(WD_BASE + SYSCTL_O_SCSR) |= SYSCTL_SCSR_WDOVERRIDE; + + EDIS; +} + +//***************************************************************************** +// +//! Enable the NMI Global interrupt bit +//! +//! \b Note: This bit should be set after the device security related +//! initialization is complete. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableNMIGlobalInterrupt(void) +{ + EALLOW; + + HWREGH(NMI_BASE + NMI_O_CFG) |= NMI_CFG_NMIE; + + EDIS; +} + +//***************************************************************************** +// +//! Read NMI interrupts. +//! +//! Read the current state of NMI interrupt. +//! +//! \return \b true if NMI interrupt is triggered, \b false if not. +// +//***************************************************************************** +static inline bool +SysCtl_getNMIStatus(void) +{ + // + // Read and return the current value of the NMI flag register, masking out + // all but the NMI bit. + // + return((HWREGH(NMI_BASE + NMI_O_FLG) & NMI_FLG_NMIINT) != 0U); +} + +//***************************************************************************** +// +//! Read NMI Flags. +//! +//! Read the current state of individual NMI interrupts +//! +//! \return Value of NMIFLG register. These defines are provided to decode +//! the value: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIFlagStatus(void) +{ + // + // Read and return the current value of the NMI flag register. + // + return(HWREGH(NMI_BASE + NMI_O_FLG)); +} + +//***************************************************************************** +// +//! Check if the individual NMI interrupts are set. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Check if interrupt flags corresponding to the passed in bit mask are +//! asserted. +//! +//! \return \b true if any of the NMI asked for in the parameter bit mask +//! is set. \b false if none of the NMI requested in the parameter bit mask are +//! set. +// +//***************************************************************************** +static inline bool +SysCtl_isNMIFlagSet(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + // + // Read the flag register and return true if any of them are set. + // + return((HWREGH(NMI_BASE + NMI_O_FLG) & nmiFlags) != 0U); +} + +//***************************************************************************** +// +//! Function to clear individual NMI interrupts. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Clear NMI interrupt flags that correspond with the passed in bit mask. +//! +//! \b Note: The NMI Interrupt flag is always cleared by default and +//! therefore doesn't have to be included in the bit mask. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearNMIStatus(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + EALLOW; + + // + // Clear the individual flags as well as NMI Interrupt flag + // + HWREGH(NMI_BASE + NMI_O_FLGCLR) = nmiFlags; + HWREGH(NMI_BASE + NMI_O_FLGCLR) = NMI_FLG_NMIINT; + + EDIS; +} + +//***************************************************************************** +// +//! Clear all the NMI Flags that are currently set. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearAllNMIFlags(void) +{ + uint16_t nmiFlags; + + // + // Read the flag status register and then write to the clear register, + // clearing all the flags that were returned plus the NMI flag. + // + EALLOW; + + nmiFlags = SysCtl_getNMIFlagStatus(); + HWREGH(NMI_BASE + NMI_O_FLGCLR) = nmiFlags; + HWREGH(NMI_BASE + NMI_O_FLGCLR) = NMI_FLG_NMIINT; + + EDIS; +} + +//***************************************************************************** +// +//! Function to force individual NMI interrupt fail flags +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_forceNMIFlags(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + EALLOW; + + // + // Set the Flags for the individual interrupts in the NMI flag + // force register + // + HWREGH(NMI_BASE + NMI_O_FLGFRC) |= nmiFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the NMI watchdog counter value. +//! +//! \b Note: The counter is clocked at the SYSCLKOUT rate. +//! +//! \return Returns the NMI watchdog counter register's current value. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIWatchdogCounter(void) +{ + // + // Read and return the NMI watchdog counter register's value. + // + return(HWREGH(NMI_BASE + NMI_O_WDCNT)); +} + +//***************************************************************************** +// +//! Sets the NMI watchdog period value. +//! +//! \param wdPeriod is the 16-bit value at which a reset is generated. +//! +//! This function writes to the NMI watchdog period register that holds the +//! value to which the NMI watchdog counter is compared. When the two registers +//! match, a reset is generated. By default, the period is 0xFFFF. +//! +//! \note If a value smaller than the current counter value is passed into the +//! \e wdPeriod parameter, a NMIRSn will be forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setNMIWatchdogPeriod(uint16_t wdPeriod) +{ + EALLOW; + + // + // Write to the period register. + // + HWREGH(NMI_BASE + NMI_O_WDPRD) = wdPeriod; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the NMI watchdog period value. +//! +//! \return Returns the NMI watchdog period register's current value. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIWatchdogPeriod(void) +{ + // + // Read and return the NMI watchdog period register's value. + // + return(HWREGH(NMI_BASE + NMI_O_WDPRD)); +} + +//***************************************************************************** +// +//! Read NMI Shadow Flags. +//! +//! Read the current state of individual NMI interrupts +//! +//! \return Value of NMISHDFLG register. These defines are provided to decode +//! the value: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +// +//***************************************************************************** +static inline uint32_t +SysCtl_getNMIShadowFlagStatus(void) +{ + // + // Read and return the current value of the NMI shadow flag register. + // + return(HWREGH(NMI_BASE + NMI_O_SHDFLG)); +} + +//***************************************************************************** +// +//! Check if the individual NMI shadow flags are set. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Check if interrupt flags corresponding to the passed in bit mask are +//! asserted. +//! +//! \return \b true if any of the NMI asked for in the parameter bit mask +//! is set. \b false if none of the NMI requested in the parameter bit mask are +//! set. +// +//***************************************************************************** +static inline bool +SysCtl_isNMIShadowFlagSet(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + // + // Read the flag register and return true if any of them are set. + // + return((HWREGH(NMI_BASE + NMI_O_SHDFLG) & nmiFlags) != 0U); +} + +//***************************************************************************** +// +//! Enable the missing clock detection (MCD) Logic +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) &= ~(SYSCTL_MCDCR_MCLKOFF); + + EDIS; +} + +//***************************************************************************** +// +//! Disable the missing clock detection (MCD) Logic +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_MCLKOFF; + + EDIS; +} + +//***************************************************************************** +// +//! Get the missing clock detection Failure Status +//! +//! \note A failure means the oscillator clock is missing +//! +//! \return Returns \b true if a failure is detected or \b false if a +//! failure isn't detected +// +//***************************************************************************** +static inline bool +SysCtl_isMCDClockFailureDetected(void) +{ + // + // Check the status bit to determine failure + // + return((HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) & SYSCTL_MCDCR_MCLKSTS) != 0U); +} + +//***************************************************************************** +// +//! Reset the missing clock detection logic after clock failure +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_MCLKCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Re-connect missing clock detection clock source to stop simulating clock +//! failure +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_connectMCDClockSource(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) &= ~(SYSCTL_MCDCR_OSCOFF); + + EDIS; +} + +//***************************************************************************** +// +//! Disconnect missing clock detection clock source to simulate clock failure. +//! This is for testing the MCD functionality. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disconnectMCDClockSource(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_OSCOFF; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the sync input source for the ePWM and eCAP signals. +//! +//! \param syncInput is the sync input being configured +//! \param syncSrc is sync input source selection. +//! +//! This function configures the sync input source for the ePWM and eCAP +//! modules. The \e syncInput parameter is the sync input being configured. It +//! should be passed a value of \b SYSCTL_SYNC_IN_XXXX, where XXXX is the ePWM +//! or eCAP instance the sync signal is entering. +//! +//! The \e syncSrc parameter is the sync signal selected as the source of the +//! sync input. It should be passed a value of \b SYSCTL_SYNC_IN_SRC_XXXX, +//! XXXX is a sync signal coming from an ePWM, eCAP or external sync output. +//! where For example, a \e syncInput value of \b SYSCTL_SYNC_IN_ECAP1 and a +//! \e syncSrc value of \b SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT will make the +//! EPWM1SYNCOUT signal drive eCAP1's SYNCIN signal. +//! +//! Note that some \e syncSrc values are only valid for certain values of +//! \e syncInput. See device technical reference manual for details on +//! time-base counter synchronization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setSyncInputConfig(SysCtl_SyncInput syncInput, + SysCtl_SyncInputSource syncSrc) +{ + uint32_t clearMask; + + // + // Write the input sync source selection to the appropriate register. + // + EALLOW; + clearMask = (uint32_t)SYSCTL_SYNCSELECT_SYNCIN_M << (uint32_t)syncInput; + + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) = + (HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) & ~clearMask) | + ((uint32_t)syncSrc << (uint32_t)syncInput); + + EDIS; +} +//***************************************************************************** +// +//! Configures the sync output source. +//! +//! \param syncSrc is sync output source selection. +//! +//! This function configures the sync output source from the ePWM modules. The +//! \e syncSrc parameter is a value \b SYSCTL_SYNC_OUT_SRC_XXXX, where XXXX is +//! a sync signal coming from an ePWM such as SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setSyncOutputConfig(SysCtl_SyncOutputSource syncSrc) +{ + // + // Write the sync output source selection to the appropriate register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) = + (HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) & + ~((uint32_t)SYSCTL_SYNCSELECT_SYNCOUT_M)) | + ((uint32_t)syncSrc << SYSCTL_SYNCSELECT_SYNCOUT_S); + EDIS; + +} +//***************************************************************************** +// +//! Enables ePWM SOC signals to drive an external (off-chip) ADCSOC signal. +//! +//! \param adcsocSrc is a bit field of the selected signals to be enabled +//! +//! This function configures which ePWM SOC signals are enabled as a source for +//! either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical OR +//! of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different +//! signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableExtADCSOCSource(uint32_t adcsocSrc) +{ + // + // Set the bits that correspond to signal to be enabled. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_ADCSOCOUTSELECT) |= adcsocSrc; + EDIS; +} + +//***************************************************************************** +// +//! Disables ePWM SOC signals from driving an external ADCSOC signal. +//! +//! \param adcsocSrc is a bit field of the selected signals to be disabled +//! +//! This function configures which ePWM SOC signals are disabled as a source +//! for either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical +//! OR of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different +//! signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableExtADCSOCSource(uint32_t adcsocSrc) +{ + // + // Clear the bits that correspond to signal to be disabled. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_ADCSOCOUTSELECT) &= ~adcsocSrc; + EDIS; +} + +//***************************************************************************** +// +//! Locks the SOC Select of the Trig X-BAR. +//! +//! This function locks the external ADC SOC select of the Trig X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockExtADCSOCSelect(void) +{ + // + // Lock the ADCSOCOUTSELECT bit of the SYNCSOCLOCK register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSOCLOCK) = + SYSCTL_SYNCSOCLOCK_ADCSOCOUTSELECT; + EDIS; +} + +//***************************************************************************** +// +//! Configures whether the dual ported bridge is connected with DMA or +//! CLA as the secondary controller. +//! +//! \param periFrame1Config indicates whether CLA or DMA is configured as +//! secondary controller on peripheral frame 1. +//! \param periFrame2Config indicates whether CLA or DMA is configured as +//! secondary controller on peripheral frame 2. +//! +//! One of the following values can be passed as parameter. +//! \b SYSCTL_SEC_CONTROLLER_CLA +//! \b SYSCTL_SEC_CONTROLLER_DMA +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectSecController(uint16_t periFrame1Config, uint16_t periFrame2Config) +{ + EALLOW; + + HWREG(CPUSYS_BASE + SYSCTL_O_SECMSEL) = + (((periFrame1Config << SYSCTL_SECMSEL_PF1SEL_S) & + SYSCTL_SECMSEL_PF1SEL_M) | + ((periFrame2Config << SYSCTL_SECMSEL_PF2SEL_S) & + SYSCTL_SECMSEL_PF2SEL_M)); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the Sync Select of the Trig X-BAR. +//! +//! This function locks Sync Input and Output Select of the Trig X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockSyncSelect(void) +{ + // + // Lock the SYNCSELECT register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSOCLOCK) = SYSCTL_SYNCSOCLOCK_SYNCSELECT; + EDIS; +} +//***************************************************************************** +// +//! Configures whether a peripheral is connected to CPU1 or CPU2. +//! +//! \param peripheral is the peripheral for which CPU needs to be configured. +//! \param cpuInst is the CPU to which the peripheral instance need to be +//! connected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeriphInstance +//! +//! The \e cpuInst parameter can have one the following values: +//! - \b SYSCTL_CPUSEL_CPU1 - to connect to CPU1 +//! - \b SYSCTL_CPUSEL_CPU2 - to connect to CPU2 +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectCPUForPeripheralInstance(SysCtl_CPUSelPeriphInstance peripheral, + SysCtl_CPUSel cpuInst) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Identify the register index and bit position + // + regIndex = 2U * ((uint16_t)peripheral & SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Configure the CPU owner for the specified peripheral instance + // + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + regIndex) = + (HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + regIndex) & ~(1UL << bitIndex)) | + ((uint32_t)cpuInst << bitIndex); + + EDIS; + +} +//***************************************************************************** +// +//! Configures whether a peripheral is connected to CPU1 or CPU2. +//! +//! \param peripheral is the peripheral for which CPU needs to be configured. +//! \param peripheralInst is the instance for which CPU needs to be configured. +//! \param cpuInst is the CPU to which the peripheral instance need to be +//! connected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeripheral +//! +//! The \e peripheralInst parameter is the instance number for example +//! 1 for EPWM1, 2 for EPWM2 so on.For instances which are named with alphabets +//! (instead of numbers) the following convention needs to be followed. +//! 1 for A (SPI_A), 2 for B (SPI_B), 3 for C (SPI_C) so on... +//! +//! The \e cpuInst parameter can have one the following values: +//! - \b SYSCTL_CPUSEL_CPU1 - to connect to CPU1 +//! - \b SYSCTL_CPUSEL_CPU2 - to connect to CPU2 +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \note This function is retained for compatibility puposes. Recommended to +//! to use the function \e SysCtl_selectCPUForPeripheralInstance() +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectCPUForPeripheral(SysCtl_CPUSelPeripheral peripheral, + uint16_t peripheralInst, SysCtl_CPUSel cpuInst) +{ + uint32_t tempValue; + uint16_t shift; + + if(SYSCTL_CPUSEL14_DAC == peripheral) + { + shift = peripheralInst + SYSCTL_CPUSEL_DAC_S - 1U; + } + else + { + shift = peripheralInst - 1U; + } + + tempValue = + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + ((uint32_t)peripheral * 2U)) & + (~(1UL << shift)); + + EALLOW; + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + ((uint32_t)peripheral * 2U)) = + tempValue | ((uint32_t)cpuInst << shift); + EDIS; +} +//***************************************************************************** +// +//! Get the Device Silicon Revision ID +//! +//! This function returns the silicon revision ID for the device. +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Returns the silicon revision ID value. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getDeviceRevision(void) +{ + // + // Returns the device silicon revision ID + // + return(HWREG(DEVCFG_BASE + SYSCTL_O_REVID)); +} + +//***************************************************************************** +// +//! Locks the CPU select registers for the peripherals +//! +//! \param peripheral is the peripheral for which CPU needs to be selected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeripheral +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockCPUSelectRegs(SysCtl_CPUSelPeripheral peripheral) +{ + EALLOW; + HWREG(DEVCFG_BASE + SYSCTL_O_DEVCFGLOCK1) |= (1UL << (uint32_t)peripheral); + EDIS; +} + + +//***************************************************************************** +// +//! Gets the error status of the Efuse +//! +//! The function provides both the Efuse Autoload & the Efuse Self Test +//! Error Status. +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Fuse Error status. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getEfuseError(void) +{ + return(HWREGH(DEVCFG_BASE + SYSCTL_O_FUSEERR)); +} + +//***************************************************************************** +// +//! Sets up XCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the XCLK divider. There is only one +//! divider that scales INTOSC1 to XCLK. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_XClkDivider +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setXClk(SysCtl_XClkDivider divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_XCLKOUTDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_XCLKOUTDIVSEL) & + ~(SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_M)) | + (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up PLLSYSCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the PLLSYSCLK divider. There is only one +//! divider that scales PLLSYSCLK to generate the system clock. +//! +//! The \e divider parameter can have one value from the set below: +//! 0x0 = /1 +//! 0x1 = /2 +//! 0x2 = /4 (default on reset) +//! 0x3 = /6 +//! 0x4 = /8 +//! ...... +//! 0x3F =/126 +//! +//! \return None. +//! +//! \note Please make sure to check if the PLL is locked and valid using the +//! SysCtl_isPLLValid() before setting the divider. +// +//***************************************************************************** +static inline void +SysCtl_setPLLSysClk(uint16_t divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M)) | divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up AUXPLLCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the AUXPLLCLK divider. There is only one +//! divider that scales AUXPLLCLK to generate the system clock. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_AuxPLLClkDivider +//! +//! \return None. +//! +//! \note Please make sure to check if the PLL is locked and valid using the +//! SysCtl_isPLLValid() before setting the divider. +// +//***************************************************************************** +static inline void +SysCtl_setAuxPLLClk(SysCtl_AuxPLLClkDivider divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) & + ~(SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M)) | (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up CPU Timer 2 CLK source & divider. +//! +//! \param divider is the value that configures the divider. +//! \param source is the source for the clock divider +//! +//! This function sets up the CPU Timer 2 CLK divider based on the source that +//! is selected. There is only one divider that scales the "source" to +//! CPU Timer 2 CLK. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_Cputimer2ClkDivider +//! The \e source parameter can have one enumerated value from +//! SysCtl_Cputimer2ClkSource +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setCputimer2Clk(SysCtl_Cputimer2ClkDivider divider, + SysCtl_Cputimer2ClkSource source) +{ + // + // Clears the divider & the source, then configures it. + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~(SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M | + SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M)); + SYSCTL_REGWRITE_DELAY; + + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) |= + ((uint16_t)divider << SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_S) | + ((uint16_t)source << SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_S); + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Gets the PIE Vector Fetch Error Handler Routine Address. +//! +//! The function indicates the address of the PIE Vector Fetch Error +//! handler routine. +//! +//! \return Error Handler Address. +//! +//! \note Its the responsibility of user to initialize this register. If this +//! register is not initialized, a default error handler at address +//! 0x3fffbe will get executed. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getPIEVErrAddr(void) +{ + return(HWREG(CPUSYS_BASE + SYSCTL_O_PIEVERRADDR)); +} + +//***************************************************************************** +// +//! Check if the Internal PHY is present or not for the USB module +//! +//! Provides the USB module Internal PHY presence +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return \b true if Internal USB PHY Module is present \b false if +//! Internal USB PHY Module is not present +// +//***************************************************************************** +static inline bool +SysCtl_isPresentUSBPHY(void) +{ + return((HWREG(DEVCFG_BASE + SYSCTL_O_PERCNF1) & + SYSCTL_PERCNF1_USB_A_PHY) != 0U); +} + +//***************************************************************************** +// +//! Get the device UID_UNIQUE value +//! +//! This function returns the device UID_UNIQUE value +//! +//! \return Returns the device UID_UNIQUE value +// +//***************************************************************************** +static inline uint32_t +SysCtl_getDeviceUID(void) +{ + // + // Returns the device UID_UNIQUE value + // + return(HWREG(UID_BASE + OTP_O_UID_UNIQUE)); +} + +//***************************************************************************** +// +//! Delays for a fixed number of cycles. +//! +//! \param count is the number of delay loop iterations to perform. +//! +//! This function generates a constant length delay using assembly code. The +//! loop takes 5 cycles per iteration plus 9 cycles of overhead. +//! +//! \note If count is equal to zero, the loop will underflow and run for a +//! very long time. +//! +//! \note Refer to the macro DEVICE_DELAY_US(x) in device.h which can be used to +//! insert a delay in microseconds. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_delay(uint32_t count); + +//***************************************************************************** +// +//! Calculates the system clock frequency (SYSCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK). +//! +//! This function determines the frequency of the system clock based on the +//! frequency of the oscillator clock source (from \e clockInHz) and the PLL +//! and clock divider configuration registers. +//! +//! \return Returns the system clock frequency. If a missing clock is detected, +//! the function will return the INTOSC1 frequency. This needs to be +//! corrected and cleared (see SysCtl_resetMCD()) before trying to call this +//! function again. +// +//***************************************************************************** +extern uint32_t +SysCtl_getClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Calculates the system auxiliary clock frequency (AUXPLLCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source +//! (AUXOSCCLK). +//! +//! This function determines the frequency of the auxiliary clock based on the +//! frequency of the oscillator clock source (from \e clockInHz) and the AUXPLL +//! and clock divider configuration registers. +//! +//! \return Returns the auxiliary clock frequency. +// +//***************************************************************************** +extern uint32_t +SysCtl_getAuxClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Configures the clocking of the device. +//! +//! \param config is the required configuration of the device clocking. +//! +//! This function configures the clocking of the device. The input crystal +//! frequency, oscillator to be used, use of the PLL, and the system clock +//! divider are all configured with this function. +//! +//! The \e config parameter is the OR of several different values, many of +//! which are grouped into sets where only one can be chosen. +//! +//! - The system clock divider is chosen with the macro \b SYSCTL_SYSDIV(x) +//! where x is either 1 or an even value up to 126. +//! +//! - The use of the PLL is chosen with either \b SYSCTL_PLL_ENABLE or +//! \b SYSCTL_PLL_DISABLE. +//! +//! - The integer multiplier is chosen \b SYSCTL_IMULT(x) where x is a value +//! from 1 to 127. +//! +//! - The fractional multiplier is chosen with either \b SYSCTL_FMULT_0, +//! \b SYSCTL_FMULT_1_4, \b SYSCTL_FMULT_1_2, or \b SYSCTL_FMULT_3_4. +//! +//! - The oscillator source chosen with \b SYSCTL_OSCSRC_OSC2, +//! \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! This function uses the watchdog as a monitor for the PLL. The user +//! watchdog settings will be modified and restored upon completion. Make sure +//! that the WDOVERRIDE bit isn't set before calling this function. Re-lock +//! attempt is carried out if either SLIP condition occurs or SYSCLK to input +//! clock ratio is off by 10%. +//! +//! This function uses the following resources to support PLL initialization: +//! - Watchdog +//! - CPU Timer 1 +//! - CPU Timer 2 +//! +//! +//! \note See your device errata for more details about locking the PLL. +//! +//! \return Returns \b false if a missing clock error is detected. This needs +//! to be cleared (see SysCtl_resetMCD()) before trying to call this function +//! again. Otherwise, returns \b true. +// +//***************************************************************************** +extern bool +SysCtl_setClock(uint32_t config); + +//***************************************************************************** +// +//! Configures the external oscillator for the clocking of the device. +//! +//! This function configures the external oscillator (XTAL) to be used for the +//! clocking of the device in crystal mode. It follows the procedure to turn on +//! the oscillator, wait for it to power up, and select it as the source of the +//! system clock. +//! +//! Please note that this function blocks while it waits for the XTAL to power +//! up. If the XTAL does not manage to power up properly, the function will +//! loop for a long time. It is recommended that you modify this function to +//! add an appropriate timeout and error-handling procedure. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectXTAL(void); + +//***************************************************************************** +// +//! Selects the oscillator to be used for the clocking of the device. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function configures the oscillator to be used in the clocking of the +//! device. The \e oscSource parameter may take a value of +//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! \sa SysCtl_turnOnOsc() +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectOscSource(uint32_t oscSource); + +//***************************************************************************** +// +//! Selects the oscillator to be used for the AUXPLL. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function configures the oscillator to be used in the clocking of the +//! AUXPLL. The \e oscSource parameter may take a value of +//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! \sa SysCtl_turnOnOsc() +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectOscSourceAuxPLL(uint32_t oscSource); + +//***************************************************************************** +// +//! Calculates the low-speed peripheral clock frequency (LSPCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK). +//! +//! This function determines the frequency of the low-speed peripheral clock +//! based on the frequency of the oscillator clock source (from \e clockInHz) +//! and the PLL and clock divider configuration registers. +//! +//! \return Returns the low-speed peripheral clock frequency. +// +//***************************************************************************** +extern uint32_t +SysCtl_getLowSpeedClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Get the device part parametric value +//! +//! \param parametric is the requested device parametric value +//! +//! This function gets the device part parametric value. +//! +//! The \e parametric parameter can have one the following enumerated values: +//! - \b SYSCTL_DEVICE_QUAL - Device Qualification Status +//! - \b SYSCTL_DEVICE_PINCOUNT - Device Pin Count +//! - \b SYSCTL_DEVICE_INSTASPIN - Device InstaSPIN Feature Set +//! - \b SYSCTL_DEVICE_FLASH - Device Flash size (KB) +//! - \b SYSCTL_DEVICE_PARTID - Device Part ID Format Revision +//! - \b SYSCTL_DEVICE_FAMILY - Device Family +//! - \b SYSCTL_DEVICE_PARTNO - Device Part Number +//! - \b SYSCTL_DEVICE_CLASSID - Device Class ID +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Returns the specified parametric value. +// +//***************************************************************************** +extern uint16_t +SysCtl_getDeviceParametric(SysCtl_DeviceParametric parametric); + +//***************************************************************************** +// +//! Configures the auxiliary PLL for clocking USB. +//! +//! \param config is the required configuration of the device clocking. +//! +//! This function configures the clock source for auxiliary PLL, the integer +//! multiplier, fractional multiplier and divider. +//! +//! The \e config parameter is the OR of several different values, many of +//! which are grouped into sets where only one can be chosen. +//! +//! - The system clock divider is chosen with one of the following macros: +//! \b SYSCTL_AUXPLL_DIV_1, +//! \b SYSCTL_AUXPLL_DIV_2, +//! \b SYSCTL_AUXPLL_DIV_4, +//! \b SYSCTL_AUXPLL_DIV_8 +//! +//! - The use of the PLL is chosen with either \b SYSCTL_AUXPLL_ENABLE or +//! \b SYSCTL_AUXPLL_DISABLE. +//! +//! - The integer multiplier is chosen with \b SYSCTL_AUXPLL_IMULT(x) where x +//! is a value from 1 to 127. +//! +//! - The oscillator source chosen with one of +//! \b SYSCTL_AUXPLL_OSCSRC_OSC2, +//! \b SYSCTL_AUXPLL_OSCSRC_XTAL, +//! \b SYSCTL_AUXPLL_OSCSRC_AUXCLKIN, +//! +//! \note This function uses CPU Timer 2 to monitor a successful lock of the +//! AUXPLL. For this function to properly detect the PLL startup +//! SYSCLK >= 2*AUXPLLCLK after the AUXPLL is selected as the clocking source. +//! User configuration of CPU Timer 2 will be backed up and restored. +//! \note See your device errata for more details about locking the PLL. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_setAuxClock(uint32_t config); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//**************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SYSCTL_H diff --git a/gpio_bitfield_cpu2/device/driverlib/upp.c b/gpio_bitfield_cpu2/device/driverlib/upp.c new file mode 100644 index 0000000..a3fb8da --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/upp.c @@ -0,0 +1,298 @@ +//########################################################################### +// +// FILE: upp.c +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "upp.h" + +//***************************************************************************** +// +// UPP_setDMAReadThreshold +// +//***************************************************************************** +void +UPP_setDMAReadThreshold(uint32_t base, UPP_DMAChannel channel, + UPP_ThresholdSize size) +{ + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Set DMA read threshold for channel I. + // + HWREGH(base + UPP_O_THCFG) = (HWREGH(base + UPP_O_THCFG) & + ~(uint16_t)UPP_THCFG_RDSIZEI_M) | + (uint16_t)size; + } + else + { + // + // Set DMA read threshold for channel Q. + // + HWREGH(base + UPP_O_THCFG) = (HWREGH(base + UPP_O_THCFG) & + ~(uint16_t)UPP_THCFG_RDSIZEQ_M) | + ((uint16_t)size << UPP_THCFG_RDSIZEQ_S); + } +} + +//***************************************************************************** +// +// UPP_setDMADescriptor +// +//***************************************************************************** +void +UPP_setDMADescriptor(uint32_t base, UPP_DMAChannel channel, + const UPP_DMADescriptor * const desc) +{ + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Sets DMA descriptors for channel I. + // + HWREG(base + UPP_O_CHIDESC0) = desc->addr; + HWREG(base + UPP_O_CHIDESC1) = ((uint32_t)desc->byteCount | + (((uint32_t)desc->lineCount) << + UPP_CHIDESC1_LCNT_S)); + HWREGH(base + UPP_O_CHIDESC2) = desc->lineOffset; + } + else + { + // + // Sets DMA descriptors for channel Q. + // + HWREG(base + UPP_O_CHQDESC0) = desc->addr; + HWREG(base + UPP_O_CHQDESC1) = ((uint32_t)desc->byteCount | + (((uint32_t)desc->lineCount) << + UPP_CHQDESC1_LCNT_S)); + HWREGH(base + UPP_O_CHQDESC2) = desc->lineOffset; + } +} + +//***************************************************************************** +// +// UPP_getDMAChannelStatus +// +//***************************************************************************** +void +UPP_getDMAChannelStatus(uint32_t base, UPP_DMAChannel channel, + UPP_DMAChannelStatus * const status) +{ + uint32_t cntStatus; + + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the current status for channel I. + // + cntStatus = HWREG(base + UPP_O_CHIST1); + status->curAddr = HWREG(base + UPP_O_CHIST0); + status->curByteCount = (uint16_t)(cntStatus & UPP_CHIDESC1_BCNT_M); + status->curLineCount = (uint16_t)(cntStatus >> UPP_CHIDESC1_LCNT_S); + } + else + { + // + // Return the current status for channel Q. + // + cntStatus = HWREG(base + UPP_O_CHQST1); + status->curAddr = HWREG(base + UPP_O_CHQST0); + status->curByteCount = (uint16_t)(cntStatus & UPP_CHQDESC1_BCNT_M); + status->curLineCount = (uint16_t)(cntStatus >> UPP_CHQDESC1_LCNT_S); + } +} + +//***************************************************************************** +// +// UPP_isDescriptorPending +// +//***************************************************************************** +bool +UPP_isDescriptorPending(uint32_t base, UPP_DMAChannel channel) +{ + bool status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the pend status for channel I descriptor. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_PEND) == UPP_CHIST2_PEND); + } + else + { + // + // Return the pend status for channel Q descriptor. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_PEND) == UPP_CHQST2_PEND); + } + return(status); +} + +//***************************************************************************** +// +// UPP_isDescriptorActive +// +//***************************************************************************** +bool +UPP_isDescriptorActive(uint32_t base, UPP_DMAChannel channel) +{ + bool status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Returns active status for channel I descriptor. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_ACT) == UPP_CHIST2_ACT); + } + else + { + // + // Returns active status for channel Q descriptor. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_ACT) == UPP_CHQST2_ACT); + } + return(status); +} + +//***************************************************************************** +// +// UPP_getDMAFIFOWatermark +// +//***************************************************************************** +uint16_t +UPP_getDMAFIFOWatermark(uint32_t base, UPP_DMAChannel channel) +{ + uint16_t status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the watermark for FIFO block count for DMA Channel I. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_WM_M) >> UPP_CHIST2_WM_S); + } + else + { + // + // Return the watermark for FIFO block count for DMA Channel I. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_WM_M) >> UPP_CHQST2_WM_S); + } + return(status); +} + +//***************************************************************************** +// +// UPP_readRxMsgRAM +// +//***************************************************************************** +void +UPP_readRxMsgRAM(uint32_t rxBase, uint16_t array[], uint16_t length, + uint16_t offset) +{ + uint16_t i; + // + // Check the arguments. + // + ASSERT(UPP_isRxBaseValid(rxBase)); + ASSERT((length + offset) < UPP_RX_MSGRAM_MAX_SIZE); + + for(i = 0U; i < length; i++) + { + // + // Read one 16-bit word. + // + array[i] = HWREGH(rxBase + offset + i); + } +} + +//***************************************************************************** +// +// UPP_writeTxMsgRAM +// +//***************************************************************************** +void +UPP_writeTxMsgRAM(uint32_t txBase, const uint16_t array[], uint16_t length, + uint16_t offset) +{ + uint16_t i; + // + // Check the arguments. + // + ASSERT(UPP_isTxBaseValid(txBase)); + ASSERT((length + offset) < UPP_TX_MSGRAM_MAX_SIZE); + + for(i = 0U; i < length; i++) + { + // + // Write one 16-bit word. + // + HWREGH(txBase + offset + i) = array[i]; + } +} diff --git a/gpio_bitfield_cpu2/device/driverlib/upp.h b/gpio_bitfield_cpu2/device/driverlib/upp.h new file mode 100644 index 0000000..128d077 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/upp.h @@ -0,0 +1,1574 @@ +//########################################################################### +// +// FILE: upp.h +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef UPP_H +#define UPP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup upp_api UPP +//! @{ +// +//***************************************************************************** + +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_upp.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Defines that can be passed as addr field of UPP_DMADescriptor to +// UPP_setDMADescriptor(). Since the addresses for Tx & Rx MSG RAMs are +// different for CPU & DMA views, these defines can be used as DMA descriptor +// addresses. +// +//***************************************************************************** +#define UPP_DMA_TX_MSGRAM_STARTADDR UPP_TX_MSG_RAM_BASE +#define UPP_DMA_RX_MSGRAM_STARTADDR 0x00007000U + +//***************************************************************************** +// +// Defines that can be used in user program as start address for CPU/CLA write +// to TX MSG RAM for transmitting data & for CPU/CLA read from RX MSG RAM for +// receiving data. Since the addresses for Tx & Rx MSG RAMs are different for +// CPU & DMA views, these defines can be used for CPU read/writes. +// +//***************************************************************************** +#define UPP_CPU_TX_MSGRAM_STARTADDR UPP_TX_MSG_RAM_BASE +#define UPP_CPU_RX_MSGRAM_STARTADDR UPP_RX_MSG_RAM_BASE + +//***************************************************************************** +// +// Defines to specify the size of the uPP Tx and Rx MSG RAMs. +// +//***************************************************************************** +#define UPP_TX_MSGRAM_MAX_SIZE 0x200U +#define UPP_RX_MSGRAM_MAX_SIZE 0x200U + +//***************************************************************************** +// +// Define to specify 32 cycle delay between software reset issue & release in +// UPP_performSoftReset(). +// +//***************************************************************************** +#ifndef UPP_32_CYCLE_NOP +#define UPP_32_CYCLE_NOP __asm(" RPT #31 || NOP") +#endif + +//***************************************************************************** +// +// Define to specify mask for setting emulation mode in UPP_setEmulationMode(). +// +//***************************************************************************** +#define UPP_SOFT_FREE_M ((uint16_t)UPP_PERCTL_SOFT | \ + (uint16_t)UPP_PERCTL_FREE) + +//***************************************************************************** +// +// Defines to specify masks for enabling/disabling uPP Tx/Rx control signals in +// UPP_setTxControlSignalMode() & UPP_setRxControlSignalMode() respectively. +// +//***************************************************************************** +#define UPP_TX_SIGNAL_MODE_M UPP_IFCFG_WAITA +#define UPP_RX_SIGNAL_MODE_M ((uint16_t)UPP_IFCFG_STARTA | \ + (uint16_t)UPP_IFCFG_ENAA) + +//***************************************************************************** +// +// Define to specify mask for configuring polarities for uPP control signals +// in UPP_setControlSignalPolarity(). +// +//***************************************************************************** +#define UPP_SIGNAL_POLARITY_M ((uint16_t)UPP_IFCFG_WAITPOLA | \ + (uint16_t)UPP_IFCFG_ENAPOLA | \ + (uint16_t)UPP_IFCFG_STARTPOLA) + +//***************************************************************************** +// +// Define to specify masks for returning interrupt status in +// UPP_getInterruptStatus() & UPP_getRawInterruptStatus(). +// +//***************************************************************************** +#define UPP_INT_M ((uint16_t)UPP_ENINTST_DPEI | (uint16_t)UPP_ENINTST_UOEI | \ + (uint16_t)UPP_ENINTST_EOWI | (uint16_t)UPP_ENINTST_EOLI | \ + (uint16_t)UPP_ENINTST_DPEQ | (uint16_t)UPP_ENINTST_UOEQ | \ + (uint16_t)UPP_ENINTST_EOWQ | (uint16_t)UPP_ENINTST_EOLQ) + +//***************************************************************************** +// +// Values that can be passed to UPP_enableInterrupt(), +// UPP_disableInterrupt() and UPP_clearInterruptStatus() as the +// intFlags parameter and returned by UPP_getInterruptStatus() & +// UPP_getRawInterruptStatus(). +// +//***************************************************************************** +#define UPP_INT_CHI_DMA_PROG_ERR 0x0001U //! +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_usb.h" +#include "debug.h" +#include "sysctl.h" +#include "usb.h" + +//***************************************************************************** +// +// Amount to shift the RX interrupt sources by in the flags used in the +// interrupt calls. +// +//***************************************************************************** +#define USB_INTEP_RX_SHIFT 16U + +//***************************************************************************** +// +// Amount to shift the RX endpoint status sources by in the flags used in the +// calls. +// +//***************************************************************************** +#define USB_RX_EPSTATUS_SHIFT 16U + +//***************************************************************************** +// +// Converts from an endpoint specifier to the offset of the endpoint's +// control/status registers. +// +//***************************************************************************** +#define EP_OFFSET(Endpoint) (Endpoint - 0x10U) + +//***************************************************************************** +// +// Sets one of the indexed registers. +// +// \param ui32Base specifies the USB module base address. +// \param ui32Endpoint is the endpoint index to target for this write. +// \param ui32IndexedReg is the indexed register to write to. +// \param ui8Value is the value to write to the register. +// +// This function is used to access the indexed registers for each endpoint. +// The only registers that are indexed are the FIFO configuration registers, +// which are not used after configuration. +// +// \return None. +// +//***************************************************************************** +static void +_USBIndexWrite(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32IndexedReg, uint32_t ui32Value, uint32_t ui32Size) +{ + uint32_t ui32Index; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == 0U) || (ui32Endpoint == 1U) || (ui32Endpoint == 2U) || + (ui32Endpoint == 3U)); + ASSERT((ui32Size == 1U) || (ui32Size == 2U)); + + // + // Save the old index in case it was in use. + // + ui32Index = HWREGB(ui32Base + USB_O_EPIDX); + + // + // Set the index. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Endpoint; + + // + // Determine the size of the register value. + // + if(ui32Size == 1) + { + // + // Set the value. + // + HWREGB(ui32Base + ui32IndexedReg) = ui32Value; + } + else + { + // + // Set the value. + // + HWREGH(ui32Base + ui32IndexedReg) = ui32Value; + } + + // + // Restore the old index in case it was in use. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Index; +} + +//***************************************************************************** +// +// Reads one of the indexed registers. +// +// \param ui32Base specifies the USB module base address. +// \param ui32Endpoint is the endpoint index to target for this write. +// \param ui32IndexedReg is the indexed register to write to. +// +// This function is used internally to access the indexed registers for each +// endpoint. The only registers that are indexed are the FIFO configuration +// registers, which are not used after configuration. +// +// \return The value in the register requested. +// +//***************************************************************************** +static uint32_t +_USBIndexRead(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32IndexedReg, uint32_t ui32Size) +{ + uint8_t ui8Index; + uint8_t ui8Value; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == 0) || (ui32Endpoint == 1) || (ui32Endpoint == 2) || + (ui32Endpoint == 3)); + ASSERT((ui32Size == 1) || (ui32Size == 2)); + + // + // Save the old index in case it was in use. + // + ui8Index = HWREGB(ui32Base + USB_O_EPIDX); + + // + // Set the index. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Endpoint; + + // + // Determine the size of the register value. + // + if(ui32Size == 1U) + { + // + // Get the value. + // + ui8Value = HWREGB(ui32Base + ui32IndexedReg); + } + else + { + // + // Get the value. + // + ui8Value = HWREGH(ui32Base + ui32IndexedReg); + } + + // + // Restore the old index in case it was in use. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui8Index; + + // + // Return the register's value. + // + return(ui8Value); +} + +//***************************************************************************** +// +//! Puts the USB bus in a suspended state. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! When used in host mode, this function puts the USB bus in the suspended +//! state. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostSuspend(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send the suspend signaling to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_SUSPEND; +} + +//***************************************************************************** +// +//! Handles the USB bus reset condition. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies whether to start or stop signaling reset on the USB +//! bus. +//! +//! When this function is called with the \e bStart parameter set to \b true, +//! this function causes the start of a reset condition on the USB bus. +//! The caller must then delay at least 20ms before calling this function +//! again with the \e bStart parameter set to \b false. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostReset(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send a reset signal to the bus. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_RESET; + } + else + { + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_RESET; + } +} + +//***************************************************************************** +// +//! Handles the USB bus resume condition. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies if the USB controller is entering or leaving the +//! resume signaling state. +//! +//! When in device mode, this function brings the USB controller out of the +//! suspend state. This call must first be made with the \e bStart parameter +//! set to \b true to start resume signaling. The device application must +//! then delay at least 10ms but not more than 15ms before calling this +//! function with the \e bStart parameter set to \b false. +//! +//! When in host mode, this function signals devices to leave the suspend +//! state. This call must first be made with the \e bStart parameter set to +//! \b true to start resume signaling. The host application must then delay +//! at least 20ms before calling this function with the \e bStart parameter set +//! to \b false. This action causes the controller to complete the resume +//! signaling on the USB bus. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostResume(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send a resume signal to the bus. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_RESUME; + } + else + { + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_RESUME; + } +} + +//***************************************************************************** +// +//! Returns the current speed of the USB device connected. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current speed of the USB bus in host mode. +//! +//! \b Example: Get the USB connection speed. +//! +//! \verbatim +//! // +//! // Get the connection speed of the device connected to the USB controller. +//! // +//! USBHostSpeedGet(USBA_BASE); +//! \endverbatim +//! +//! \note This function must only be called in host mode. +//! +//! \return Returns one of the following: \b USB_LOW_SPEED, \b USB_FULL_SPEED, +//! or \b USB_UNDEF_SPEED. +// +//***************************************************************************** +uint32_t +USBHostSpeedGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // If the Full Speed device bit is set, then this is a full speed device. + // + if(HWREGB(ui32Base + USB_O_DEVCTL) & USB_DEVCTL_FSDEV) + { + return(USB_FULL_SPEED); + } + + // + // If the Low Speed device bit is set, then this is a low speed device. + // + if(HWREGB(ui32Base + USB_O_DEVCTL) & USB_DEVCTL_LSDEV) + { + return(USB_LOW_SPEED); + } + + // + // The device speed is not known. + // + return(USB_UNDEF_SPEED); +} + +//***************************************************************************** +// +//! Disables control interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which control interrupts to disable. +//! +//! This function disables the control interrupts for the USB controller +//! specified by the \e ui32Base parameter. The \e ui32Flags parameter +//! specifies which control interrupts to disable. The flags passed in the +//! \e ui32Flags parameters must be the definitions that start with +//! \b USB_INTCTRL_* and not any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntDisableControl(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_INTCTRL_ALL)) == 0); + + // + // If any general interrupts were disabled then write the general interrupt + // settings out to the hardware. + // + if(ui32Flags & USB_INTCTRL_STATUS) + { + HWREGB(ui32Base + USB_O_IE) &= ~(ui32Flags & USB_INTCTRL_STATUS); + } + + // + // Disable the power fault interrupt. + // + if(ui32Flags & USB_INTCTRL_POWER_FAULT) + { + HWREG(ui32Base + USB_O_EPCIM) = 0U; + } + + // + // Disable the ID pin detect interrupt. + // + if(ui32Flags & USB_INTCTRL_MODE_DETECT) + { + HWREG(ui32Base + USB_O_IDVIM) = 0U; + } +} + +//***************************************************************************** +// +//! Enables control interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which control interrupts to enable. +//! +//! This function enables the control interrupts for the USB controller +//! specified by the \e ui32Base parameter. The \e ui32Flags parameter +//! specifies which control interrupts to enable. The flags passed in the +//! \e ui32Flags parameters must be the definitions that start with +//! \b USB_INTCTRL_* and not any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntEnableControl(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & (~USB_INTCTRL_ALL)) == 0U); + + // + // If any general interrupts were enabled, then write the general + // interrupt settings out to the hardware. + // + if(ui32Flags & USB_INTCTRL_STATUS) + { + HWREGB(ui32Base + USB_O_IE) |= ui32Flags; + } + + // + // Enable the power fault interrupt. + // + if(ui32Flags & USB_INTCTRL_POWER_FAULT) + { + HWREG(ui32Base + USB_O_EPCIM) = USB_EPCIM_PF; + } + + // + // Enable the ID pin detect interrupt. + // + if(ui32Flags & USB_INTCTRL_MODE_DETECT) + { + HWREG(ui32Base + USB_O_IDVIM) = USB_IDVIM_ID; + } +} + +//***************************************************************************** +// +//! Returns the control interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32IntStatusEP is a pointer to the variable which holds the +//! endpoint interrupt status from RXIS And TXIS. +//! +//! This function reads control interrupt status for a USB controller. This +//! call returns the current status for control interrupts only, the endpoint +//! interrupt status is retrieved by calling USBIntStatusEndpoint(). The bit +//! values returned are compared against the \b USB_INTCTRL_* values. +//! +//! The following are the meanings of all \b USB_INCTRL_ flags and the modes +//! for which they are valid. These values apply to any calls to +//! USBIntStatusControl(), USBIntEnableControl(), and USBIntDisableControl(). +//! Some of these flags are only valid in the following modes as indicated in +//! the parentheses: Host, Device, and OTG. +//! +//! - \b USB_INTCTRL_ALL - A full mask of all control interrupt sources. +//! - \b USB_INTCTRL_VBUS_ERR - A VBUS error has occurred (Host Only). +//! - \b USB_INTCTRL_SESSION - Session Start Detected on A-side of cable +//! (OTG Only). +//! - \b USB_INTCTRL_SESSION_END - Session End Detected (Device Only) +//! - \b USB_INTCTRL_DISCONNECT - Device Disconnect Detected (Host Only) +//! - \b USB_INTCTRL_CONNECT - Device Connect Detected (Host Only) +//! - \b USB_INTCTRL_SOF - Start of Frame Detected. +//! - \b USB_INTCTRL_BABBLE - USB controller detected a device signaling past +//! the end of a frame (Host Only) +//! - \b USB_INTCTRL_RESET - Reset signaling detected by device (Device Only) +//! - \b USB_INTCTRL_RESUME - Resume signaling detected. +//! - \b USB_INTCTRL_SUSPEND - Suspend signaling detected by device (Device +//! Only) +//! - \b USB_INTCTRL_MODE_DETECT - OTG cable mode detection has completed +//! (OTG Only) +//! - \b USB_INTCTRL_POWER_FAULT - Power Fault detected (Host Only) +//! +//! \note This call clears the source of all of the control status interrupts. +//! +//! \return Returns the status of the control interrupts for a USB controller. +//! This is the value of USBIS. +// +//***************************************************************************** +uint32_t +USBIntStatus(uint32_t ui32Base, uint32_t *pui32IntStatusEP) +{ + uint32_t ui32Status = 0U; + *pui32IntStatusEP = 0U; + uint32_t usbis = 0U; + uint32_t rxis = 0U; + uint32_t txis = 0U; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Do-While to make sure that all status registers are cleared before + // continuing. This eliminates the race condition which can cause the USB + // interrupt to stay high and never get triggered again. + // + do + { + // + // Get the general interrupt status. + // + usbis = (uint32_t)HWREGB(ui32Base + USB_O_IS); + + // + // Get the transmit interrupt status. + // + txis = (uint32_t)HWREGH(ui32Base + USB_O_TXIS); + + // + // Get the receive interrupt status. + // + rxis = (uint32_t)HWREGH(ui32Base + USB_O_RXIS); + + // + // Get the general interrupt status, these bits go into the lower 8 bits + // of the returned value. + // + ui32Status |= usbis; + + // + // Get the transmit interrupt status. + // + *pui32IntStatusEP |= txis; + + // + // Get the receive interrupt status, these bits go into the second byte + // of the returned value. + // + *pui32IntStatusEP |= ((uint32_t)rxis << USB_INTEP_RX_SHIFT); + + } while((usbis != 0x0000U) || (txis != 0x0000U) || (rxis != 0x0000U)); + + // + // Add the power fault status. + // + if(HWREG(ui32Base + USB_O_EPCISC) & USB_EPCISC_PF) + { + // + // Indicate a power fault was detected. + // + ui32Status |= USB_INTCTRL_POWER_FAULT; + + // + // Clear the power fault interrupt. + // + HWREGB(ui32Base + USB_O_EPCISC) |= USB_EPCISC_PF; + } + + if(HWREG(ui32Base + USB_O_IDVISC) & USB_IDVRIS_ID) + { + // + // Indicate an id detection. + // + ui32Status |= USB_INTCTRL_MODE_DETECT; + + // + // Clear the id detection interrupt. + // + HWREG(ui32Base + USB_O_IDVISC) |= USB_IDVRIS_ID; + } + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Returns the control interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function reads control interrupt status for a USB controller. This +//! call returns the current status for control interrupts only, the endpoint +//! interrupt status is retrieved by calling USBIntStatusEndpoint(). The bit +//! values returned are compared against the \b USB_INTCTRL_* values. +//! +//! The following are the meanings of all \b USB_INCTRL_ flags and the modes +//! for which they are valid. These values apply to any calls to +//! USBIntStatusControl(), USBIntEnableControl(), and USBIntDisableControl(). +//! Some of these flags are only valid in the following modes as indicated in +//! the parentheses: Host, Device, and OTG. +//! +//! - \b USB_INTCTRL_ALL - A full mask of all control interrupt sources. +//! - \b USB_INTCTRL_VBUS_ERR - A VBUS error has occurred (Host Only). +//! - \b USB_INTCTRL_SESSION - Session Start Detected on A-side of cable +//! (OTG Only). +//! - \b USB_INTCTRL_SESSION_END - Session End Detected (Device Only) +//! - \b USB_INTCTRL_DISCONNECT - Device Disconnect Detected (Host Only) +//! - \b USB_INTCTRL_CONNECT - Device Connect Detected (Host Only) +//! - \b USB_INTCTRL_SOF - Start of Frame Detected. +//! - \b USB_INTCTRL_BABBLE - USB controller detected a device signaling past +//! the end of a frame (Host Only) +//! - \b USB_INTCTRL_RESET - Reset signaling detected by device (Device Only) +//! - \b USB_INTCTRL_RESUME - Resume signaling detected. +//! - \b USB_INTCTRL_SUSPEND - Suspend signaling detected by device (Device +//! Only) +//! - \b USB_INTCTRL_MODE_DETECT - OTG cable mode detection has completed +//! (OTG Only) +//! - \b USB_INTCTRL_POWER_FAULT - Power Fault detected (Host Only) +//! +//! \note This call clears the source of all of the control status interrupts. +//! +//! \return Returns the status of the control interrupts for a USB controller. +// +//***************************************************************************** +uint32_t +USBIntStatusControl(uint32_t ui32Base) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Get the general interrupt status, these bits go into the upper 8 bits + // of the returned value. + // + ui32Status = HWREGB(ui32Base + USB_O_IS); + + // + // Add the power fault status. + // + if(HWREG(ui32Base + USB_O_EPCISC) & USB_EPCISC_PF) + { + // + // Indicate a power fault was detected. + // + ui32Status |= USB_INTCTRL_POWER_FAULT; + + // + // Clear the power fault interrupt. + // + HWREGB(ui32Base + USB_O_EPCISC) |= USB_EPCISC_PF; + } + + if(HWREG(ui32Base + USB_O_IDVISC) & USB_IDVRIS_ID) + { + // + // Indicate an id detection. + // + ui32Status |= USB_INTCTRL_MODE_DETECT; + + // + // Clear the id detection interrupt. + // + HWREG(ui32Base + USB_O_IDVISC) |= USB_IDVRIS_ID; + } + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Disables endpoint interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which endpoint interrupts to disable. +//! +//! This function disables endpoint interrupts for the USB controller specified +//! by the \e ui32Base parameter. The \e ui32Flags parameter specifies which +//! endpoint interrupts to disable. The flags passed in the \e ui32Flags +//! parameters must be the definitions that start with \b USB_INTEP_* and not +//! any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntDisableEndpoint(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // If any transmit interrupts were disabled, then write the transmit + // interrupt settings out to the hardware. + // + HWREGH(ui32Base + USB_O_TXIE) &= + ~(ui32Flags & (USB_INTEP_HOST_OUT | USB_INTEP_DEV_IN | USB_INTEP_0)); + + // + // If any receive interrupts were disabled, then write the receive + // interrupt settings out to the hardware. + // + HWREGH(ui32Base + USB_O_RXIE) &= + ~((ui32Flags & (USB_INTEP_HOST_IN | USB_INTEP_DEV_OUT)) >> + USB_INTEP_RX_SHIFT); +} + +//***************************************************************************** +// +//! Enables endpoint interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which endpoint interrupts to enable. +//! +//! This function enables endpoint interrupts for the USB controller specified +//! by the \e ui32Base parameter. The \e ui32Flags parameter specifies which +//! endpoint interrupts to enable. The flags passed in the \e ui32Flags +//! parameters must be the definitions that start with \b USB_INTEP_* and not +//! any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntEnableEndpoint(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable any transmit endpoint interrupts. + // + HWREGH(ui32Base + USB_O_TXIE) |= + ui32Flags & (USB_INTEP_HOST_OUT | USB_INTEP_DEV_IN | USB_INTEP_0); + + // + // Enable any receive endpoint interrupts. + // + HWREGH(ui32Base + USB_O_RXIE) |= + ((ui32Flags & (USB_INTEP_HOST_IN | USB_INTEP_DEV_OUT)) >> + USB_INTEP_RX_SHIFT); +} + +//***************************************************************************** +// +//! Returns the endpoint interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function reads endpoint interrupt status for a USB controller. This +//! call returns the current status for endpoint interrupts only, the control +//! interrupt status is retrieved by calling USBIntStatusControl(). The bit +//! values returned are compared against the \b USB_INTEP_* values. +//! These values are grouped into classes for \b USB_INTEP_HOST_* and +//! \b USB_INTEP_DEV_* values to handle both host and device modes with all +//! endpoints. +//! +//! \note This call clears the source of all of the endpoint interrupts. +//! +//! \return Returns the status of the endpoint interrupts for a USB controller. +// +//***************************************************************************** +uint32_t +USBIntStatusEndpoint(uint32_t ui32Base) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Get the transmit interrupt status. + // + ui32Status = HWREGH(ui32Base + USB_O_TXIS); + ui32Status |= ((uint32_t)HWREGH(ui32Base + USB_O_RXIS) << + USB_INTEP_RX_SHIFT); + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + + +//***************************************************************************** +// +//! Returns the current status of an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function returns the status of a given endpoint. If any of these +//! status bits must be cleared, then the USBDevEndpointStatusClear() or the +//! USBHostEndpointStatusClear() functions must be called. +//! +//! The following are the status flags for host mode: +//! +//! - \b USB_HOST_IN_PID_ERROR - PID error on the given endpoint. +//! - \b USB_HOST_IN_NOT_COMP - The device failed to respond to an IN request. +//! - \b USB_HOST_IN_STALL - A stall was received on an IN endpoint. +//! - \b USB_HOST_IN_DATA_ERROR - There was a CRC or bit-stuff error on an IN +//! endpoint in Isochronous mode. +//! - \b USB_HOST_IN_NAK_TO - NAKs received on this IN endpoint for more than +//! the specified timeout period. +//! - \b USB_HOST_IN_ERROR - Failed to communicate with a device using this IN +//! endpoint. +//! - \b USB_HOST_IN_FIFO_FULL - This IN endpoint's FIFO is full. +//! - \b USB_HOST_IN_PKTRDY - Data packet ready on this IN endpoint. +//! - \b USB_HOST_OUT_NAK_TO - NAKs received on this OUT endpoint for more than +//! the specified timeout period. +//! - \b USB_HOST_OUT_NOT_COMP - The device failed to respond to an OUT +//! request. +//! - \b USB_HOST_OUT_STALL - A stall was received on this OUT endpoint. +//! - \b USB_HOST_OUT_ERROR - Failed to communicate with a device using this +//! OUT endpoint. +//! - \b USB_HOST_OUT_FIFO_NE - This endpoint's OUT FIFO is not empty. +//! - \b USB_HOST_OUT_PKTPEND - The data transfer on this OUT endpoint has not +//! completed. +//! - \b USB_HOST_EP0_NAK_TO - NAKs received on endpoint zero for more than the +//! specified timeout period. +//! - \b USB_HOST_EP0_ERROR - The device failed to respond to a request on +//! endpoint zero. +//! - \b USB_HOST_EP0_IN_STALL - A stall was received on endpoint zero for an +//! IN transaction. +//! - \b USB_HOST_EP0_IN_PKTRDY - Data packet ready on endpoint zero for an IN +//! transaction. +//! +//! The following are the status flags for device mode: +//! +//! - \b USB_DEV_OUT_SENT_STALL - A stall was sent on this OUT endpoint. +//! - \b USB_DEV_OUT_DATA_ERROR - There was a CRC or bit-stuff error on an OUT +//! endpoint. +//! - \b USB_DEV_OUT_OVERRUN - An OUT packet was not loaded due to a full FIFO. +//! - \b USB_DEV_OUT_FIFO_FULL - The OUT endpoint's FIFO is full. +//! - \b USB_DEV_OUT_PKTRDY - There is a data packet ready in the OUT +//! endpoint's FIFO. +//! - \b USB_DEV_IN_NOT_COMP - A larger packet was split up, more data to come. +//! - \b USB_DEV_IN_SENT_STALL - A stall was sent on this IN endpoint. +//! - \b USB_DEV_IN_UNDERRUN - Data was requested on the IN endpoint and no +//! data was ready. +//! - \b USB_DEV_IN_FIFO_NE - The IN endpoint's FIFO is not empty. +//! - \b USB_DEV_IN_PKTPEND - The data transfer on this IN endpoint has not +//! completed. +//! - \b USB_DEV_EP0_SETUP_END - A control transaction ended before Data End +//! condition was sent. +//! - \b USB_DEV_EP0_SENT_STALL - A stall was sent on endpoint zero. +//! - \b USB_DEV_EP0_IN_PKTPEND - The data transfer on endpoint zero has not +//! completed. +//! - \b USB_DEV_EP0_OUT_PKTRDY - There is a data packet ready in endpoint +//! zero's OUT FIFO. +//! +//! \return The current status flags for the endpoint depending on mode. +// +//***************************************************************************** +uint32_t +USBEndpointStatus(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the TX portion of the endpoint status. + // + ui32Status = HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRL1); + + // + // Get the RX portion of the endpoint status. + // + ui32Status |= + (((uint32_t)HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRL1)) + << USB_RX_EPSTATUS_SHIFT); + + // + // Return the endpoint status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Clears the status bits in this endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags are the status bits that are cleared. +//! +//! This function clears the status of any bits that are passed in the +//! \e ui32Flags parameter. The \e ui32Flags parameter can take the value +//! returned from the USBEndpointStatus() call. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Clear the specified flags for the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~ui32Flags; + } + else + { + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~ui32Flags; + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(ui32Flags >> USB_RX_EPSTATUS_SHIFT); + } +} + +//***************************************************************************** +// +//! Clears the status bits in this endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags are the status bits that are cleared. +//! +//! This function clears the status of any bits that are passed in the +//! \e ui32Flags parameter. The \e ui32Flags parameter can take the value +//! returned from the USBEndpointStatus() call. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // If this is endpoint 0, then the bits have different meaning and map + // into the TX memory location. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the Serviced RxPktRdy bit to clear the RxPktRdy. + // + if(ui32Flags & USB_DEV_EP0_OUT_PKTRDY) + { + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_RXRDYC; + } + + // + // Set the serviced Setup End bit to clear the SetupEnd status. + // + if(ui32Flags & USB_DEV_EP0_SETUP_END) + { + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_SETENDC; + } + + // + // Clear the Sent Stall status flag. + // + if(ui32Flags & USB_DEV_EP0_SENT_STALL) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~(USB_DEV_EP0_SENT_STALL); + } + } + else + { + // + // Clear out any TX flags that were passed in. Only + // USB_DEV_TX_SENT_STALL and USB_DEV_TX_UNDERRUN must be cleared. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(ui32Flags & (USB_DEV_TX_SENT_STALL | USB_DEV_TX_UNDERRUN)); + + // + // Clear out valid RX flags that were passed in. Only + // USB_DEV_RX_SENT_STALL, USB_DEV_RX_DATA_ERROR, and USB_DEV_RX_OVERRUN + // must be cleared. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~((ui32Flags & (USB_DEV_RX_SENT_STALL | USB_DEV_RX_DATA_ERROR | + USB_DEV_RX_OVERRUN)) >> USB_RX_EPSTATUS_SHIFT); + } +} + +//***************************************************************************** +// +//! Sets the value data toggle on an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to reset the data toggle. +//! \param bDataToggle specifies whether to set the state to DATA0 or DATA1. +//! \param ui32Flags specifies whether to set the IN or OUT endpoint. +//! +//! This function is used to force the state of the data toggle in host mode. +//! If the value passed in the \e bDataToggle parameter is \b false, then the +//! data toggle is set to the DATA0 state, and if it is \b true it is set to +//! the DATA1 state. The \e ui32Flags parameter can be \b USB_EP_HOST_IN or +//! \b USB_EP_HOST_OUT to access the desired portion of this endpoint. The +//! \e ui32Flags parameter is ignored for endpoint zero. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointDataToggle(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bDataToggle, uint32_t ui32Flags) +{ + uint32_t ui32DataToggle; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // The data toggle defaults to DATA0. + // + ui32DataToggle = 0; + + // + // See if the data toggle must be set to DATA1. + // + if(bDataToggle) + { + // + // Select the data toggle bit based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32DataToggle = USB_CSRH0_DT; + } + else if(ui32Flags == USB_EP_HOST_IN) + { + ui32DataToggle = USB_RXCSRH1_DT; + } + else + { + ui32DataToggle = USB_TXCSRH1_DT; + } + } + + // + // Set the data toggle based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the write enable and the bit value for endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRH0) = + ((HWREGB(ui32Base + USB_O_CSRH0) & + ~(USB_CSRH0_DTWE | USB_CSRH0_DT)) | + (ui32DataToggle | USB_CSRH0_DTWE)); + } + else if(ui32Flags == USB_EP_HOST_IN) + { + // + // Set the Write enable and the bit value for an IN endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRH1 + EP_OFFSET(ui32Endpoint)) = + ((HWREGB(ui32Base + USB_O_RXCSRH1 + EP_OFFSET(ui32Endpoint)) & + ~(USB_RXCSRH1_DTWE | USB_RXCSRH1_DT)) | + (ui32DataToggle | USB_RXCSRH1_DTWE)); + } + else + { + // + // Set the Write enable and the bit value for an OUT endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRH1 + EP_OFFSET(ui32Endpoint)) = + ((HWREGB(ui32Base + USB_O_TXCSRH1 + EP_OFFSET(ui32Endpoint)) & + ~(USB_TXCSRH1_DTWE | USB_TXCSRH1_DT)) | + (ui32DataToggle | USB_TXCSRH1_DTWE)); + } +} + +//***************************************************************************** +// +//! Sets the data toggle on an endpoint to zero. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to reset the data toggle. +//! \param ui32Flags specifies whether to access the IN or OUT endpoint. +//! +//! This function causes the USB controller to clear the data toggle for an +//! endpoint. This call is not valid for endpoint zero and can be made with +//! host or device controllers. +//! +//! The \e ui32Flags parameter must be one of \b USB_EP_HOST_OUT, +//! \b USB_EP_HOST_IN, \b USB_EP_DEV_OUT, or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDataToggleClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive data toggle must be cleared. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_CLRDT; + } + else + { + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Stalls the specified endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to stall. +//! \param ui32Flags specifies whether to stall the IN or OUT endpoint. +//! +//! This function causes the endpoint number passed in to go into a stall +//! condition. If the \e ui32Flags parameter is \b USB_EP_DEV_IN, then the +//! stall is issued on the IN portion of this endpoint. If the \e ui32Flags +//! parameter is \b USB_EP_DEV_OUT, then the stall is issued on the OUT portion +//! of this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStall(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_EP_DEV_IN | USB_EP_DEV_OUT)) == 0); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Determine how to stall this endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Perform a stall on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_STALL | USB_CSRL0_RXRDYC; + } + else if(ui32Flags == USB_EP_DEV_IN) + { + // + // Perform a stall on an IN endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_STALL; + } + else + { + // + // Perform a stall on an OUT endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_STALL; + } +} + +//***************************************************************************** +// +//! Clears the stall condition on the specified endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint to remove the stall condition. +//! \param ui32Flags specifies whether to remove the stall condition from the +//! IN or the OUT portion of this endpoint. +//! +//! This function causes the endpoint number passed in to exit the stall +//! condition. If the \e ui32Flags parameter is \b USB_EP_DEV_IN, then the +//! stall is cleared on the IN portion of this endpoint. If the \e ui32Flags +//! parameter is \b USB_EP_DEV_OUT, then the stall is cleared on the OUT +//! portion of this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStallClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + ASSERT((ui32Flags & ~(USB_EP_DEV_IN | USB_EP_DEV_OUT)) == 0U); + + // + // Determine how to clear the stall on this endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Clear the stall on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) &= ~USB_CSRL0_STALLED; + } + else if(ui32Flags == USB_EP_DEV_IN) + { + // + // Clear the stall on an IN endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED); + + // + // Reset the data toggle. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_CLRDT; + } + else + { + // + // Clear the stall on an OUT endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED); + + // + // Reset the data toggle. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Connects the USB controller to the bus in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function causes the soft connect feature of the USB controller to +//! be enabled. Call USBDevDisconnect() to remove the USB device from the bus. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevConnect(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable connection to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_SOFTCONN; +} + +//***************************************************************************** +// +//! Removes the USB controller from the bus in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function causes the soft connect feature of the USB controller to +//! remove the device from the USB bus. A call to USBDevConnect() is needed to +//! reconnect to the bus. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevDisconnect(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable connection to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) &= (~USB_POWER_SOFTCONN); +} + +//***************************************************************************** +// +//! Sets the address in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Address is the address to use for a device. +//! +//! This function configures the device address on the USB bus. This address +//! was likely received via a SET ADDRESS command from the host controller. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevAddrSet(uint32_t ui32Base, uint32_t ui32Address) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the function address in the correct location. + // + HWREGB(ui32Base + USB_O_FADDR) = (uint8_t)ui32Address; +} + +//***************************************************************************** +// +//! Returns the current device address in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current device address. This address was set +//! by a call to USBDevAddrSet(). +//! +//! \note This function must only be called in device mode. +//! +//! \return The current device address. +// +//***************************************************************************** +uint32_t +USBDevAddrGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Return the function address. + // + return(HWREGB(ui32Base + USB_O_FADDR)); +} + +//***************************************************************************** +// +//! Sets the base configuration for a host endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32MaxPayload is the maximum payload for this endpoint. +//! \param ui32NAKPollInterval is the either the NAK timeout limit or the +//! polling interval, depending on the type of endpoint. +//! \param ui32TargetEndpoint is the endpoint that the host endpoint is +//! targeting. +//! \param ui32Flags are used to configure other endpoint settings. +//! +//! This function sets the basic configuration for the transmit or receive +//! portion of an endpoint in host mode. The \e ui32Flags parameter determines +//! some of the configuration while the other parameters provide the rest. The +//! \e ui32Flags parameter determines whether this is an IN endpoint +//! (\b USB_EP_HOST_IN or \b USB_EP_DEV_IN) or an OUT endpoint +//! (\b USB_EP_HOST_OUT or \b USB_EP_DEV_OUT), whether this is a Full speed +//! endpoint (\b USB_EP_SPEED_FULL) or a Low speed endpoint +//! (\b USB_EP_SPEED_LOW). +//! +//! The \b USB_EP_MODE_ flags control the type of the endpoint. +//! - \b USB_EP_MODE_CTRL is a control endpoint. +//! - \b USB_EP_MODE_ISOC is an isochronous endpoint. +//! - \b USB_EP_MODE_BULK is a bulk endpoint. +//! - \b USB_EP_MODE_INT is an interrupt endpoint. +//! +//! The \e ui32NAKPollInterval parameter has different meanings based on the +//! \b USB_EP_MODE value and whether or not this call is being made for +//! endpoint zero or another endpoint. For endpoint zero or any Bulk +//! endpoints, this value always indicates the number of frames to allow a +//! device to NAK before considering it a timeout. If this endpoint is an +//! isochronous or interrupt endpoint, this value is the polling interval for +//! this endpoint. +//! +//! For interrupt endpoints, the polling interval is the number of frames +//! between interrupt IN requests to an endpoint and has a range of 1 to 255. +//! For isochronous endpoints this value represents a polling interval of +//! 2 ^ (\e ui32NAKPollInterval - 1) frames. When used as a NAK timeout, the +//! \e ui32NAKPollInterval value specifies 2 ^ (\e ui32NAKPollInterval - 1) +//! frames before issuing a time out. +//! +//! The \b USB_EP_DMA_MODE_ flags enable the type of DMA used to access the +//! endpoint's data FIFOs. The choice of the DMA mode depends on how the DMA +//! controller is configured and how it is being used. See the ``Using USB +//! with the uDMA Controller'' section for more information on DMA +//! configuration. +//! +//! When configuring the OUT portion of an endpoint, the \b USB_EP_AUTO_SET bit +//! is specified to cause the transmission of data on the USB bus to start +//! as soon as the number of bytes specified by \e ui32MaxPayload has been +//! written into the OUT FIFO for this endpoint. +//! +//! When configuring the IN portion of an endpoint, the \b USB_EP_AUTO_REQUEST +//! bit can be specified to trigger the request for more data once the FIFO has +//! been drained enough to fit \e ui32MaxPayload bytes. The +//! \b USB_EP_AUTO_CLEAR bit can be used to clear the data packet ready flag +//! automatically once the data has been read from the FIFO. If this option is +//! not used, this flag must be manually cleared via a call to +//! USBDevEndpointStatusClear() or USBHostEndpointStatusClear(). +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointConfig(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPayload, uint32_t ui32NAKPollInterval, + uint32_t ui32TargetEndpoint, uint32_t ui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero is configured differently than the other endpoints, so see + // if this is endpoint zero. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the NAK timeout. + // + HWREGB(ui32Base + USB_O_NAKLMT) = ui32NAKPollInterval; + + // + // Set the transfer type information. + // + HWREGB(ui32Base + USB_O_TYPE0) = + ((ui32Flags & USB_EP_SPEED_FULL) ? USB_TYPE0_SPEED_FULL : + USB_TYPE0_SPEED_LOW); + } + else + { + // + // Start with the target endpoint. + // + ui32Register = ui32TargetEndpoint; + + // + // Set the speed for the device using this endpoint. + // + if(ui32Flags & USB_EP_SPEED_FULL) + { + ui32Register |= USB_TXTYPE1_SPEED_FULL; + } + else + { + ui32Register |= USB_TXTYPE1_SPEED_LOW; + } + + // + // Set the protocol for the device using this endpoint. + // + switch(ui32Flags & USB_EP_MODE_MASK) + { + // + // The bulk protocol is being used. + // + case USB_EP_MODE_BULK: + { + ui32Register |= USB_TXTYPE1_PROTO_BULK; + break; + } + + // + // The isochronous protocol is being used. + // + case USB_EP_MODE_ISOC: + { + ui32Register |= USB_TXTYPE1_PROTO_ISOC; + break; + } + + // + // The interrupt protocol is being used. + // + case USB_EP_MODE_INT: + { + ui32Register |= USB_TXTYPE1_PROTO_INT; + break; + } + + // + // The control protocol is being used. + // + case USB_EP_MODE_CTRL: + { + ui32Register |= USB_TXTYPE1_PROTO_CTRL; + break; + } + } + + // + // See if the transmit or receive endpoint is being configured. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the transfer type information. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXTYPE1) = + ui32Register; + + // + // Set the NAK timeout or polling interval. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXINTERVAL1) = + ui32NAKPollInterval; + + // + // Set the Maximum Payload per transaction. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXMAXP1) = + ui32MaxPayload; + + // + // Set the transmit control value to zero. + // + ui32Register = 0; + + // + // Allow auto setting of TxPktRdy when max packet size has been + // loaded into the FIFO. + // + if(ui32Flags & USB_EP_AUTO_SET) + { + ui32Register |= USB_TXCSRH1_AUTOSET; + } + + // + // Configure the DMA Mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_TXCSRH1_DMAEN | USB_TXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_TXCSRH1_DMAEN; + } + + // + // Write out the transmit control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + (uint8_t)ui32Register; + } + else + { + // + // Set the transfer type information. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXTYPE1) = + ui32Register; + + // + // Set the NAK timeout or polling interval. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXINTERVAL1) = + ui32NAKPollInterval; + + // + // Set the Maximum Payload per transaction. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXMAXP1) = + ui32MaxPayload; + + // + // Set the receive control value to zero. + // + ui32Register = 0; + + // + // Allow auto clearing of RxPktRdy when packet of size max packet + // has been unloaded from the FIFO. + // + if(ui32Flags & USB_EP_AUTO_CLEAR) + { + ui32Register |= USB_RXCSRH1_AUTOCL; + } + + // + // Allow auto generation of DMA requests. + // + if(ui32Flags & USB_EP_AUTO_REQUEST) + { + ui32Register |= USB_RXCSRH1_AUTORQ; + } + + // + // Configure the DMA Mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_RXCSRH1_DMAEN | USB_RXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_RXCSRH1_DMAEN; + } + + // + // Write out the receive control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + (uint8_t)ui32Register; + } + } +} + +//***************************************************************************** +// +//! Sets the configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32MaxPacketSize is the maximum packet size for this endpoint. +//! \param ui32Flags are used to configure other endpoint settings. +//! +//! This function sets the basic configuration for an endpoint in device mode. +//! Endpoint zero does not have a dynamic configuration, so this function +//! must not be called for endpoint zero. The \e ui32Flags parameter +//! determines some of the configuration while the other parameters provide the +//! rest. +//! +//! The \b USB_EP_MODE_ flags define what the type is for the given endpoint. +//! +//! - \b USB_EP_MODE_CTRL is a control endpoint. +//! - \b USB_EP_MODE_ISOC is an isochronous endpoint. +//! - \b USB_EP_MODE_BULK is a bulk endpoint. +//! - \b USB_EP_MODE_INT is an interrupt endpoint. +//! +//! The \b USB_EP_DMA_MODE_ flags determine the type of DMA access to the +//! endpoint data FIFOs. The choice of the DMA mode depends on how the DMA +//! controller is configured and how it is being used. See the ``Using USB +//! with the uDMA Controller'' section for more information on DMA +//! configuration. +//! +//! When configuring an IN endpoint, the \b USB_EP_AUTO_SET bit can be +//! specified to cause the automatic transmission of data on the USB bus as +//! soon as \e ui32MaxPacketSize bytes of data are written into the FIFO for +//! this endpoint. This option is commonly used with DMA as no interaction is +//! required to start the transmission of data. +//! +//! When configuring an OUT endpoint, the \b USB_EP_AUTO_REQUEST bit is +//! specified to trigger the request for more data once the FIFO has been +//! drained enough to receive \e ui32MaxPacketSize more bytes of data. Also +//! for OUT endpoints, the \b USB_EP_AUTO_CLEAR bit can be used to clear the +//! data packet ready flag automatically once the data has been read from the +//! FIFO. If this option is not used, this flag must be manually cleared via a +//! call to USBDevEndpointStatusClear(). Both of these settings can be used to +//! remove the need for extra calls when using the controller in DMA mode. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, uint32_t ui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // Determine if a transmit or receive endpoint is being configured. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Set the maximum packet size. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXMAXP1) = + ui32MaxPacketSize; + + // + // The transmit control value is zero unless options are enabled. + // + ui32Register = 0; + + // + // Allow auto setting of TxPktRdy when max packet size has been loaded + // into the FIFO. + // + if(ui32Flags & USB_EP_AUTO_SET) + { + ui32Register |= USB_TXCSRH1_AUTOSET; + } + + // + // Configure the DMA mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_TXCSRH1_DMAEN | USB_TXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_TXCSRH1_DMAEN; + } + + // + // Enable isochronous mode if requested. + // + if((ui32Flags & USB_EP_MODE_MASK) == USB_EP_MODE_ISOC) + { + ui32Register |= USB_TXCSRH1_ISO; + } + + // + // Write the transmit control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + (uint8_t)ui32Register; + + // + // Reset the Data toggle to zero. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRL1) = + USB_TXCSRL1_CLRDT; + } + else + { + // + // Set the MaxPacketSize. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXMAXP1) = + ui32MaxPacketSize; + + // + // The receive control value is zero unless options are enabled. + // + ui32Register = 0; + + // + // Allow auto clearing of RxPktRdy when packet of size max packet + // has been unloaded from the FIFO. + // + if(ui32Flags & USB_EP_AUTO_CLEAR) + { + ui32Register = USB_RXCSRH1_AUTOCL; + } + + // + // Configure the DMA mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_RXCSRH1_DMAEN | USB_RXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_RXCSRH1_DMAEN; + } + + // + // Enable isochronous mode if requested. + // + if((ui32Flags & USB_EP_MODE_MASK) == USB_EP_MODE_ISOC) + { + ui32Register |= USB_RXCSRH1_ISO; + } + + // + // Write the receive control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + (uint8_t)ui32Register; + + // + // Reset the Data toggle to zero. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRL1) = + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Gets the current configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui32MaxPacketSize is a pointer which is written with the maximum +//! packet size for this endpoint. +//! \param pui32Flags is a pointer which is written with the current endpoint +//! settings. On entry to the function, this pointer must contain either +//! \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT to indicate whether the IN or OUT +//! endpoint is to be queried. +//! +//! This function returns the basic configuration for an endpoint in device +//! mode. The values returned in \e *pui32MaxPacketSize and \e *pui32Flags are +//! equivalent to the \e ui32MaxPacketSize and \e ui32Flags previously passed +//! to USBDevEndpointConfigSet() for this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32MaxPacketSize, uint32_t *pui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT(pui32MaxPacketSize && pui32Flags); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + if((pui32Flags != NULL) && (pui32MaxPacketSize != NULL)) + { + + // + // Determine if a transmit or receive endpoint is being queried. + // + if(*pui32Flags & USB_EP_DEV_IN) + { + // + // Clear the flags other than the direction bit. + // + *pui32Flags = USB_EP_DEV_IN; + + // + // Get the maximum packet size. + // + *pui32MaxPacketSize = (uint32_t)HWREGH(ui32Base + + EP_OFFSET(ui32Endpoint) + + USB_O_TXMAXP1); + + // + // Get the current transmit control register value. + // + ui32Register = (uint32_t)HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + + USB_O_TXCSRH1); + + // + // Are we allowing auto setting of TxPktRdy when max packet size + // has been loaded into the FIFO? + // + if(ui32Register & USB_TXCSRH1_AUTOSET) + { + *pui32Flags |= USB_EP_AUTO_SET; + } + + // + // Get the DMA mode. + // + if(ui32Register & USB_TXCSRH1_DMAEN) + { + if(ui32Register & USB_TXCSRH1_DMAMOD) + { + *pui32Flags |= USB_EP_DMA_MODE_1; + } + else + { + *pui32Flags |= USB_EP_DMA_MODE_0; + } + } + + // + // Are we in isochronous mode? + // + if(ui32Register & USB_TXCSRH1_ISO) + { + *pui32Flags |= USB_EP_MODE_ISOC; + } + else + { + // + // The hardware doesn't differentiate between bulk, interrupt + // and control mode for the endpoint so we just set something + // that isn't isochronous. This protocol ensures that anyone + // modifying the returned flags in preparation for a call to + // USBDevEndpointConfigSet do not see an unexpected mode + // change. If they decode the returned mode, however, they + // may be in for a surprise. + // + *pui32Flags |= USB_EP_MODE_BULK; + } + } + else + { + // + // Clear the flags other than the direction bit. + // + *pui32Flags = USB_EP_DEV_OUT; + + // + // Get the MaxPacketSize. + // + *pui32MaxPacketSize = (uint32_t)HWREGH(ui32Base + + EP_OFFSET(ui32Endpoint) + + USB_O_RXMAXP1); + + // + // Get the current receive control register value. + // + ui32Register = (uint32_t)HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + + USB_O_RXCSRH1); + + // + // Are we allowing auto clearing of RxPktRdy when packet of size + // max packet has been unloaded from the FIFO? + // + if(ui32Register & USB_RXCSRH1_AUTOCL) + { + *pui32Flags |= USB_EP_AUTO_CLEAR; + } + + // + // Get the DMA mode. + // + if(ui32Register & USB_RXCSRH1_DMAEN) + { + if(ui32Register & USB_RXCSRH1_DMAMOD) + { + *pui32Flags |= USB_EP_DMA_MODE_1; + } + else + { + *pui32Flags |= USB_EP_DMA_MODE_0; + } + } + + // + // Are we in isochronous mode? + // + if(ui32Register & USB_RXCSRH1_ISO) + { + *pui32Flags |= USB_EP_MODE_ISOC; + } + else + { + // + // The hardware doesn't differentiate between bulk, interrupt + // and control mode for the endpoint so we just set something + // that isn't isochronous. This protocol ensures that anyone + // modifying the returned flags in preparation for a call to + // USBDevEndpointConfigSet do not see an unexpected mode + // change.If they decode the returned mode, however, they may + // be in for a surprise. + // + *pui32Flags |= USB_EP_MODE_BULK; + } + } + } +} + +//***************************************************************************** +// +//! Sets the FIFO configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32FIFOAddress is the starting address for the FIFO. +//! \param ui32FIFOSize is the size of the FIFO specified by one of the +//! USB_FIFO_SZ_ values. +//! \param ui32Flags specifies what information to set in the FIFO +//! configuration. +//! +//! This function configures the starting FIFO RAM address and size of the FIFO +//! for a given endpoint. Endpoint zero does not have a dynamically +//! configurable FIFO, so this function must not be called for endpoint zero. +//! The \e ui32FIFOSize parameter must be one of the values in the +//! \b USB_FIFO_SZ_ values. +//! +//! The \e ui32FIFOAddress value must be a multiple of 8 bytes and directly +//! indicates the starting address in the USB controller's FIFO RAM. For +//! example, a value of 64 indicates that the FIFO starts 64 bytes into +//! the USB controller's FIFO memory. The \e ui32Flags value specifies whether +//! the endpoint's OUT or IN FIFO must be configured. If in host mode, use +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN, and if in device mode, use +//! \b USB_EP_DEV_OUT or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32FIFOAddress, uint32_t ui32FIFOSize, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive FIFO is being configured. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Set the transmit FIFO location and size for this endpoint. + // + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_TXFIFOSZ, + ui32FIFOSize, 1U); + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_TXFIFOADD, + ui32FIFOAddress >> 3U, 2U); + } + else + { + // + // Set the receive FIFO location and size for this endpoint. + // + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_RXFIFOSZ, + ui32FIFOSize, 1U); + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_RXFIFOADD, + ui32FIFOAddress >> 3U, 2U); + } +} + +//***************************************************************************** +// +//! Returns the FIFO configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui32FIFOAddress is the starting address for the FIFO. +//! \param pui32FIFOSize is the size of the FIFO as specified by one of the +//! USB_FIFO_SZ_ values. +//! \param ui32Flags specifies what information to retrieve from the FIFO +//! configuration. +//! +//! This function returns the starting address and size of the FIFO for a +//! given endpoint. Endpoint zero does not have a dynamically configurable +//! FIFO, so this function must not be called for endpoint zero. The +//! \e ui32Flags parameter specifies whether the endpoint's OUT or IN FIFO must +//! be read. If in host mode, the \e ui32Flags parameter must be +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN, and if in device mode, the +//! \e ui32Flags parameter must be either \b USB_EP_DEV_OUT or +//! \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32FIFOAddress, uint32_t *pui32FIFOSize, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive FIFO is being configured. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Get the transmit FIFO location and size for this endpoint. + // + *pui32FIFOAddress = (_USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_TXFIFOADD, + 2U)) << 3U; + *pui32FIFOSize = _USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_TXFIFOSZ, 1U); + } + else + { + // + // Get the receive FIFO location and size for this endpoint. + // + *pui32FIFOAddress = (_USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_RXFIFOADD, + 2U)) << 3U; + *pui32FIFOSize = _USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_RXFIFOSZ, 1U); + } +} + +//***************************************************************************** +// +//! Configure the DMA settings for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Config specifies the configuration options for an endpoint. +//! +//! This function configures the DMA settings for a given endpoint without +//! changing other options that may already be configured. In order for the +//! DMA transfer to be enabled, the USBEndpointDMAEnable() function must be +//! called before starting the DMA transfer. The configuration +//! options are passed in the \e ui32Config parameter and can have the values +//! described below. +//! +//! One of the following values to specify direction: +//! - \b USB_EP_HOST_OUT or \b USB_EP_DEV_IN - This setting is used with +//! DMA transfers from memory to the USB controller. +//! - \b USB_EP_HOST_IN or \b USB_EP_DEV_OUT - This setting is used with +//! DMA transfers from the USB controller to memory. +//! +//! One of the following values: +//! - \b USB_EP_DMA_MODE_0(default) - This setting is typically used for +//! transfers that do not span multiple packets or when interrupts are +//! required for each packet. +//! - \b USB_EP_DMA_MODE_1 - This setting is typically used for +//! transfers that span multiple packets and do not require interrupts +//! between packets. +//! +//! Values only used with \b USB_EP_HOST_OUT or \b USB_EP_DEV_IN: +//! - \b USB_EP_AUTO_SET - This setting is used to allow transmit DMA transfers +//! to automatically be sent when a full packet is loaded into a FIFO. +//! This is needed with \b USB_EP_DMA_MODE_1 to ensure that packets go +//! out when the FIFO becomes full and the DMA has more data to send. +//! +//! Values only used with \b USB_EP_HOST_IN or \b USB_EP_DEV_OUT: +//! - \b USB_EP_AUTO_CLEAR - This setting is used to allow receive DMA +//! transfers to automatically be acknowledged as they are received. This is +//! needed with \b USB_EP_DMA_MODE_1 to ensure that packets continue to +//! be received and acknowledged when the FIFO is emptied by the DMA +//! transfer. +//! +//! Values only used with \b USB_EP_HOST_IN: +//! - \b USB_EP_AUTO_REQUEST - This setting is used to allow receive DMA +//! transfers to automatically request a new IN transaction when the +//! previous transfer has emptied the FIFO. This is typically used in +//! conjunction with \b USB_EP_AUTO_CLEAR so that receive DMA transfers +//! can continue without interrupting the main processor. +//! +//! \b Example: Set endpoint 1 receive endpoint to automatically acknowledge +//! request and automatically generate a new IN request in host mode. +//! +//! \verbatim +//! // +//! // Configure endpoint 1 for receiving multiple packets using DMA. +//! // +//! USBEndpointDMAConfigSet(USBA_BASE, USB_EP_1, USB_EP_HOST_IN | +//! USB_EP_DMA_MODE_1 | +//! USB_EP_AUTO_CLEAR | +//! USB_EP_AUTO_REQUEST); +//! \endverbatim +//! +//! \b Example: Set endpoint 2 transmit endpoint to automatically send each +//! packet in host mode when spanning multiple packets. +//! +//! \verbatim +//! // +//! // Configure endpoint 1 for transmitting multiple packets using DMA. +//! // +//! USBEndpointDMAConfigSet(USBA_BASE, USB_EP_2, USB_EP_HOST_OUT | +//! USB_EP_DMA_MODE_1 | +//! USB_EP_AUTO_SET); +//! \endverbatim +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMAConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Config) +{ + uint32_t ui32NewConfig; + + if(ui32Config & USB_EP_HOST_OUT) + { + // + // Clear mode and DMA enable. + // + ui32NewConfig = + (HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) & + ~(USB_TXCSRH1_DMAMOD | USB_TXCSRH1_AUTOSET)); + + if(ui32Config & USB_EP_DMA_MODE_1) + { + ui32NewConfig |= USB_TXCSRH1_DMAMOD; + } + + if(ui32Config & USB_EP_AUTO_SET) + { + ui32NewConfig |= USB_TXCSRH1_AUTOSET; + } + + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + ui32NewConfig; + } + else + { + ui32NewConfig = + (HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) & + ~(USB_RXCSRH1_AUTORQ | USB_RXCSRH1_AUTOCL | USB_RXCSRH1_DMAMOD)); + + if(ui32Config & USB_EP_DMA_MODE_1) + { + ui32NewConfig |= USB_RXCSRH1_DMAMOD; + } + + if(ui32Config & USB_EP_AUTO_CLEAR) + { + ui32NewConfig |= USB_RXCSRH1_AUTOCL; + } + if(ui32Config & USB_EP_AUTO_REQUEST) + { + ui32NewConfig |= USB_RXCSRH1_AUTORQ; + } + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + ui32NewConfig; + } +} + +//***************************************************************************** +// +//! Enable DMA on a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies which direction and what mode to use when +//! enabling DMA. +//! +//! This function enables DMA on a given endpoint and configures the mode +//! according to the values in the \e ui32Flags parameter. The \e ui32Flags +//! parameter must have \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT set. Once this +//! function is called the only DMA or error interrupts are generated by the +//! USB controller. +//! +//! \note If this function is called when an endpoint is configured in DMA +//! mode 0 the USB controller does not generate an interrupt. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMAEnable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // See if the transmit DMA is being enabled. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Enable DMA on the transmit endpoint. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) |= + USB_TXCSRH1_DMAEN; + } + else + { + // + // Enable DMA on the receive endpoint. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) |= + USB_RXCSRH1_DMAEN; + } +} + +//***************************************************************************** +// +//! Disable DMA on a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies which direction to disable. +//! +//! This function disables DMA on a given endpoint to allow non-DMA USB +//! transactions to generate interrupts normally. The \e ui32Flags parameter +//! must be \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT; all other bits are ignored. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMADisable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // If this was a request to disable DMA on the IN portion of the endpoint + // then handle it. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Just disable DMA leave the mode setting. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) &= + ~USB_TXCSRH1_DMAEN; + } + else + { + // + // Just disable DMA leave the mode setting. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) &= + ~USB_RXCSRH1_DMAEN; + } +} + +//***************************************************************************** +// +//! Determine the number of bytes of data available in a given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function returns the number of bytes of data currently available in +//! the FIFO for the given receive (OUT) endpoint. It may be used prior to +//! calling USBEndpointDataGet() to determine the size of buffer required to +//! hold the newly-received packet. +//! +//! \return This call returns the number of bytes available in a given endpoint +//! FIFO. +// +//***************************************************************************** +uint32_t +USBEndpointDataAvail(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the address of the receive status register to use, based on the + // endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Is there a packet ready in the FIFO? + // + if((HWREGH(ui32Base + ui32Register) & USB_CSRL0_RXRDY) == 0) + { + return(0); + } + + // + // Return the byte count in the FIFO. + // + return(HWREGH(ui32Base + USB_O_COUNT0 + ui32Endpoint)); +} + +//***************************************************************************** +// +//! Retrieves data from the given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui8Data is a pointer to the data area used to return the data from +//! the FIFO. +//! \param pui32Size is initially the size of the buffer passed into this call +//! via the \e pui8Data parameter. It is set to the amount of data returned in +//! the buffer. +//! +//! This function returns the data from the FIFO for the given endpoint. +//! The \e pui32Size parameter indicates the size of the buffer passed in +//! the \e pui32Data parameter. The data in the \e pui32Size parameter is +//! changed to match the amount of data returned in the \e pui8Data parameter. +//! If a zero-byte packet is received, this call does not return an error but +//! instead just returns a zero in the \e pui32Size parameter. The only error +//! case occurs when there is no data packet available. +//! +//! \return This call returns 0, or -1 if no packet was received. +// +//***************************************************************************** +int32_t +USBEndpointDataGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t *pui32Size) +{ + uint32_t ui32Register, ui32ByteCount, ui32FIFO; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the address of the receive status register to use, based on the + // endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Don't allow reading of data if the RxPktRdy bit is not set. + // + if((HWREGH(ui32Base + ui32Register) & USB_CSRL0_RXRDY) == 0) + { + // + // Can't read the data because none is available. + // + *pui32Size = 0; + + // + // Return a failure since there is no data to read. + // + return(-1); + } + + // + // Get the byte count in the FIFO. + // + ui32ByteCount = HWREGH(ui32Base + USB_O_COUNT0 + ui32Endpoint); + + // + // Determine how many bytes are copied. + // + ui32ByteCount = (ui32ByteCount < *pui32Size) ? ui32ByteCount : *pui32Size; + + // + // Return the number of bytes we are going to read. + // + *pui32Size = ui32ByteCount; + + // + // Calculate the FIFO address. + // + ui32FIFO = ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2); + + // + // Read the data out of the FIFO. + // + for(; ui32ByteCount > 0; ui32ByteCount--) + { + // + // Read a byte at a time from the FIFO. + // + *pui8Data++ = HWREGB(ui32FIFO); + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +//! Acknowledge that data was read from the given endpoint's FIFO in device +//! mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param bIsLastPacket indicates if this packet is the last one. +//! +//! This function acknowledges that the data was read from the endpoint's FIFO. +//! The \e bIsLastPacket parameter is set to a \b true value if this is the +//! last in a series of data packets on endpoint zero. The \e bIsLastPacket +//! parameter is not used for endpoints other than endpoint zero. This call +//! can be used if processing is required between reading the data and +//! acknowledging that the data has been read. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bIsLastPacket) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Determine which endpoint is being acked. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Clear RxPktRdy, and optionally DataEnd, on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) = + USB_CSRL0_RXRDYC | (bIsLastPacket ? USB_CSRL0_DATAEND : 0U); + } + else + { + // + // Clear RxPktRdy on all other endpoints. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_RXRDY); + } +} + +//***************************************************************************** +// +//! Acknowledge that data was read from the given endpoint's FIFO in host +//! mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function acknowledges that the data was read from the endpoint's FIFO. +//! This call is used if processing is required between reading the data and +//! acknowledging that the data has been read. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Clear RxPktRdy. + // + if(ui32Endpoint == USB_EP_0) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~USB_CSRL0_RXRDY; + } + else + { + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_RXRDY); + } +} + +//***************************************************************************** +// +//! Puts data into the given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui8Data is a pointer to the data area used as the source for the +//! data to put into the FIFO. +//! \param ui32Size is the amount of data to put into the FIFO. +//! +//! This function puts the data from the \e pui8Data parameter into the FIFO +//! for this endpoint. If a packet is already pending for transmission, then +//! this call does not put any of the data into the FIFO and returns -1. Care +//! must be taken to not write more data than can fit into the FIFO +//! allocated by the call to USBFIFOConfigSet(). +//! +//! \return This call returns 0 on success, or -1 to indicate that the FIFO +//! is in use and cannot be written. +// +//***************************************************************************** +int32_t +USBEndpointDataPut(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t ui32Size) +{ + uint32_t ui32FIFO; + uint8_t ui8TxPktRdy; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the bit position of TxPktRdy based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui8TxPktRdy = USB_CSRL0_TXRDY; + } + else + { + ui8TxPktRdy = USB_TXCSRL1_TXRDY; + } + + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) & ui8TxPktRdy) + { + return(-1); + } + + // + // Calculate the FIFO address. + // + ui32FIFO = ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2); + + // + // Write the data to the FIFO. + // + for(; ui32Size > 0U; ui32Size--) + { + HWREGB(ui32FIFO) = *pui8Data++; + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +//! Starts the transfer of data from an endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32TransType is set to indicate what type of data is being sent. +//! +//! This function starts the transfer of data from the FIFO for a given +//! endpoint. This function is called if the \b USB_EP_AUTO_SET bit was +//! not enabled for the endpoint. Setting the \e ui32TransType parameter +//! allows the appropriate signaling on the USB bus for the type of transaction +//! being requested. The \e ui32TransType parameter must be one of the +//! following: +//! +//! - \b USB_TRANS_OUT for OUT transaction on any endpoint in host mode. +//! - \b USB_TRANS_IN for IN transaction on any endpoint in device mode. +//! - \b USB_TRANS_IN_LAST for the last IN transaction on endpoint zero in a +//! sequence of IN transactions. +//! - \b USB_TRANS_SETUP for setup transactions on endpoint zero. +//! - \b USB_TRANS_STATUS for status results on endpoint zero. +//! +//! \return This call returns 0 on success, or -1 if a transmission is already +//! in progress. +// +//***************************************************************************** +int32_t +USBEndpointDataSend(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32TransType) +{ + uint32_t ui32TxPktRdy; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the bit position of TxPktRdy based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0) & USB_CSRL0_TXRDY) + { + return(-1); + } + + ui32TxPktRdy = ui32TransType & 0xFFU; + } + else + { + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) & USB_TXCSRL1_TXRDY) + { + return(-1); + } + + ui32TxPktRdy = (ui32TransType >> 8U) & 0xFFU; + } + + // + // Set TxPktRdy in order to send the data. + // + HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) = ui32TxPktRdy; + + // + // Success. + // + return(0U); +} + +//***************************************************************************** +// +//! Forces a flush of an endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies if the IN or OUT endpoint is accessed. +//! +//! This function forces the USB controller to flush out the data in the FIFO. +//! The function can be called with either host or device controllers and +//! requires the \e ui32Flags parameter be one of \b USB_EP_HOST_OUT, +//! \b USB_EP_HOST_IN, \b USB_EP_DEV_OUT, or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOFlush(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero has a different register set for FIFO flushing. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Nothing in the FIFO if neither of these bits are set. + // + if((HWREGB(ui32Base + USB_O_CSRL0) & + (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY)) != 0U) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_CSRH0) = USB_CSRH0_FLUSH; + } + } + else + { + // + // Only reset the IN or OUT FIFO. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Make sure the FIFO is not empty. + // + if(HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) & + USB_TXCSRL1_TXRDY) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_FLUSH; + } + } + else + { + // + // Make sure that the FIFO is not empty. + // + if(HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) & + USB_RXCSRL1_RXRDY) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_FLUSH; + } + } + } +} + +//***************************************************************************** +// +//! Schedules a request for an IN transaction on an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function schedules a request for an IN transaction. When the USB +//! device being communicated with responds with the data, the data can be +//! retrieved by calling USBEndpointDataGet() or via a DMA transfer. +//! +//! \note This function must only be called in host mode and only for IN +//! endpoints. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestIN(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero uses a different offset than the other endpoints. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Set the request for an IN transaction. + // + HWREGB(ui32Base + ui32Register) = USB_RXCSRL1_REQPKT; +} + +//***************************************************************************** +// +//! Clears a scheduled IN transaction for an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function clears a previously scheduled IN transaction if it is still +//! pending. This function is used to safely disable any scheduled IN +//! transactions if the endpoint specified by \e ui32Endpoint is reconfigured +//! for communications with other devices. +//! +//! \note This function must only be called in host mode and only for IN +//! endpoints. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestINClear(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero uses a different offset than the other endpoints. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Clear the request for an IN transaction. + // + HWREGB(ui32Base + ui32Register) &= ~USB_RXCSRL1_REQPKT; +} + +//***************************************************************************** +// +//! Issues a request for a status IN transaction on endpoint zero. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function is used to cause a request for a status IN transaction from +//! a device on endpoint zero. This function can only be used with endpoint +//! zero as that is the only control endpoint that supports this ability. This +//! function is used to complete the last phase of a control transaction to a +//! device and an interrupt is signaled when the status packet has been +//! received. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestStatus(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the request for a status IN transaction. + // + HWREGB(ui32Base + USB_O_CSRL0) = USB_CSRL0_REQPKT | USB_CSRL0_STATUS; +} + +//***************************************************************************** +// +//! Sets the functional address for the device that is connected to an +//! endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Addr is the functional address for the controller to use for +//! this endpoint. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function configures the functional address for a device that is using +//! this endpoint for communication. This \e ui32Addr parameter is the address +//! of the target device that this endpoint is communicating with. The +//! \e ui32Flags parameter indicates if the IN or OUT endpoint is set. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Addr, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive address is set. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the transmit address. + // + HWREGB(ui32Base + USB_O_TXFUNCADDR0 + (ui32Endpoint >> 1U)) = ui32Addr; + } + else + { + // + // Set the receive address. + // + HWREGB(ui32Base + USB_O_TXFUNCADDR0 + 4U + (ui32Endpoint >> 1U)) = + ui32Addr; + } +} + +//***************************************************************************** +// +//! Gets the current functional device address for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function returns the current functional address that an endpoint is +//! using to communicate with a device. The \e ui32Flags parameter determines +//! if the IN or OUT endpoint's device address is returned. +//! +//! \note This function must only be called in host mode. +//! +//! \return Returns the current function address being used by an endpoint. +// +//***************************************************************************** +uint32_t +USBHostAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive address is returned. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Return this endpoint's transmit address. + // + return(HWREGB(ui32Base + USB_O_TXFUNCADDR0 + (ui32Endpoint >> 1U))); + } + else + { + // + // Return this endpoint's receive address. + // + return(HWREGB(ui32Base + USB_O_TXFUNCADDR0 + 4U + (ui32Endpoint >> 1U))); + } +} + +//***************************************************************************** +// +//! Sets the hub address for the device that is connected to an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Addr is the hub address and port for the device using this +//! endpoint. The hub address must be defined in bits 0 through 6 with the +//! port number in bits 8 through 14. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function configures the hub address for a device that is using this +//! endpoint for communication. The \e ui32Flags parameter determines if the +//! device address for the IN or the OUT endpoint is configured by this call +//! and sets the speed of the downstream device. Valid values are one of +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN optionally ORed with +//! \b USB_EP_SPEED_LOW. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostHubAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Addr, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the hub transmit or receive address is being set. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the hub transmit address and port number for this endpoint. + // + HWREGH(ui32Base + USB_O_TXHUBADDR0 + (ui32Endpoint >> 1U)) = ui32Addr; + } + else + { + // + // Set the hub receive address and port number for this endpoint. + // + HWREGH(ui32Base + USB_O_TXHUBADDR0 + 4U + (ui32Endpoint >> 1U)) = + ui32Addr; + } + + // + // Set the speed of communication for endpoint 0. This configuration is + // done here because it changes on a transaction-by-transaction basis for + // EP0. For other endpoints, this is set in USBHostEndpointConfig(). + // + if(ui32Endpoint == USB_EP_0) + { + if(ui32Flags & USB_EP_SPEED_FULL) + { + HWREGB(ui32Base + USB_O_TYPE0) = USB_TYPE0_SPEED_FULL; + } + else + { + HWREGB(ui32Base + USB_O_TYPE0) = USB_TYPE0_SPEED_LOW; + } + } +} + +//***************************************************************************** +// +//! Gets the current device hub address for this endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function returns the current hub address that an endpoint is using +//! to communicate with a device. The \e ui32Flags parameter determines if the +//! device address for the IN or OUT endpoint is returned. +//! +//! \note This function must only be called in host mode. +//! +//! \return This function returns the current hub address being used by an +//! endpoint. +// +//***************************************************************************** +uint32_t +USBHostHubAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the hub transmit or receive address is returned. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Return the hub transmit address for this endpoint. + // + return(HWREGB(ui32Base + USB_O_TXHUBADDR0 + (ui32Endpoint >> 1U))); + } + else + { + // + // Return the hub receive address for this endpoint. + // + return(HWREGB(ui32Base + USB_O_TXHUBADDR0 + 4U + (ui32Endpoint >> 1U))); + } +} + +//***************************************************************************** +// +//! Sets the configuration for USB power fault. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies the configuration of the power fault. +//! +//! This function controls how the USB controller uses its external power +//! control pins (USBnPFLT and USBnEPEN). The flags specify the power +//! fault level sensitivity, the power fault action, and the power enable level +//! and source. +//! +//! One of the following can be selected as the power fault level sensitivity: +//! +//! - \b USB_HOST_PWRFLT_LOW - An external power fault is indicated by the pin +//! being driven low. +//! - \b USB_HOST_PWRFLT_HIGH - An external power fault is indicated by the pin +//! being driven high. +//! +//! One of the following can be selected as the power fault action: +//! +//! - \b USB_HOST_PWRFLT_EP_NONE - No automatic action when power fault +//! detected. +//! - \b USB_HOST_PWRFLT_EP_TRI - Automatically tri-state the USBnEPEN pin on a +//! power fault. +//! - \b USB_HOST_PWRFLT_EP_LOW - Automatically drive USBnEPEN pin low on a +//! power fault. +//! - \b USB_HOST_PWRFLT_EP_HIGH - Automatically drive USBnEPEN pin high on a +//! power fault. +//! +//! One of the following can be selected as the power enable level and source: +//! +//! - \b USB_HOST_PWREN_MAN_LOW - USBnEPEN is driven low by the USB controller +//! when USBHostPwrEnable() is called. +//! - \b USB_HOST_PWREN_MAN_HIGH - USBnEPEN is driven high by the USB +//! controller when USBHostPwrEnable() is +//! called. +//! - \b USB_HOST_PWREN_AUTOLOW - USBnEPEN is driven low by the USB controller +//! automatically if USBOTGSessionRequest() has +//! enabled a session. +//! - \b USB_HOST_PWREN_AUTOHIGH - USBnEPEN is driven high by the USB +//! controller automatically if +//! USBOTGSessionRequest() has enabled a +//! session. +//! +//! On devices that support the VBUS glitch filter, the +//! \b USB_HOST_PWREN_FILTER can be added to ignore small, short drops in VBUS +//! level caused by high power consumption. This feature is mainly used to +//! avoid causing VBUS errors caused by devices with high in-rush current. +//! +//! \note This function must only be called on microcontrollers that support +//! host mode or OTG operation. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrConfig(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_HOST_PWREN_FILTER | USB_EPC_PFLTACT_M | + USB_EPC_PFLTAEN | USB_EPC_PFLTSEN_HIGH | + USB_EPC_EPEN_M)) == 0U); + + // + // If requested, enable VBUS droop detection on parts that support this + // feature. + // + HWREG(ui32Base + USB_O_VDC) = ui32Flags >> 16U; + + // + // Set the power fault configuration as specified. This configuration + // does not change whether fault detection is enabled or not. + // + HWREGH(ui32Base + USB_O_EPC) = + (ui32Flags | (HWREGH(ui32Base + USB_O_EPC) & + ~(USB_EPC_PFLTACT_M | USB_EPC_PFLTAEN | + USB_EPC_PFLTSEN_HIGH | USB_EPC_EPEN_M))); +} + +//***************************************************************************** +// +//! Enables power fault detection. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function enables power fault detection in the USB controller. If the +//! USBnPFLT pin is not in use, this function must not be used. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrFaultEnable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable power fault input. + // + HWREGH(ui32Base + USB_O_EPC) |= USB_EPC_PFLTEN; +} + +//***************************************************************************** +// +//! Disables power fault detection. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function disables power fault detection in the USB controller. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrFaultDisable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable power fault input. + // + HWREGH(ui32Base + USB_O_EPC) &= ~USB_EPC_PFLTEN; +} + +//***************************************************************************** +// +//! Enables the external power pin. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function enables the USBnEPEN signal, which enables an external power +//! supply in host mode operation. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrEnable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable the external power supply enable signal. + // + HWREGH(ui32Base + USB_O_EPC) |= USB_EPC_EPENDE; +} + +//***************************************************************************** +// +//! Disables the external power pin. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function disables the USBnEPEN signal, which disables an external +//! power supply in host mode operation. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrDisable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable the external power supply enable signal. + // + HWREGH(ui32Base + USB_O_EPC) &= ~USB_EPC_EPENDE; +} + +//***************************************************************************** +// +//! Get the current frame number. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the last frame number received. +//! +//! \return The last frame number received. +// +//***************************************************************************** +uint32_t +USBFrameNumberGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Return the most recent frame number. + // + return(HWREGH(ui32Base + USB_O_FRAME)); +} + +//***************************************************************************** +// +//! Starts or ends a session. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies if this call starts or ends a session. +//! +//! This function is used in OTG mode to start a session request or end a +//! session. If the \e bStart parameter is set to \b true, then this function +//! starts a session and if it is \b false it ends a session. +//! +//! \return None. +// +//***************************************************************************** +void +USBOTGSessionRequest(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Start or end the session as directed. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_DEVCTL) |= USB_DEVCTL_SESSION; + } + else + { + HWREGB(ui32Base + USB_O_DEVCTL) &= ~USB_DEVCTL_SESSION; + } +} + +//***************************************************************************** +// +//! Returns the absolute FIFO address for a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint's FIFO address to return. +//! +//! This function returns the actual physical address of the FIFO. This +//! address is needed when the USB is going to be used with the uDMA +//! controller and the source or destination address must be set to the +//! physical FIFO address for a given endpoint. +//! +//! \return None. +// +//***************************************************************************** +uint32_t +USBFIFOAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Return the FIFO address for this endpoint. + // + return(ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2U)); +} + +//***************************************************************************** +// +//! Returns the current operating mode of the controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current operating mode on USB controllers with +//! OTG or Dual mode functionality. +//! +//! For OTG controllers: +//! +//! The function returns one of the following values on OTG controllers: +//! \b USB_OTG_MODE_ASIDE_HOST, \b USB_OTG_MODE_ASIDE_DEV, +//! \b USB_OTG_MODE_BSIDE_HOST, \b USB_OTG_MODE_BSIDE_DEV, +//! \b USB_OTG_MODE_NONE. +//! +//! \b USB_OTG_MODE_ASIDE_HOST indicates that the controller is in host mode +//! on the A-side of the cable. +//! +//! \b USB_OTG_MODE_ASIDE_DEV indicates that the controller is in device mode +//! on the A-side of the cable. +//! +//! \b USB_OTG_MODE_BSIDE_HOST indicates that the controller is in host mode +//! on the B-side of the cable. +//! +//! \b USB_OTG_MODE_BSIDE_DEV indicates that the controller is in device mode +//! on the B-side of the cable. If an OTG session request is started with no +//! cable in place, this mode is the default. +//! +//! \b USB_OTG_MODE_NONE indicates that the controller is not attempting to +//! determine its role in the system. +//! +//! For Dual Mode controllers: +//! +//! The function returns one of the following values: +//! \b USB_DUAL_MODE_HOST, \b USB_DUAL_MODE_DEVICE, or +//! \b USB_DUAL_MODE_NONE. +//! +//! \b USB_DUAL_MODE_HOST indicates that the controller is acting as a host. +//! +//! \b USB_DUAL_MODE_DEVICE indicates that the controller acting as a device. +//! +//! \b USB_DUAL_MODE_NONE indicates that the controller is not active as +//! either a host or device. +//! +//! \return Returns \b USB_OTG_MODE_ASIDE_HOST, \b USB_OTG_MODE_ASIDE_DEV, +//! \b USB_OTG_MODE_BSIDE_HOST, \b USB_OTG_MODE_BSIDE_DEV, +//! \b USB_OTG_MODE_NONE, \b USB_DUAL_MODE_HOST, \b USB_DUAL_MODE_DEVICE, or +//! \b USB_DUAL_MODE_NONE. +// +//***************************************************************************** +uint32_t +USBModeGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Checks the current mode in the USB_O_DEVCTL and returns the current + // mode. + // + // USB_OTG_MODE_ASIDE_HOST: USB_DEVCTL_HOST | USB_DEVCTL_SESSION + // USB_OTG_MODE_ASIDE_DEV: USB_DEVCTL_SESSION + // USB_OTG_MODE_BSIDE_HOST: USB_DEVCTL_DEV | USB_DEVCTL_SESSION | + // USB_DEVCTL_HOST + // USB_OTG_MODE_BSIDE_DEV: USB_DEVCTL_DEV | USB_DEVCTL_SESSION + // USB_OTG_MODE_NONE: USB_DEVCTL_DEV + // + return(HWREGB(ui32Base + USB_O_DEVCTL) & + (USB_DEVCTL_DEV | USB_DEVCTL_HOST | USB_DEVCTL_SESSION | + USB_DEVCTL_VBUS_M)); +} + +//***************************************************************************** +// +//! Sets the DMA channel to use for a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint's FIFO address to return. +//! \param ui32Channel specifies which DMA channel to use for which endpoint. +//! +//! This function is used to configure which DMA channel to use with a given +//! endpoint. Receive DMA channels can only be used with receive endpoints +//! and transmit DMA channels can only be used with transmit endpoints. As a +//! result, the 3 receive and 3 transmit DMA channels can be mapped to any +//! endpoint other than 0. The values that are passed into the +//! \e ui32Channel value are the UDMA_CHANNEL_USBEP* values defined in udma.h. +//! +//! \note This function only has an effect on microcontrollers that have the +//! ability to change the DMA channel for an endpoint. Calling this function +//! on other devices has no effect. +//! +//! \return None. +//! +//***************************************************************************** +void +USBEndpointDMAChannel(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Channel) +{ + uint32_t ui32Mask; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // The input select mask must be shifted into the correct position + // based on the channel. + // + ui32Mask = (uint32_t)0xFU << (ui32Channel * 4U); + + // + // Clear out the current selection for the channel. + // + ui32Mask = HWREG(ui32Base + USB_O_DMASEL) & (~ui32Mask); + + // + // The input select is now shifted into the correct position based on the + // channel. + // + ui32Mask |= ((uint32_t)USBEPToIndex(ui32Endpoint)) << (ui32Channel * 4U); + + // + // Write the value out to the register. + // + HWREG(ui32Base + USB_O_DMASEL) = ui32Mask; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to host. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to host mode. +//! +//! \note This function must only be called on microcontrollers that support +//! OTG operation and have the DEVMODOTG bit in the USBGPCS register. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Force mode in OTG parts that support forcing USB controller mode. + // This bit is not writable in USB controllers that do not support + // forcing the mode. Not setting the USB_GPCS_DEVMOD bit makes this a + // force of host mode. + // + HWREGB(ui32Base + USB_O_GPCS) = USB_GPCS_DEVMODOTG; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to device. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to device mode. +//! +//! \note This function must only be called on microcontrollers that support +//! OTG operation and have the DEVMODOTG bit in the USBGPCS register. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the USB controller mode to device. + // + HWREGB(ui32Base + USB_O_GPCS) = USB_GPCS_DEVMODOTG | USB_GPCS_DEVMOD; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to OTG. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to OTG mode. This +//! function is only valid on microcontrollers that have the OTG capabilities. +//! +//! \return None. +// +//***************************************************************************** +void +USBOTGMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable the override of the USB controller mode when running on an OTG + // device. + // + HWREGB(ui32Base + USB_O_GPCS) = 0U; +} + +//***************************************************************************** +// +//! Powers off the USB PHY. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function powers off the USB PHY, reducing the current consuption +//! of the device. While in the powered-off state, the USB controller is +//! unable to operate. +//! +//! \return None. +// +//***************************************************************************** +void +USBPHYPowerOff(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the PWRDNPHY bit in the PHY, putting it into its low power mode. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_PWRDNPHY; +} + +//***************************************************************************** +// +//! Powers on the USB PHY. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function powers on the USB PHY, enabling it return to normal +//! operation. By default, the PHY is powered on, so this function must +//! only be called if USBPHYPowerOff() has previously been called. +//! +//! \return None. +// +//***************************************************************************** +void +USBPHYPowerOn(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Clear the PWRDNPHY bit in the PHY, putting it into normal operating + // mode. + // + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_PWRDNPHY; +} + +//***************************************************************************** +// +//! Sets the number of packets to request when transferring multiple bulk +//! packets. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint index to target for this write. +//! \param ui32Count is the number of packets to request. +//! +//! This function sets the number of consecutive bulk packets to request +//! when transferring multiple bulk packets with DMA. +//! +//! \note This feature is not available on all Tiva devices. Please +//! check the data sheet to determine if the USB controller has a DMA +//! controller or if it must use the uDMA controller for DMA transfers. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointPacketCountSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Count) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + HWREG(ui32Base + USB_O_RQPKTCOUNT1 + + (0x4U * (USBEPToIndex(ui32Endpoint) - 1U))) = ui32Count; +} + +//***************************************************************************** +// +//! Returns the number of USB endpoint pairs on the device. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the number of endpoint pairs supported by the USB +//! controller corresponding to the passed base address. The value returned is +//! the number of IN or OUT endpoints available and does not include endpoint 0 +//! (the control endpoint). For example, if 15 is returned, there are 15 IN +//! and 15 OUT endpoints available in addition to endpoint 0. +//! +//! \return Returns the number of IN or OUT endpoints available. +// +//***************************************************************************** +uint32_t +USBNumEndpointsGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Read the number of endpoints from the hardware. The number of TX and + // RX endpoints are always the same. + // + return(15U); +} + diff --git a/gpio_bitfield_cpu2/device/driverlib/usb.h b/gpio_bitfield_cpu2/device/driverlib/usb.h new file mode 100644 index 0000000..ae3c7ad --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/usb.h @@ -0,0 +1,560 @@ +//########################################################################### +// +// FILE: usb.h +// +// TITLE: Prototypes for the USB Interface Driver. +// +//########################################################################### +// +// +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef USB_H +#define USB_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup usb_api USB +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// The following are defines for the g_usUSBFlags variable +// +//***************************************************************************** +#define USB_VBUS_VALID 0x0001U +#define USB_ID_HOST 0x0002U +#define USB_ID_DEVICE 0x0000U +#define USB_PFLT_ACTIVE 0x0004U + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableControl() and +// USBIntDisableControl() as the ui32Flags parameter, and are returned from +// USBIntStatusControl(). +// +//***************************************************************************** +#define USB_INTCTRL_ALL 0x000003FFUL // All control interrupt sources +#define USB_INTCTRL_STATUS 0x000000FFUL // Status Interrupts +#define USB_INTCTRL_VBUS_ERR 0x00000080UL // VBUS Error +#define USB_INTCTRL_SESSION 0x00000040UL // Session Start Detected +#define USB_INTCTRL_SESSION_END 0x00000040UL // Session End Detected +#define USB_INTCTRL_DISCONNECT 0x00000020UL // Disconnect Detected +#define USB_INTCTRL_CONNECT 0x00000010UL // Device Connect Detected +#define USB_INTCTRL_SOF 0x00000008UL // Start of Frame Detected +#define USB_INTCTRL_BABBLE 0x00000004UL // Babble signaled +#define USB_INTCTRL_RESET 0x00000004UL // Reset signaled +#define USB_INTCTRL_RESUME 0x00000002UL // Resume detected +#define USB_INTCTRL_SUSPEND 0x00000001UL // Suspend detected +#define USB_INTCTRL_MODE_DETECT 0x00000200UL // Mode value valid +#define USB_INTCTRL_POWER_FAULT 0x00000100UL // Power Fault detected + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableEndpoint() and +// USBIntDisableEndpoint() as the ui32Flags parameter, and are returned from +// USBIntStatusEndpoint(). +// +//***************************************************************************** +#define USB_INTEP_ALL 0xFFFFFFFFUL // Host IN Interrupts +#define USB_INTEP_HOST_IN 0xFFFE0000UL // Host IN Interrupts +#define USB_INTEP_HOST_IN_15 0x80000000UL // Endpoint 15 Host IN Interrupt +#define USB_INTEP_HOST_IN_14 0x40000000UL // Endpoint 14 Host IN Interrupt +#define USB_INTEP_HOST_IN_13 0x20000000UL // Endpoint 13 Host IN Interrupt +#define USB_INTEP_HOST_IN_12 0x10000000UL // Endpoint 12 Host IN Interrupt +#define USB_INTEP_HOST_IN_11 0x08000000UL // Endpoint 11 Host IN Interrupt +#define USB_INTEP_HOST_IN_10 0x04000000UL // Endpoint 10 Host IN Interrupt +#define USB_INTEP_HOST_IN_9 0x02000000UL // Endpoint 9 Host IN Interrupt +#define USB_INTEP_HOST_IN_8 0x01000000UL // Endpoint 8 Host IN Interrupt +#define USB_INTEP_HOST_IN_7 0x00800000UL // Endpoint 7 Host IN Interrupt +#define USB_INTEP_HOST_IN_6 0x00400000UL // Endpoint 6 Host IN Interrupt +#define USB_INTEP_HOST_IN_5 0x00200000UL // Endpoint 5 Host IN Interrupt +#define USB_INTEP_HOST_IN_4 0x00100000UL // Endpoint 4 Host IN Interrupt +#define USB_INTEP_HOST_IN_3 0x00080000UL // Endpoint 3 Host IN Interrupt +#define USB_INTEP_HOST_IN_2 0x00040000UL // Endpoint 2 Host IN Interrupt +#define USB_INTEP_HOST_IN_1 0x00020000UL // Endpoint 1 Host IN Interrupt + +#define USB_INTEP_DEV_OUT 0xFFFE0000UL // Device OUT Interrupts +#define USB_INTEP_DEV_OUT_15 0x80000000UL // Endpoint 15 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_14 0x40000000UL // Endpoint 14 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_13 0x20000000UL // Endpoint 13 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_12 0x10000000UL // Endpoint 12 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_11 0x08000000UL // Endpoint 11 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_10 0x04000000UL // Endpoint 10 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_9 0x02000000UL // Endpoint 9 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_8 0x01000000UL // Endpoint 8 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_7 0x00800000UL // Endpoint 7 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_6 0x00400000UL // Endpoint 6 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_5 0x00200000UL // Endpoint 5 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_4 0x00100000UL // Endpoint 4 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_3 0x00080000UL // Endpoint 3 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_2 0x00040000UL // Endpoint 2 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_1 0x00020000UL // Endpoint 1 Device OUT Interrupt + +#define USB_INTEP_HOST_OUT 0x0000FFFEUL // Host OUT Interrupts +#define USB_INTEP_HOST_OUT_15 0x00008000UL // Endpoint 15 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_14 0x00004000UL // Endpoint 14 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_13 0x00002000UL // Endpoint 13 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_12 0x00001000UL // Endpoint 12 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_11 0x00000800UL // Endpoint 11 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_10 0x00000400UL // Endpoint 10 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_9 0x00000200UL // Endpoint 9 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_8 0x00000100UL // Endpoint 8 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_7 0x00000080UL // Endpoint 7 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_6 0x00000040UL // Endpoint 6 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_5 0x00000020UL // Endpoint 5 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_4 0x00000010UL // Endpoint 4 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_3 0x00000008UL // Endpoint 3 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_2 0x00000004UL // Endpoint 2 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_1 0x00000002UL // Endpoint 1 Host OUT Interrupt + +#define USB_INTEP_DEV_IN 0x0000FFFEUL // Device IN Interrupts +#define USB_INTEP_DEV_IN_15 0x00008000UL // Endpoint 15 Device IN Interrupt +#define USB_INTEP_DEV_IN_14 0x00004000UL // Endpoint 14 Device IN Interrupt +#define USB_INTEP_DEV_IN_13 0x00002000UL // Endpoint 13 Device IN Interrupt +#define USB_INTEP_DEV_IN_12 0x00001000UL // Endpoint 12 Device IN Interrupt +#define USB_INTEP_DEV_IN_11 0x00000800UL // Endpoint 11 Device IN Interrupt +#define USB_INTEP_DEV_IN_10 0x00000400UL // Endpoint 10 Device IN Interrupt +#define USB_INTEP_DEV_IN_9 0x00000200UL // Endpoint 9 Device IN Interrupt +#define USB_INTEP_DEV_IN_8 0x00000100UL // Endpoint 8 Device IN Interrupt +#define USB_INTEP_DEV_IN_7 0x00000080UL // Endpoint 7 Device IN Interrupt +#define USB_INTEP_DEV_IN_6 0x00000040UL // Endpoint 6 Device IN Interrupt +#define USB_INTEP_DEV_IN_5 0x00000020UL // Endpoint 5 Device IN Interrupt +#define USB_INTEP_DEV_IN_4 0x00000010UL // Endpoint 4 Device IN Interrupt +#define USB_INTEP_DEV_IN_3 0x00000008UL // Endpoint 3 Device IN Interrupt +#define USB_INTEP_DEV_IN_2 0x00000004UL // Endpoint 2 Device IN Interrupt +#define USB_INTEP_DEV_IN_1 0x00000002UL // Endpoint 1 Device IN Interrupt + +#define USB_INTEP_0 0x00000001UL // Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are values that are returned from USBSpeedGet(). +// +//***************************************************************************** +#define USB_UNDEF_SPEED 0x80000000UL // Current speed is undefined +#define USB_FULL_SPEED 0x00000001UL // Current speed is Full Speed +#define USB_LOW_SPEED 0x00000000UL // Current speed is Low Speed + +//***************************************************************************** +// +// The following are values that are returned from USBEndpointStatus(). The +// USB_HOST_* values are used when the USB controller is in host mode and the +// USB_DEV_* values are used when the USB controller is in device mode. +// +//***************************************************************************** +#define USB_HOST_IN_STATUS 0xFFFF0000UL // Mask of all host IN interrupts +#define USB_HOST_IN_PID_ERROR 0x10000000UL // Stall on this endpoint received +#define USB_HOST_IN_NOT_COMP 0x01000000UL // Device failed to respond +#define USB_HOST_IN_STALL 0x00400000UL // Stall on this endpoint received +#define USB_HOST_IN_DATA_ERROR 0x00080000UL // CRC or bit-stuff error + // (ISOC Mode) +#define USB_HOST_IN_NAK_TO 0x00080000UL // NAK received for more than the + // specified timeout period +#define USB_HOST_IN_ERROR 0x00040000UL // Failed to communicate with a + // device +#define USB_HOST_IN_FIFO_FULL 0x00020000UL // RX FIFO full +#define USB_HOST_IN_PKTRDY 0x00010000UL // Data packet ready +#define USB_HOST_OUT_STATUS 0x0000FFFFUL // Mask of all host OUT interrupts +#define USB_HOST_OUT_NAK_TO 0x00000080UL // NAK received for more than the + // specified timeout period +#define USB_HOST_OUT_NOT_COMP 0x00000080UL // No response from device + // (ISOC mode) +#define USB_HOST_OUT_STALL 0x00000020UL // Stall on this endpoint received +#define USB_HOST_OUT_ERROR 0x00000004UL // Failed to communicate with a + // device +#define USB_HOST_OUT_FIFO_NE 0x00000002UL // TX FIFO is not empty +#define USB_HOST_OUT_PKTPEND 0x00000001UL // Transmit still being transmitted +#define USB_HOST_EP0_NAK_TO 0x00000080UL // NAK received for more than the + // specified timeout period +#define USB_HOST_EP0_STATUS 0x00000040UL // This was a status packet +#define USB_HOST_EP0_ERROR 0x00000010UL // Failed to communicate with a + // device +#define USB_HOST_EP0_RX_STALL 0x00000004UL // Stall on this endpoint received +#define USB_HOST_EP0_RXPKTRDY 0x00000001UL // Receive data packet ready +#define USB_DEV_RX_PID_ERROR 0x01000000UL // PID error in isochronous + // transfer +#define USB_DEV_RX_SENT_STALL 0x00400000UL // Stall was sent on this endpoint +#define USB_DEV_RX_DATA_ERROR 0x00080000UL // CRC error on the data +#define USB_DEV_RX_OVERRUN 0x00040000UL // OUT packet was not loaded due to + // a full FIFO +#define USB_DEV_RX_FIFO_FULL 0x00020000UL // RX FIFO full +#define USB_DEV_RX_PKT_RDY 0x00010000UL // Data packet ready +#define USB_DEV_TX_NOT_COMP 0x00000080UL // Large packet split up, more data + // to come +#define USB_DEV_TX_SENT_STALL 0x00000020UL // Stall was sent on this endpoint +#define USB_DEV_TX_UNDERRUN 0x00000004UL // IN received with no data ready +#define USB_DEV_TX_FIFO_NE 0x00000002UL // The TX FIFO is not empty +#define USB_DEV_TX_TXPKTRDY 0x00000001UL // Transmit still being transmitted +#define USB_DEV_EP0_SETUP_END 0x00000010UL // Control transaction ended before + // Data End seen +#define USB_DEV_EP0_SENT_STALL 0x00000004UL // Stall was sent on this endpoint +#define USB_DEV_EP0_IN_PKTPEND 0x00000002UL // Transmit data packet pending +#define USB_DEV_EP0_OUT_PKTRDY 0x00000001UL // Receive data packet ready + +//***************************************************************************** +// +// The following are values that can be passed to USBHostEndpointConfig() and +// USBDevEndpointConfigSet() as the ui32Flags parameter. +// +//***************************************************************************** +#define USB_EP_AUTO_SET 0x00000001UL // Auto set feature enabled +#define USB_EP_AUTO_REQUEST 0x00000002UL // Auto request feature enabled +#define USB_EP_AUTO_CLEAR 0x00000004UL // Auto clear feature enabled +#define USB_EP_DMA_MODE_0 0x00000008UL // Enable DMA access using mode 0 +#define USB_EP_DMA_MODE_1 0x00000010UL // Enable DMA access using mode 1 +#define USB_EP_MODE_ISOC 0x00000000UL // Isochronous endpoint +#define USB_EP_MODE_BULK 0x00000100UL // Bulk endpoint +#define USB_EP_MODE_INT 0x00000200UL // Interrupt endpoint +#define USB_EP_MODE_CTRL 0x00000300UL // Control endpoint +#define USB_EP_MODE_MASK 0x00000300UL // Mode Mask +#define USB_EP_SPEED_LOW 0x00000000UL // Low Speed +#define USB_EP_SPEED_FULL 0x00001000UL // Full Speed +#define USB_EP_HOST_IN 0x00000000UL // Host IN endpoint +#define USB_EP_HOST_OUT 0x00002000UL // Host OUT endpoint +#define USB_EP_DEV_IN 0x00002000UL // Device IN endpoint +#define USB_EP_DEV_OUT 0x00000000UL // Device OUT endpoint + +//***************************************************************************** +// +// The following are values that can be passed to USBHostPwrConfig() as the +// ui32Flags parameter. +// +//***************************************************************************** +#define USB_HOST_PWRFLT_LOW 0x00000010UL +#define USB_HOST_PWRFLT_HIGH 0x00000030UL +#define USB_HOST_PWRFLT_EP_NONE 0x00000000UL +#define USB_HOST_PWRFLT_EP_TRI 0x00000140UL +#define USB_HOST_PWRFLT_EP_LOW 0x00000240UL +#define USB_HOST_PWRFLT_EP_HIGH 0x00000340UL +#define USB_HOST_PWREN_MAN_LOW 0x00000000UL +#define USB_HOST_PWREN_MAN_HIGH 0x00000001UL +#define USB_HOST_PWREN_AUTOLOW 0x00000002UL +#define USB_HOST_PWREN_AUTOHIGH 0x00000003UL +#define USB_HOST_PWREN_FILTER 0x00010000UL + +//***************************************************************************** +// +// This value specifies the maximum size of transfers on endpoint 0 as 64 +// bytes. This value is fixed in hardware as the FIFO size for endpoint 0. +// +//***************************************************************************** +#define MAX_PACKET_SIZE_EP0 64U + +//***************************************************************************** +// +// These values are used to indicate which endpoint to access. +// +//***************************************************************************** +#define USB_EP_0 0x00000000UL // Endpoint 0 +#define USB_EP_1 0x00000010UL // Endpoint 1 +#define USB_EP_2 0x00000020UL // Endpoint 2 +#define USB_EP_3 0x00000030UL // Endpoint 3 +#define USB_EP_4 0x00000040UL // Endpoint 4 +#define USB_EP_5 0x00000050UL // Endpoint 5 +#define USB_EP_6 0x00000060UL // Endpoint 6 +#define USB_EP_7 0x00000070UL // Endpoint 7 +#define USB_EP_8 0x00000080UL // Endpoint 8 +#define USB_EP_9 0x00000090UL // Endpoint 9 +#define USB_EP_10 0x000000A0UL // Endpoint 10 +#define USB_EP_11 0x000000B0UL // Endpoint 11 +#define USB_EP_12 0x000000C0UL // Endpoint 12 +#define USB_EP_13 0x000000D0UL // Endpoint 13 +#define USB_EP_14 0x000000E0UL // Endpoint 14 +#define USB_EP_15 0x000000F0UL // Endpoint 15 +#define NUM_USB_EP 16U // Number of supported endpoints + +//***************************************************************************** +// +// These macros allow conversion between 0-based endpoint indices and the +// USB_EP_x values required when calling various USB APIs. +// +//***************************************************************************** +#define IndexToUSBEP(x) (((uint32_t)(x) << 4U) & 0xFFU) +#define USBEPToIndex(x) ((x) >> 4U) + +//***************************************************************************** +// +// The following are values that can be passed to USBFIFOConfigSet() as the +// ui32FIFOSize parameter. +// +//***************************************************************************** +#define USB_FIFO_SZ_8 0x00000000UL // 8 byte FIFO +#define USB_FIFO_SZ_16 0x00000001UL // 16 byte FIFO +#define USB_FIFO_SZ_32 0x00000002UL // 32 byte FIFO +#define USB_FIFO_SZ_64 0x00000003UL // 64 byte FIFO +#define USB_FIFO_SZ_128 0x00000004UL // 128 byte FIFO +#define USB_FIFO_SZ_256 0x00000005UL // 256 byte FIFO +#define USB_FIFO_SZ_512 0x00000006UL // 512 byte FIFO +#define USB_FIFO_SZ_1024 0x00000007UL // 1024 byte FIFO +#define USB_FIFO_SZ_2048 0x00000008UL // 2048 byte FIFO +#define USB_FIFO_SZ_4096 0x00000009UL // 4096 byte FIFO +#define USB_FIFO_SZ_8_DB 0x00000010UL // 8 byte double buffered FIFO + // (occupying 16 bytes) +#define USB_FIFO_SZ_16_DB 0x00000011UL // 16 byte double buffered FIFO + // (occupying 32 bytes) +#define USB_FIFO_SZ_32_DB 0x00000012UL // 32 byte double buffered FIFO + // (occupying 64 bytes) +#define USB_FIFO_SZ_64_DB 0x00000013UL // 64 byte double buffered FIFO + // (occupying 128 bytes) +#define USB_FIFO_SZ_128_DB 0x00000014UL // 128 byte double buffered FIFO + // (occupying 256 bytes) +#define USB_FIFO_SZ_256_DB 0x00000015UL // 256 byte double buffered FIFO + // (occupying 512 bytes) +#define USB_FIFO_SZ_512_DB 0x00000016UL // 512 byte double buffered FIFO + // (occupying 1024 bytes) +#define USB_FIFO_SZ_1024_DB 0x00000017UL // 1024 byte double buffered FIFO + // (occupying 2048 bytes) +#define USB_FIFO_SZ_2048_DB 0x00000018UL // 2048 byte double buffered FIFO + // (occupying 4096 bytes) + +//***************************************************************************** +// +// This macro allow conversion from a FIFO size label as defined above to +// a number of bytes +// +//***************************************************************************** +#define USB_FIFO_SIZE_DB_FLAG 0x00000010UL +#define USBFIFOSizeToBytes(x) ((uint32_t)8U << (x)) + +//***************************************************************************** +// +// The following are values that can be passed to USBEndpointDataSend() as the +// ui32TransType parameter. +// +//***************************************************************************** +#define USB_TRANS_OUT 0x00000102UL // Normal OUT transaction +#define USB_TRANS_IN 0x00000102UL // Normal IN transaction +#define USB_TRANS_IN_LAST 0x0000010AUL // Final IN transaction (for + // endpoint 0 in device mode) +#define USB_TRANS_SETUP 0x0000110AUL // Setup transaction (for endpoint + // 0) +#define USB_TRANS_STATUS 0x00000142UL // Status transaction (for endpoint + // 0) + +//***************************************************************************** +// +// The following are values are returned by the USBModeGet function. +// +//***************************************************************************** +#define USB_DUAL_MODE_HOST 0x00000001UL // Dual mode controller is in Host + // mode. +#define USB_DUAL_MODE_DEVICE 0x00000081UL // Dual mode controller is in + // Device mode. +#define USB_DUAL_MODE_NONE 0x00000080UL // Dual mode controller mode is not + // set. +#define USB_OTG_MODE_ASIDE_HOST 0x0000001DUL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_NPWR 0x00000001UL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_SESS 0x00000009UL // OTG controller on the A side of + // the cable Session Valid. +#define USB_OTG_MODE_ASIDE_AVAL 0x00000011UL // OTG controller on the A side of + // the cable A valid. +#define USB_OTG_MODE_ASIDE_DEV 0x00000019UL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_BSIDE_HOST 0x0000009DUL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_DEV 0x00000099UL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_NPWR 0x00000081UL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_NONE 0x00000080UL // OTG controller mode is not set. + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern uint32_t USBDevAddrGet(uint32_t ui32Base); +extern void USBDevAddrSet(uint32_t ui32Base, uint32_t ui32Address); +extern void USBDevConnect(uint32_t ui32Base); +extern void USBDevDisconnect(uint32_t ui32Base); +extern void USBDevEndpointConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, + uint32_t ui32Flags); +extern void USBDevEndpointConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32MaxPacketSize, + uint32_t *pui32Flags); +extern void USBDevEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bIsLastPacket); +extern void USBDevEndpointStall(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBDevEndpointStallClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBDevEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBEndpointDataAvail(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBEndpointDMAEnable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointDMADisable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointDMAConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Config); +extern int32_t USBEndpointDataGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t *pui32Size); +extern int32_t USBEndpointDataPut(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t ui32Size); +extern int32_t USBEndpointDataSend(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32TransType); +extern void USBEndpointDataToggleClear(uint32_t ui32Base, + uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointPacketCountSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Count); +extern uint32_t USBEndpointStatus(uint32_t ui32Base, uint32_t ui32Endpoint); +extern uint32_t USBFIFOAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBFIFOConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32FIFOAddress, + uint32_t *pui32FIFOSize, uint32_t ui32Flags); +extern void USBFIFOConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32FIFOAddress, uint32_t ui32FIFOSize, + uint32_t ui32Flags); +extern void USBFIFOFlush(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBFrameNumberGet(uint32_t ui32Base); +extern uint32_t USBHostAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBHostAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Addr, uint32_t ui32Flags); +extern void USBHostEndpointConfig(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, + uint32_t ui32NAKPollInterval, + uint32_t ui32TargetEndpoint, + uint32_t ui32Flags); +extern void USBHostEndpointDataAck(uint32_t ui32Base, + uint32_t ui32Endpoint); +extern void USBHostEndpointDataToggle(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bDataToggle, uint32_t ui32Flags); +extern void USBHostEndpointStatusClear(uint32_t ui32Base, + uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBHostHubAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBHostHubAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Addr, uint32_t ui32Flags); +extern void USBHostPwrDisable(uint32_t ui32Base); +extern void USBHostPwrEnable(uint32_t ui32Base); +extern void USBHostPwrConfig(uint32_t ui32Base, uint32_t ui32Flags); +extern void USBHostPwrFaultDisable(uint32_t ui32Base); +extern void USBHostPwrFaultEnable(uint32_t ui32Base); +extern void USBHostRequestIN(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBHostRequestINClear(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBHostRequestStatus(uint32_t ui32Base); +extern void USBHostReset(uint32_t ui32Base, bool bStart); +extern void USBHostResume(uint32_t ui32Base, bool bStart); +extern uint32_t USBHostSpeedGet(uint32_t ui32Base); +extern void USBHostSuspend(uint32_t ui32Base); +extern void USBIntDisableControl(uint32_t ui32Base, uint32_t ui32IntFlags); +extern void USBIntEnableControl(uint32_t ui32Base, uint32_t ui32IntFlags); +extern uint32_t USBIntStatus(uint32_t ui32Base, uint32_t *ui32IntStatusEP); +extern uint32_t USBIntStatusControl(uint32_t ui32Base); +extern void USBIntDisableEndpoint(uint32_t ui32Base, uint32_t ui32IntFlags); +extern void USBIntEnableEndpoint(uint32_t ui32Base, uint32_t ui32IntFlags); +extern uint32_t USBIntStatusEndpoint(uint32_t ui32Base); +extern void USBOTGSessionRequest(uint32_t ui32Base, bool bStart); +extern uint32_t USBModeGet(uint32_t ui32Base); +extern void USBEndpointDMAChannel(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Channel); +extern void USBHostMode(uint32_t ui32Base); +extern void USBDevMode(uint32_t ui32Base); +extern void USBOTGMode(uint32_t ui32Base); +extern void USBPHYPowerOff(uint32_t ui32Base); +extern void USBPHYPowerOn(uint32_t ui32Base); +extern uint32_t USBNumEndpointsGet(uint32_t ui32Base); + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnable() and +// USBIntDisable() as the ulIntFlags parameter, and are returned from +// USBIntStatus(). +// +//***************************************************************************** +#define USB_INT_ALL 0xFF030E0FUL // All Interrupt sources +#define USB_INT_STATUS 0xFF000000UL // Status Interrupts +#define USB_INT_VBUS_ERR 0x80000000UL // VBUS Error +#define USB_INT_SESSION_START 0x40000000UL // Session Start Detected +#define USB_INT_SESSION_END 0x20000000UL // Session End Detected +#define USB_INT_DISCONNECT 0x20000000UL // Disconnect Detected +#define USB_INT_CONNECT 0x10000000UL // Device Connect Detected +#define USB_INT_SOF 0x08000000UL // Start of Frame Detected +#define USB_INT_BABBLE 0x04000000UL // Babble signaled +#define USB_INT_RESET 0x04000000UL // Reset signaled +#define USB_INT_RESUME 0x02000000UL // Resume detected +#define USB_INT_SUSPEND 0x01000000UL // Suspend detected +#define USB_INT_MODE_DETECT 0x00020000UL // Mode value valid +#define USB_INT_POWER_FAULT 0x00010000UL // Power Fault detected +#define USB_INT_HOST_IN 0x00000E00UL // Host IN Interrupts +#define USB_INT_DEV_OUT 0x00000E00UL // Device OUT Interrupts +#define USB_INT_HOST_IN_EP3 0x00000800UL // Endpoint 3 Host IN Interrupt +#define USB_INT_HOST_IN_EP2 0x00000400UL // Endpoint 2 Host IN Interrupt +#define USB_INT_HOST_IN_EP1 0x00000200UL // Endpoint 1 Host IN Interrupt +#define USB_INT_DEV_OUT_EP3 0x00000800UL // Endpoint 3 Device OUT Interrupt +#define USB_INT_DEV_OUT_EP2 0x00000400UL // Endpoint 2 Device OUT Interrupt +#define USB_INT_DEV_OUT_EP1 0x00000200UL // Endpoint 1 Device OUT Interrupt +#define USB_INT_HOST_OUT 0x0000000EUL // Host OUT Interrupts +#define USB_INT_DEV_IN 0x0000000EUL // Device IN Interrupts +#define USB_INT_HOST_OUT_EP3 0x00000008UL // Endpoint 3 HOST_OUT Interrupt +#define USB_INT_HOST_OUT_EP2 0x00000004UL // Endpoint 2 HOST_OUT Interrupt +#define USB_INT_HOST_OUT_EP1 0x00000002UL // Endpoint 1 HOST_OUT Interrupt +#define USB_INT_DEV_IN_EP3 0x00000008UL // Endpoint 3 DEV_IN Interrupt +#define USB_INT_DEV_IN_EP2 0x00000004UL // Endpoint 2 DEV_IN Interrupt +#define USB_INT_DEV_IN_EP1 0x00000002UL // Endpoint 1 DEV_IN Interrupt +#define USB_INT_EP0 0x00000001UL // Endpoint 0 Interrupt + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // USB_H diff --git a/gpio_bitfield_cpu2/device/driverlib/version.c b/gpio_bitfield_cpu2/device/driverlib/version.c new file mode 100644 index 0000000..ced29c1 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/version.c @@ -0,0 +1,54 @@ +//########################################################################### +// +// FILE: version.c +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "version.h" + +//***************************************************************************** +// +// Version_getLibVersion +// +//***************************************************************************** +uint32_t +Version_getLibVersion(void) +{ + return(VERSION_NUMBER); +} diff --git a/gpio_bitfield_cpu2/device/driverlib/version.h b/gpio_bitfield_cpu2/device/driverlib/version.h new file mode 100644 index 0000000..8a3b431 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/version.h @@ -0,0 +1,101 @@ +//########################################################################### +// +// FILE: version.h +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef VERSION_H +#define VERSION_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup version_api Version +//! @{ +// +//***************************************************************************** +#include + +//! Version number to be returned by Version_getLibVersion() +//! +#define VERSION_NUMBER 26000000U + +//***************************************************************************** +// +//! Returns the driverlib version number +//! +//! This function can be used to check the version number of the driverlib.lib +//! that is in use. The version number will take the format yy.mm.pp.bb, so for +//! yy-Year, mm-Major Release version, pp-Patch Release Version, bb- Build Number. +//! example, if the function returns 26000000, the driverlib version being used +//! is 26.00.00.00. +//! +//! \return Returns an integer value indicating the driverlib version. +// +//***************************************************************************** +extern uint32_t +Version_getLibVersion(void); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // VERSION_H diff --git a/gpio_bitfield_cpu2/device/driverlib/xbar.c b/gpio_bitfield_cpu2/device/driverlib/xbar.c new file mode 100644 index 0000000..008145a --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/xbar.c @@ -0,0 +1,255 @@ +//########################################################################### +// +// FILE: xbar.c +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "xbar.h" + +//***************************************************************************** +// +// XBAR_setOutputMuxConfig +// +//***************************************************************************** +void +XBAR_setOutputMuxConfig(XBAR_OutputNum output, XBAR_OutputMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)output << 1U) + 2U; + } + else + { + offset = (uint16_t)output << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR output. + // + EALLOW; + + HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) = + (HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) & + ~((uint32_t)0x3U << shift)) | + (((uint32_t)muxConfig & 0x3U) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_setEPWMMuxConfig +// +//***************************************************************************** +void +XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)trip << 1U) + 2U; + } + else + { + offset = (uint16_t)trip << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR trip. + // + EALLOW; + + HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) = + (HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | + (((uint32_t)muxConfig & 0x3UL) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_setCLBMuxConfig +// +//***************************************************************************** +void +XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal, XBAR_CLBMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)auxSignal << 1U) + 2U; + } + else + { + offset = (uint16_t)auxSignal << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR auxSignal. + // + EALLOW; + + + HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) = + (HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | + (((uint32_t)muxConfig & 0x3UL) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_getInputFlagStatus +// +//***************************************************************************** +bool +XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag) +{ + uint32_t offset; + uint32_t inputMask; + + // + // Determine flag register offset. + // + switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) + { + case XBAR_INPUT_FLG_REG_1: + offset = XBAR_O_FLG1; + break; + + case XBAR_INPUT_FLG_REG_2: + offset = XBAR_O_FLG2; + break; + + case XBAR_INPUT_FLG_REG_3: + offset = XBAR_O_FLG3; + break; + + default: + // + // This should never happen if a valid inputFlag value is used. + // + offset = 0U; + break; + } + + // + // Get the status of the X-BAR input latch. + // + inputMask = (uint32_t)1U << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); + + return((HWREG(XBAR_BASE + offset) & inputMask) != 0U); +} + +//***************************************************************************** +// +// XBAR_clearInputFlag +// +//***************************************************************************** +void +XBAR_clearInputFlag(XBAR_InputFlag inputFlag) +{ + uint32_t offset; + uint32_t inputMask; + + // + // Determine flag clear register offset. + // + switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) + { + case XBAR_INPUT_FLG_REG_1: + offset = XBAR_O_CLR1; + break; + + case XBAR_INPUT_FLG_REG_2: + offset = XBAR_O_CLR2; + break; + + case XBAR_INPUT_FLG_REG_3: + offset = XBAR_O_CLR3; + break; + + default: + // + // This should never happen if a valid inputFlag value is used. + // + offset = 0U; + break; + } + + // + // Set the bit that clears the X-BAR input latch. + // + inputMask = 1UL << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); + HWREG(XBAR_BASE + offset) = inputMask; +} diff --git a/gpio_bitfield_cpu2/device/driverlib/xbar.h b/gpio_bitfield_cpu2/device/driverlib/xbar.h new file mode 100644 index 0000000..02e4e68 --- /dev/null +++ b/gpio_bitfield_cpu2/device/driverlib/xbar.h @@ -0,0 +1,1294 @@ +//########################################################################### +// +// FILE: xbar.h +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef XBAR_H +#define XBAR_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup xbar_api XBAR +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_clbxbar.h" +#include "inc/hw_epwmxbar.h" +#include "inc/hw_inputxbar.h" +#include "inc/hw_outputxbar.h" +#include "inc/hw_xbar.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. +// Not intended for use by application code. +// +//***************************************************************************** +#define XBAR_OUTPUT_CFG_REG_BASE (OUTPUTXBAR_BASE + XBAR_O_OUTPUT1MUX0TO15CFG) +#define XBAR_OUTPUT_EN_REG_BASE (OUTPUTXBAR_BASE + XBAR_O_OUTPUT1MUXENABLE) +#define XBAR_EPWM_CFG_REG_BASE (EPWMXBAR_BASE + XBAR_O_TRIP4MUX0TO15CFG) +#define XBAR_EPWM_EN_REG_BASE (EPWMXBAR_BASE + XBAR_O_TRIP4MUXENABLE) +#define XBAR_CLB_CFG_REG_BASE (CLBXBAR_BASE + XBAR_O_AUXSIG0MUX0TO15CFG) +#define XBAR_CLB_EN_REG_BASE (CLBXBAR_BASE + XBAR_O_AUXSIG0MUXENABLE) +#define XBAR_INPUT_BASE (INPUTXBAR_BASE + XBAR_O_INPUT1SELECT) + +#define XBAR_INPUT_FLG_INPUT_M 0x00FFU +#define XBAR_INPUT_FLG_REG_M 0xFF00U +#define XBAR_INPUT_FLG_REG_1 0x0000U +#define XBAR_INPUT_FLG_REG_2 0x0100U +#define XBAR_INPUT_FLG_REG_3 0x0200U + +#define XBAR_GPIO_MAX_CNT 168U + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following values define the muxes parameter for XBAR_enableEPWMMux(), +// XBAR_enableOutputMux(), XBAR_disableEPWMMux(), and +// XBAR_disableOutputMux(). +// +//***************************************************************************** +#define XBAR_MUX00 0x00000001U //!< Mask for X-BAR mux 0 +#define XBAR_MUX01 0x00000002U //!< Mask for X-BAR mux 1 +#define XBAR_MUX02 0x00000004U //!< Mask for X-BAR mux 2 +#define XBAR_MUX03 0x00000008U //!< Mask for X-BAR mux 3 +#define XBAR_MUX04 0x00000010U //!< Mask for X-BAR mux 4 +#define XBAR_MUX05 0x00000020U //!< Mask for X-BAR mux 5 +#define XBAR_MUX06 0x00000040U //!< Mask for X-BAR mux 6 +#define XBAR_MUX07 0x00000080U //!< Mask for X-BAR mux 7 +#define XBAR_MUX08 0x00000100U //!< Mask for X-BAR mux 8 +#define XBAR_MUX09 0x00000200U //!< Mask for X-BAR mux 9 +#define XBAR_MUX10 0x00000400U //!< Mask for X-BAR mux 10 +#define XBAR_MUX11 0x00000800U //!< Mask for X-BAR mux 11 +#define XBAR_MUX12 0x00001000U //!< Mask for X-BAR mux 12 +#define XBAR_MUX13 0x00002000U //!< Mask for X-BAR mux 13 +#define XBAR_MUX14 0x00004000U //!< Mask for X-BAR mux 14 +#define XBAR_MUX15 0x00008000U //!< Mask for X-BAR mux 15 +#define XBAR_MUX16 0x00010000U //!< Mask for X-BAR mux 16 +#define XBAR_MUX17 0x00020000U //!< Mask for X-BAR mux 17 +#define XBAR_MUX18 0x00040000U //!< Mask for X-BAR mux 18 +#define XBAR_MUX19 0x00080000U //!< Mask for X-BAR mux 19 +#define XBAR_MUX20 0x00100000U //!< Mask for X-BAR mux 20 +#define XBAR_MUX21 0x00200000U //!< Mask for X-BAR mux 21 +#define XBAR_MUX22 0x00400000U //!< Mask for X-BAR mux 22 +#define XBAR_MUX23 0x00800000U //!< Mask for X-BAR mux 23 +#define XBAR_MUX24 0x01000000U //!< Mask for X-BAR mux 24 +#define XBAR_MUX25 0x02000000U //!< Mask for X-BAR mux 25 +#define XBAR_MUX26 0x04000000U //!< Mask for X-BAR mux 26 +#define XBAR_MUX27 0x08000000U //!< Mask for X-BAR mux 27 +#define XBAR_MUX28 0x10000000U //!< Mask for X-BAR mux 28 +#define XBAR_MUX29 0x20000000U //!< Mask for X-BAR mux 29 +#define XBAR_MUX30 0x40000000U //!< Mask for X-BAR mux 30 +#define XBAR_MUX31 0x80000000U //!< Mask for X-BAR mux 31 +#endif + +//***************************************************************************** +// +//! The following values define the \e output parameter for +//! XBAR_setOutputMuxConfig(), XBAR_enableOutputMux(), and +//! XBAR_disableOutputMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_OUTPUT1 = 0, //!< OUTPUT1 of the Output X-BAR + XBAR_OUTPUT2 = 2, //!< OUTPUT2 of the Output X-BAR + XBAR_OUTPUT3 = 4, //!< OUTPUT3 of the Output X-BAR + XBAR_OUTPUT4 = 6, //!< OUTPUT4 of the Output X-BAR + XBAR_OUTPUT5 = 8, //!< OUTPUT5 of the Output X-BAR + XBAR_OUTPUT6 = 10, //!< OUTPUT6 of the Output X-BAR + XBAR_OUTPUT7 = 12, //!< OUTPUT7 of the Output X-BAR + XBAR_OUTPUT8 = 14, //!< OUTPUT8 of the Output X-BAR +} XBAR_OutputNum; + +//***************************************************************************** +// +//! The following values define the \e trip parameter for +//! XBAR_setEPWMMuxConfig(), XBAR_invertEPWMSignal(), XBAR_enableEPWMMux(), +//! and XBAR_disableEPWMMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_TRIP4 = 0, //!< TRIP4 of the ePWM X-BAR + XBAR_TRIP5 = 2, //!< TRIP5 of the ePWM X-BAR + XBAR_TRIP7 = 4, //!< TRIP7 of the ePWM X-BAR + XBAR_TRIP8 = 6, //!< TRIP8 of the ePWM X-BAR + XBAR_TRIP9 = 8, //!< TRIP9 of the ePWM X-BAR + XBAR_TRIP10 = 10, //!< TRIP10 of the ePWM X-BAR + XBAR_TRIP11 = 12, //!< TRIP11 of the ePWM X-BAR + XBAR_TRIP12 = 14 //!< TRIP12 of the ePWM X-BAR +} XBAR_TripNum; + +//***************************************************************************** +// +// The following values define the trip parameter for XBAR_setCLBMuxConfig(), +// XBAR_enableCLBMux(), and XBAR_disableCLBMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_AUXSIG0 = 0, + XBAR_AUXSIG1 = 2, + XBAR_AUXSIG2 = 4, + XBAR_AUXSIG3 = 6, + XBAR_AUXSIG4 = 8, + XBAR_AUXSIG5 = 10, + XBAR_AUXSIG6 = 12, + XBAR_AUXSIG7 = 14 +} XBAR_AuxSigNum; + +//***************************************************************************** +// +//! The following values define the \e input parameter for XBAR_setInputPin(). +// +//***************************************************************************** +typedef enum +{ + XBAR_INPUT1, //!< ePWM[TZ1], ePWM[TRIP1], X-BARs + XBAR_INPUT2, //!< ePWM[TZ2], ePWM[TRIP2], X-BARs + XBAR_INPUT3, //!< ePWM[TZ3], ePWM[TRIP3], X-BARs + XBAR_INPUT4, //!< ADC wrappers, X-BARs, XINT1 + XBAR_INPUT5, //!< EXTSYNCIN1, X-BARs, XINT2 + XBAR_INPUT6, //!< EXTSYNCIN2, ePWM[TRIP6], X-BARs, XINT3 + XBAR_INPUT7, //!< eCAP1, X-BARs + XBAR_INPUT8, //!< eCAP2, X-BARs + XBAR_INPUT9, //!< eCAP3, X-BARs + XBAR_INPUT10, //!< eCAP4, X-BARs + XBAR_INPUT11, //!< eCAP5, X-BARs + XBAR_INPUT12, //!< eCAP6, X-BARs + XBAR_INPUT13, //!< XINT4, X-BARs + XBAR_INPUT14 //!< XINT5, X-BARs +} XBAR_InputNum; + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +//! The following values define the \e muxConfig parameter for +//! XBAR_setOutputMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + // + //OUTPUTXBAR + // + XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH = 0x0000, + XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH_OR_L = 0x0001, + XBAR_OUT_MUX00_ADCAEVT1 = 0x0002, + XBAR_OUT_MUX00_ECAP1_OUT = 0x0003, + XBAR_OUT_MUX01_CMPSS1_CTRIPOUTL = 0x0200, + XBAR_OUT_MUX01_INPUTXBAR1 = 0x0201, + XBAR_OUT_MUX01_CLB1_OUT4 = 0x0202, + XBAR_OUT_MUX01_ADCCEVT1 = 0x0203, + XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH = 0x0400, + XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH_OR_L = 0x0401, + XBAR_OUT_MUX02_ADCAEVT2 = 0x0402, + XBAR_OUT_MUX02_ECAP2_OUT = 0x0403, + XBAR_OUT_MUX03_CMPSS2_CTRIPOUTL = 0x0600, + XBAR_OUT_MUX03_INPUTXBAR2 = 0x0601, + XBAR_OUT_MUX03_CLB1_OUT5 = 0x0602, + XBAR_OUT_MUX03_ADCCEVT2 = 0x0603, + XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH = 0x0800, + XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH_OR_L = 0x0801, + XBAR_OUT_MUX04_ADCAEVT3 = 0x0802, + XBAR_OUT_MUX04_ECAP3_OUT = 0x0803, + XBAR_OUT_MUX05_CMPSS3_CTRIPOUTL = 0x0A00, + XBAR_OUT_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_OUT_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_OUT_MUX05_ADCCEVT3 = 0x0A03, + XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH = 0x0C00, + XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH_OR_L = 0x0C01, + XBAR_OUT_MUX06_ADCAEVT4 = 0x0C02, + XBAR_OUT_MUX06_ECAP4_OUT = 0x0C03, + XBAR_OUT_MUX07_CMPSS4_CTRIPOUTL = 0x0E00, + XBAR_OUT_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_OUT_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_OUT_MUX07_ADCCEVT4 = 0x0E03, + XBAR_OUT_MUX08_CMPSS5_CTRIPOUTH = 0x1000, + XBAR_OUT_MUX08_CMPSS5_CTRIPOUTH_OR_L = 0x1001, + XBAR_OUT_MUX08_ADCBEVT1 = 0x1002, + XBAR_OUT_MUX08_ECAP5_OUT = 0x1003, + XBAR_OUT_MUX09_CMPSS5_CTRIPOUTL = 0x1200, + XBAR_OUT_MUX09_INPUTXBAR5 = 0x1201, + XBAR_OUT_MUX09_CLB3_OUT4 = 0x1202, + XBAR_OUT_MUX09_ADCDEVT1 = 0x1203, + XBAR_OUT_MUX10_CMPSS6_CTRIPOUTH = 0x1400, + XBAR_OUT_MUX10_CMPSS6_CTRIPOUTH_OR_L = 0x1401, + XBAR_OUT_MUX10_ADCBEVT2 = 0x1402, + XBAR_OUT_MUX10_ECAP6_OUT = 0x1403, + XBAR_OUT_MUX11_CMPSS6_CTRIPOUTL = 0x1600, + XBAR_OUT_MUX11_INPUTXBAR6 = 0x1601, + XBAR_OUT_MUX11_CLB3_OUT5 = 0x1602, + XBAR_OUT_MUX11_ADCDEVT2 = 0x1603, + XBAR_OUT_MUX12_CMPSS7_CTRIPOUTH = 0x1800, + XBAR_OUT_MUX12_CMPSS7_CTRIPOUTH_OR_L = 0x1801, + XBAR_OUT_MUX12_ADCBEVT3 = 0x1802, + XBAR_OUT_MUX13_CMPSS7_CTRIPOUTL = 0x1A00, + XBAR_OUT_MUX13_ADCSOCA = 0x1A01, + XBAR_OUT_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_OUT_MUX13_ADCDEVT3 = 0x1A03, + XBAR_OUT_MUX14_CMPSS8_CTRIPOUTH = 0x1C00, + XBAR_OUT_MUX14_CMPSS8_CTRIPOUTH_OR_L = 0x1C01, + XBAR_OUT_MUX14_ADCBEVT4 = 0x1C02, + XBAR_OUT_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_OUT_MUX15_CMPSS8_CTRIPOUTL = 0x1E00, + XBAR_OUT_MUX15_ADCSOCB = 0x1E01, + XBAR_OUT_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_OUT_MUX15_ADCDEVT4 = 0x1E03, + XBAR_OUT_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_OUT_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_OUT_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_OUT_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_OUT_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_OUT_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_OUT_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_OUT_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_OUT_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_OUT_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_OUT_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_OUT_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_OUT_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_OUT_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_OUT_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_OUT_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_OUT_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_OUT_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_OUT_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_OUT_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_OUT_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_OUT_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_OUT_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_OUT_MUX31_SD2FLT4_COMPL = 0x3E00, + +} XBAR_OutputMuxConfig; + +//***************************************************************************** +// +//! The following values define the \e muxConfig parameter for +//! XBAR_setEPWMMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + XBAR_EPWM_MUX00_CMPSS1_CTRIPH = 0x0000, + XBAR_EPWM_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001, + XBAR_EPWM_MUX00_ADCAEVT1 = 0x0002, + XBAR_EPWM_MUX00_ECAP1_OUT = 0x0003, + XBAR_EPWM_MUX01_CMPSS1_CTRIPL = 0x0200, + XBAR_EPWM_MUX01_INPUTXBAR1 = 0x0201, + XBAR_EPWM_MUX01_CLB1_OUT4 = 0x0202, + XBAR_EPWM_MUX01_ADCCEVT1 = 0x0203, + XBAR_EPWM_MUX02_CMPSS2_CTRIPH = 0x0400, + XBAR_EPWM_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401, + XBAR_EPWM_MUX02_ADCAEVT2 = 0x0402, + XBAR_EPWM_MUX02_ECAP2_OUT = 0x0403, + XBAR_EPWM_MUX03_CMPSS2_CTRIPL = 0x0600, + XBAR_EPWM_MUX03_INPUTXBAR2 = 0x0601, + XBAR_EPWM_MUX03_CLB1_OUT5 = 0x0602, + XBAR_EPWM_MUX03_ADCCEVT2 = 0x0603, + XBAR_EPWM_MUX04_CMPSS3_CTRIPH = 0x0800, + XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801, + XBAR_EPWM_MUX04_ADCAEVT3 = 0x0802, + XBAR_EPWM_MUX04_ECAP3_OUT = 0x0803, + XBAR_EPWM_MUX05_CMPSS3_CTRIPL = 0x0A00, + XBAR_EPWM_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_EPWM_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_EPWM_MUX05_ADCCEVT3 = 0x0A03, + XBAR_EPWM_MUX06_CMPSS4_CTRIPH = 0x0C00, + XBAR_EPWM_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01, + XBAR_EPWM_MUX06_ADCAEVT4 = 0x0C02, + XBAR_EPWM_MUX06_ECAP4_OUT = 0x0C03, + XBAR_EPWM_MUX07_CMPSS4_CTRIPL = 0x0E00, + XBAR_EPWM_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_EPWM_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_EPWM_MUX07_ADCCEVT4 = 0x0E03, + XBAR_EPWM_MUX08_CMPSS5_CTRIPH = 0x1000, + XBAR_EPWM_MUX08_CMPSS5_CTRIPH_OR_L = 0x1001, + XBAR_EPWM_MUX08_ADCBEVT1 = 0x1002, + XBAR_EPWM_MUX08_ECAP5_OUT = 0x1003, + XBAR_EPWM_MUX09_CMPSS5_CTRIPL = 0x1200, + XBAR_EPWM_MUX09_INPUTXBAR5 = 0x1201, + XBAR_EPWM_MUX09_CLB3_OUT4 = 0x1202, + XBAR_EPWM_MUX09_ADCDEVT1 = 0x1203, + XBAR_EPWM_MUX10_CMPSS6_CTRIPH = 0x1400, + XBAR_EPWM_MUX10_CMPSS6_CTRIPH_OR_L = 0x1401, + XBAR_EPWM_MUX10_ADCBEVT2 = 0x1402, + XBAR_EPWM_MUX10_ECAP6_OUT = 0x1403, + XBAR_EPWM_MUX11_CMPSS6_CTRIPL = 0x1600, + XBAR_EPWM_MUX11_INPUTXBAR6 = 0x1601, + XBAR_EPWM_MUX11_CLB3_OUT5 = 0x1602, + XBAR_EPWM_MUX11_ADCDEVT2 = 0x1603, + XBAR_EPWM_MUX12_CMPSS7_CTRIPH = 0x1800, + XBAR_EPWM_MUX12_CMPSS7_CTRIPH_OR_L = 0x1801, + XBAR_EPWM_MUX12_ADCBEVT3 = 0x1802, + XBAR_EPWM_MUX13_CMPSS7_CTRIPL = 0x1A00, + XBAR_EPWM_MUX13_ADCSOCA = 0x1A01, + XBAR_EPWM_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_EPWM_MUX13_ADCDEVT3 = 0x1A03, + XBAR_EPWM_MUX14_CMPSS8_CTRIPH = 0x1C00, + XBAR_EPWM_MUX14_CMPSS8_CTRIPH_OR_L = 0x1C01, + XBAR_EPWM_MUX14_ADCBEVT4 = 0x1C02, + XBAR_EPWM_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_EPWM_MUX15_CMPSS8_CTRIPL = 0x1E00, + XBAR_EPWM_MUX15_ADCSOCB = 0x1E01, + XBAR_EPWM_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_EPWM_MUX15_ADCDEVT4 = 0x1E03, + XBAR_EPWM_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_EPWM_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_EPWM_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_EPWM_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_EPWM_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_EPWM_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_EPWM_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_EPWM_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_EPWM_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_EPWM_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_EPWM_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_EPWM_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_EPWM_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_EPWM_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_EPWM_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_EPWM_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_EPWM_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_EPWM_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_EPWM_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_EPWM_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_EPWM_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_EPWM_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_EPWM_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_EPWM_MUX31_SD2FLT4_COMPL = 0x3E00 +} XBAR_EPWMMuxConfig; + +//***************************************************************************** +// +// The following values define the muxConfig parameter for +// XBAR_setCLBMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + XBAR_CLB_MUX00_CMPSS1_CTRIPH = 0x0000, + XBAR_CLB_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001, + XBAR_CLB_MUX00_ADCAEVT1 = 0x0002, + XBAR_CLB_MUX00_ECAP1_OUT = 0x0003, + XBAR_CLB_MUX01_CMPSS1_CTRIPL = 0x0200, + XBAR_CLB_MUX01_INPUTXBAR1 = 0x0201, + XBAR_CLB_MUX01_CLB1_OUT4 = 0x0202, + XBAR_CLB_MUX01_ADCCEVT1 = 0x0203, + XBAR_CLB_MUX02_CMPSS2_CTRIPH = 0x0400, + XBAR_CLB_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401, + XBAR_CLB_MUX02_ADCAEVT2 = 0x0402, + XBAR_CLB_MUX02_ECAP2_OUT = 0x0403, + XBAR_CLB_MUX03_CMPSS2_CTRIPL = 0x0600, + XBAR_CLB_MUX03_INPUTXBAR2 = 0x0601, + XBAR_CLB_MUX03_CLB1_OUT5 = 0x0602, + XBAR_CLB_MUX03_ADCCEVT2 = 0x0603, + XBAR_CLB_MUX04_CMPSS3_CTRIPH = 0x0800, + XBAR_CLB_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801, + XBAR_CLB_MUX04_ADCAEVT3 = 0x0802, + XBAR_CLB_MUX04_ECAP3_OUT = 0x0803, + XBAR_CLB_MUX05_CMPSS3_CTRIPL = 0x0A00, + XBAR_CLB_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_CLB_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_CLB_MUX05_ADCCEVT3 = 0x0A03, + XBAR_CLB_MUX06_CMPSS4_CTRIPH = 0x0C00, + XBAR_CLB_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01, + XBAR_CLB_MUX06_ADCAEVT4 = 0x0C02, + XBAR_CLB_MUX06_ECAP4_OUT = 0x0C03, + XBAR_CLB_MUX07_CMPSS4_CTRIPL = 0x0E00, + XBAR_CLB_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_CLB_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_CLB_MUX07_ADCCEVT4 = 0x0E03, + XBAR_CLB_MUX08_CMPSS5_CTRIPH = 0x1000, + XBAR_CLB_MUX08_CMPSS5_CTRIPH_OR_L = 0x1001, + XBAR_CLB_MUX08_ADCBEVT1 = 0x1002, + XBAR_CLB_MUX08_ECAP5_OUT = 0x1003, + XBAR_CLB_MUX09_CMPSS5_CTRIPL = 0x1200, + XBAR_CLB_MUX09_INPUTXBAR5 = 0x1201, + XBAR_CLB_MUX09_CLB3_OUT4 = 0x1202, + XBAR_CLB_MUX09_ADCDEVT1 = 0x1203, + XBAR_CLB_MUX10_CMPSS6_CTRIPH = 0x1400, + XBAR_CLB_MUX10_CMPSS6_CTRIPH_OR_L = 0x1401, + XBAR_CLB_MUX10_ADCBEVT2 = 0x1402, + XBAR_CLB_MUX10_ECAP6_OUT = 0x1403, + XBAR_CLB_MUX11_CMPSS6_CTRIPL = 0x1600, + XBAR_CLB_MUX11_INPUTXBAR6 = 0x1601, + XBAR_CLB_MUX11_CLB3_OUT5 = 0x1602, + XBAR_CLB_MUX11_ADCDEVT2 = 0x1603, + XBAR_CLB_MUX12_CMPSS7_CTRIPH = 0x1800, + XBAR_CLB_MUX12_CMPSS7_CTRIPH_OR_L = 0x1801, + XBAR_CLB_MUX12_ADCBEVT3 = 0x1802, + XBAR_CLB_MUX13_CMPSS7_CTRIPL = 0x1A00, + XBAR_CLB_MUX13_ADCSOCA = 0x1A01, + XBAR_CLB_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_CLB_MUX13_ADCDEVT3 = 0x1A03, + XBAR_CLB_MUX14_CMPSS8_CTRIPH = 0x1C00, + XBAR_CLB_MUX14_CMPSS8_CTRIPH_OR_L = 0x1C01, + XBAR_CLB_MUX14_ADCBEVT4 = 0x1C02, + XBAR_CLB_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_CLB_MUX15_CMPSS8_CTRIPL = 0x1E00, + XBAR_CLB_MUX15_ADCSOCB = 0x1E01, + XBAR_CLB_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_CLB_MUX15_ADCDEVT4 = 0x1E03, + XBAR_CLB_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_CLB_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_CLB_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_CLB_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_CLB_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_CLB_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_CLB_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_CLB_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_CLB_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_CLB_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_CLB_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_CLB_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_CLB_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_CLB_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_CLB_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_CLB_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_CLB_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_CLB_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_CLB_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_CLB_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_CLB_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_CLB_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_CLB_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_CLB_MUX31_SD2FLT4_COMPL = 0x3E00, +} XBAR_CLBMuxConfig; + + +//***************************************************************************** +// +//! The following values define the \e inputFlag parameter for +//! XBAR_getInputFlagStatus() and XBAR_clearInputFlag(). +// +//***************************************************************************** +typedef enum +{ + // + // XBARFLG1 + // + XBAR_INPUT_FLG_CMPSS1_CTRIPL = 0x0000, + XBAR_INPUT_FLG_CMPSS1_CTRIPH = 0x0001, + XBAR_INPUT_FLG_CMPSS2_CTRIPL = 0x0002, + XBAR_INPUT_FLG_CMPSS2_CTRIPH = 0x0003, + XBAR_INPUT_FLG_CMPSS3_CTRIPL = 0x0004, + XBAR_INPUT_FLG_CMPSS3_CTRIPH = 0x0005, + XBAR_INPUT_FLG_CMPSS4_CTRIPL = 0x0006, + XBAR_INPUT_FLG_CMPSS4_CTRIPH = 0x0007, + XBAR_INPUT_FLG_CMPSS5_CTRIPL = 0x0008, + XBAR_INPUT_FLG_CMPSS5_CTRIPH = 0x0009, + XBAR_INPUT_FLG_CMPSS6_CTRIPL = 0x000A, + XBAR_INPUT_FLG_CMPSS6_CTRIPH = 0x000B, + XBAR_INPUT_FLG_CMPSS7_CTRIPL = 0x000C, + XBAR_INPUT_FLG_CMPSS7_CTRIPH = 0x000D, + XBAR_INPUT_FLG_CMPSS8_CTRIPL = 0x000E, + XBAR_INPUT_FLG_CMPSS8_CTRIPH = 0x000F, + XBAR_INPUT_FLG_CMPSS1_CTRIPOUTL = 0x0010, + XBAR_INPUT_FLG_CMPSS1_CTRIPOUTH = 0x0011, + XBAR_INPUT_FLG_CMPSS2_CTRIPOUTL = 0x0012, + XBAR_INPUT_FLG_CMPSS2_CTRIPOUTH = 0x0013, + XBAR_INPUT_FLG_CMPSS3_CTRIPOUTL = 0x0014, + XBAR_INPUT_FLG_CMPSS3_CTRIPOUTH = 0x0015, + XBAR_INPUT_FLG_CMPSS4_CTRIPOUTL = 0x0016, + XBAR_INPUT_FLG_CMPSS4_CTRIPOUTH = 0x0017, + XBAR_INPUT_FLG_CMPSS5_CTRIPOUTL = 0x0018, + XBAR_INPUT_FLG_CMPSS5_CTRIPOUTH = 0x0019, + XBAR_INPUT_FLG_CMPSS6_CTRIPOUTL = 0x001A, + XBAR_INPUT_FLG_CMPSS6_CTRIPOUTH = 0x001B, + XBAR_INPUT_FLG_CMPSS7_CTRIPOUTL = 0x001C, + XBAR_INPUT_FLG_CMPSS7_CTRIPOUTH = 0x001D, + XBAR_INPUT_FLG_CMPSS8_CTRIPOUTL = 0x001E, + XBAR_INPUT_FLG_CMPSS8_CTRIPOUTH = 0x001F, + // + // XBARFLG2 + // + XBAR_INPUT_FLG_INPUT1 = 0x0100, + XBAR_INPUT_FLG_INPUT2 = 0x0101, + XBAR_INPUT_FLG_INPUT3 = 0x0102, + XBAR_INPUT_FLG_INPUT4 = 0x0103, + XBAR_INPUT_FLG_INPUT5 = 0x0104, + XBAR_INPUT_FLG_INPUT6 = 0x0105, + XBAR_INPUT_FLG_ADCSOCA = 0x0106, + XBAR_INPUT_FLG_ADCSOCB = 0x0107, + XBAR_INPUT_FLG_CLB1_OUT4 = 0x0108, + XBAR_INPUT_FLG_CLB1_OUT5 = 0x0109, + XBAR_INPUT_FLG_CLB2_OUT4 = 0x010A, + XBAR_INPUT_FLG_CLB2_OUT5 = 0x010B, + XBAR_INPUT_FLG_CLB3_OUT4 = 0x010C, + XBAR_INPUT_FLG_CLB3_OUT5 = 0x010D, + XBAR_INPUT_FLG_CLB4_OUT4 = 0x010E, + XBAR_INPUT_FLG_CLB4_OUT5 = 0x010F, + XBAR_INPUT_FLG_ECAP1_OUT = 0x0110, + XBAR_INPUT_FLG_ECAP2_OUT = 0x0111, + XBAR_INPUT_FLG_ECAP3_OUT = 0x0112, + XBAR_INPUT_FLG_ECAP4_OUT = 0x0113, + XBAR_INPUT_FLG_ECAP5_OUT = 0x0114, + XBAR_INPUT_FLG_ECAP6_OUT = 0x0115, + XBAR_INPUT_FLG_EXTSYNCOUT = 0x0116, + XBAR_INPUT_FLG_ADCAEVT1 = 0x0117, + XBAR_INPUT_FLG_ADCAEVT2 = 0x0118, + XBAR_INPUT_FLG_ADCAEVT3 = 0x0119, + XBAR_INPUT_FLG_ADCAEVT4 = 0x011A, + XBAR_INPUT_FLG_ADCBEVT1 = 0x011B, + XBAR_INPUT_FLG_ADCBEVT2 = 0x011C, + XBAR_INPUT_FLG_ADCBEVT3 = 0x011D, + XBAR_INPUT_FLG_ADCBEVT4 = 0x011E, + XBAR_INPUT_FLG_ADCCEVT1 = 0x011F, + // + // XBARFLG3 + // + XBAR_INPUT_FLG_ADCCEVT2 = 0x0200, + XBAR_INPUT_FLG_ADCCEVT3 = 0x0201, + XBAR_INPUT_FLG_ADCCEVT4 = 0x0202, + XBAR_INPUT_FLG_ADCDEVT1 = 0x0203, + XBAR_INPUT_FLG_ADCDEVT2 = 0x0204, + XBAR_INPUT_FLG_ADCDEVT3 = 0x0205, + XBAR_INPUT_FLG_ADCDEVT4 = 0x0206, + XBAR_INPUT_FLG_SD1FLT1_COMPL = 0x0207, + XBAR_INPUT_FLG_SD1FLT1_COMPH = 0x0208, + XBAR_INPUT_FLG_SD1FLT2_COMPL = 0x0209, + XBAR_INPUT_FLG_SD1FLT2_COMPH = 0x020A, + XBAR_INPUT_FLG_SD1FLT3_COMPL = 0x020B, + XBAR_INPUT_FLG_SD1FLT3_COMPH = 0x020C, + XBAR_INPUT_FLG_SD1FLT4_COMPL = 0x020D, + XBAR_INPUT_FLG_SD1FLT4_COMPH = 0x020E, + XBAR_INPUT_FLG_SD2FLT1_COMPL = 0x020F, + XBAR_INPUT_FLG_SD2FLT1_COMPH = 0x0210, + XBAR_INPUT_FLG_SD2FLT2_COMPL = 0x0211, + XBAR_INPUT_FLG_SD2FLT2_COMPH = 0x0212, + XBAR_INPUT_FLG_SD2FLT3_COMPL = 0x0213, + XBAR_INPUT_FLG_SD2FLT3_COMPH = 0x0214, + XBAR_INPUT_FLG_SD2FLT4_COMPL = 0x0215, + XBAR_INPUT_FLG_SD2FLT4_COMPH = 0x0216 +} XBAR_InputFlag; +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables the Output X-BAR mux values to be passed to the output signal. +//! +//! \param output is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR output +//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is +//! the output number between 1 and 8 inclusive. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be OR'd together to enable several +//! muxes on an output at the same time. For example, passing this function +//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would enable muxes 4 and 10. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableOutputMux(XBAR_OutputNum output, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_OUTPUT_EN_REG_BASE + (uint16_t)output) |= muxes; + + EDIS; + + +} + +//***************************************************************************** +// +//! Disables the Output X-BAR mux values from being passed to the output. +//! +//! \param output is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values from being passed to the X-BAR output +//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is +//! the output number between 1 and 8 inclusive. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be OR'd together to disable several +//! muxes on an output at the same time. For example, passing this function +//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would disable muxes 4 and 10. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableOutputMux(XBAR_OutputNum output, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_OUTPUT_EN_REG_BASE + (uint16_t)output) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Enables or disables the output latch to drive the selected output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! \param enable is a flag that determines whether or not the latch is +//! selected to drive the X-BAR output. +//! +//! This function sets the Output X-BAR output signal latch mode. If the +//! \e enable parameter is \b true, the output specified by \e output will be +//! driven by the output latch. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_setOutputLatchMode(XBAR_OutputNum output, bool enable) +{ + EALLOW; + + // + // Set or clear the latch setting bit based on the enable parameter. + // + if(enable) + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHENABLE) |= + 0x1U << ((uint16_t)output / 2U); + } + else + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHENABLE) &= + ~(0x1U << ((uint16_t)output / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Returns the status of the output latch +//! +//! \param output is the X-BAR output being checked. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! \return Returns \b true if the output corresponding to \e output was +//! triggered. If not, it will return \b false. +// +//***************************************************************************** +static inline bool +XBAR_getOutputLatchStatus(XBAR_OutputNum output) +{ + // + // Get the status of the Output X-BAR output latch. + // + return((HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCH) & + (0x1U << ((uint16_t)output / 2U))) != 0U); +} + +//***************************************************************************** +// +//! Clears the output latch for the specified output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! This function clears the Output X-BAR output latch. The output to be +//! configured is specified by the \e output parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_clearOutputLatch(XBAR_OutputNum output) +{ + // + // Set the bit that clears the corresponding OUTPUTLATCH bit. + // + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHCLR) |= + 0x1U << ((uint16_t)output / 2U); +} + +//***************************************************************************** +// +//! Forces the output latch for the specified output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! This function forces the Output X-BAR output latch. The output to be +//! configured is specified by the \e output parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_forceOutputLatch(XBAR_OutputNum output) +{ + // + // Set the bit that forces the corresponding OUTPUTLATCH bit. + // + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHFRC) = + (uint16_t)0x1U << ((uint16_t)output / 2U); +} + +//***************************************************************************** +// +//! Configures the polarity of an Output X-BAR output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the Output X-BAR signal if the \e invert parameter is +//! \b true. If \e invert is \b false, the signal will be passed as is. The +//! \e output parameter is a value \b XBAR_OUTPUTy where y is the output +//! number between 1 and 8 inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertOutputSignal(XBAR_OutputNum output, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTINV) |= + 0x1U << ((uint16_t)output / 2U); + } + else + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTINV) &= + ~(0x1U << ((uint16_t)output / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables the ePWM X-BAR mux values to be passed to an ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR trip +//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! enable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableEPWMMux(XBAR_TripNum trip, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_EPWM_EN_REG_BASE + (uint32_t)trip) |= muxes; + EDIS; +} + +//***************************************************************************** +// +//! Disables the ePWM X-BAR mux values to be passed to an ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values to be passed to the X-BAR trip +//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! disable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableEPWMMux(XBAR_TripNum trip, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_EPWM_EN_REG_BASE + (uint32_t)trip) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the polarity of an ePWM X-BAR output. +//! +//! \param trip is the X-BAR output being configured. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the ePWM X-BAR trip signal if the \e invert +//! parameter is \b true. If \e invert is \b false, the signal will be passed +//! as is. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM X-BAR that is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertEPWMSignal(XBAR_TripNum trip, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(EPWMXBAR_BASE + XBAR_O_TRIPOUTINV) |= + 0x1U << ((uint16_t)trip / 2U); + } + else + { + HWREGH(EPWMXBAR_BASE + XBAR_O_TRIPOUTINV) &= + ~(0x1U << ((uint16_t)trip / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the GPIO pin for an Input X-BAR input. +//! +//! \param input is the X-BAR input being configured. +//! \param pin is the identifying number of the pin. +//! +//! This function configures which GPIO is assigned to an Input X-BAR input. +//! The \e input parameter is a value in the form of a define \b XBAR_INPUTy +//! where y is a the input number for the Input X-BAR. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_setInputPin(XBAR_InputNum input, uint16_t pin) +{ + // + // Check the argument. + // + ASSERT(pin <= XBAR_GPIO_MAX_CNT); + + // + // Write the requested pin to the appropriate input select register. + // + EALLOW; + + HWREGH(XBAR_INPUT_BASE + (uint16_t)input) = pin; + + EDIS; +} + +//***************************************************************************** +// +//! Locks an input to the Input X-BAR. +//! +//! \param input is an input to the Input X-BAR. +//! +//! This function locks the specific input on the Input X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockInput(XBAR_InputNum input) +{ + // + // lock the input in the INPUTSELECTLOCK register. + // + EALLOW; + HWREG(INPUTXBAR_BASE + XBAR_O_INPUTSELECTLOCK) = + 1UL << (uint16_t)input; + EDIS; +} + +//***************************************************************************** +// +//! Locks the Output X-BAR. +//! +//! This function locks the Output X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockOutput(void) +{ + // + // Lock the Output X-BAR with the OUTPUTLOCK register. + // Write key 0x5A5A to the KEY bits and 1 to LOCK bit. + // + EALLOW; + + HWREG(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLOCK) = + ((uint32_t)0x5A5A << XBAR_OUTPUTLOCK_KEY_S) | + (uint32_t)XBAR_OUTPUTLOCK_LOCK; + + EDIS; +} + +//***************************************************************************** +// +//! Locks the ePWM X-BAR. +//! +//! This function locks the ePWM X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockEPWM(void) +{ + // + // Lock the ePWM X-BAR with the TRIPLOCK register. + // Write key 0x5A5A to the KEY bits and 1 to LOCK bit. + // + EALLOW; + + HWREG(EPWMXBAR_BASE + XBAR_O_TRIPLOCK) = + ((uint32_t)0x5A5A << XBAR_TRIPLOCK_KEY_S) | + (uint32_t)XBAR_TRIPLOCK_LOCK; + EDIS; +} + +//***************************************************************************** +// +//! Enables the CLB X-BAR mux values to be passed to an CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR auxSignal +//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! enable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_CLB_EN_REG_BASE + (uint32_t)auxSignal) |= muxes; + + EDIS; +} + +//***************************************************************************** +// +//! Disables the CLB X-BAR mux values to be passed to an CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values to be passed to the X-BAR auxSignal +//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! disable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_CLB_EN_REG_BASE + (uint32_t)auxSignal) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the polarity of an CLB X-BAR output. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the CLB X-BAR auxSignal signal if the \e invert +//! parameter is \b true. If \e invert is \b false, the signal will be passed +//! as is. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB X-BAR that is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertCLBSignal(XBAR_AuxSigNum auxSignal, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(CLBXBAR_BASE + XBAR_O_AUXSIGOUTINV) |= + 0x1U << ((uint16_t)auxSignal / 2U); + } + else + { + HWREGH(CLBXBAR_BASE + XBAR_O_AUXSIGOUTINV) &= + ~(0x1U << ((uint16_t)auxSignal / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Configures the Output X-BAR mux that determines the signals passed to an +//! output. +//! +//! \param output is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an Output X-BAR mux. This determines which +//! signal(s) should be passed through the X-BAR to a GPIO. The \e output +//! parameter is a value \b XBAR_OUTPUTy where y is a the output number +//! between 1 and 8 inclusive. +//! +//! The \e muxConfig parameter for OUTPUT XBAR is the mux configuration +//! value that specifies which signal will be passed from the mux. The +//! values have the format of \b XBAR_OUT_MUXnn_xx where the 'xx' is +//! the signal and nn is the mux number. +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the output signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_OUT_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_OUT_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_setOutputMuxConfig(XBAR_OutputNum output, XBAR_OutputMuxConfig muxConfig); + +//***************************************************************************** +// +//! Configures the ePWM X-BAR mux that determines the signals passed to an +//! ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an ePWM X-BAR mux. This determines which signal(s) +//! should be passed through the X-BAR to an ePWM module. The \e trip +//! parameter is a value \b XBAR_TRIPy where y is a the number of the trip +//! signal on the ePWM. +//! +//! The \e muxConfig parameter is the mux configuration value that specifies +//! which signal will be passed from the mux. The values have the format of +//! \b XBAR_EPWM_MUXnn_xx where the 'xx' is the signal and nn is the mux +//! number (0 through 31). The possible values are found in xbar.h +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the trip signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_EPWM_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_EPWM_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig); + +//***************************************************************************** +// +//! Returns the status of the input latch. +//! +//! \param inputFlag is the X-BAR input latch being checked. Values are in the +//! format of /b XBAR_INPUT_FLG_XXXX where "XXXX" is name of the signal. +//! +//! \return Returns \b true if the X-BAR input corresponding to the +//! \e inputFlag has been triggered. If not, it will return \b false. +// +//***************************************************************************** +extern bool +XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag); + +//***************************************************************************** +// +//! Clears the input latch for the specified input latch. +//! +//! \param inputFlag is the X-BAR input latch being cleared. +//! +//! This function clears the Input X-BAR input latch. The input latch to be +//! cleared is specified by the \e inputFlag parameter. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_clearInputFlag(XBAR_InputFlag inputFlag); + +//***************************************************************************** +// +//! Configures the CLB X-BAR mux that determines the signals passed to a +//! CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an CLB X-BAR mux. This determines which signal(s) +//! should be passed through the X-BAR to an CLB module. The \e auxSignal +//! parameter is a value \b XBAR_AUXSIGy where y is a the number of the +//! signal on the CLB. +//! +//! The \e muxConfig parameter is the mux configuration value that specifies +//! which signal will be passed from the mux. The values have the format of +//! \b XBAR_CLB_MUXnn_xx where the 'xx' is the signal and nn is the mux +//! number (0 through 31). The possible values are found in xbar.h +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_CLB_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_CLB_MUX03_INPUTXBAR2, resulting in the values of MUX00 and MUX03 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal, + XBAR_CLBMuxConfig muxConfig); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // XBAR_H diff --git a/gpio_bitfield_cpu2/gpio_bitfield_cpu2.c b/gpio_bitfield_cpu2/gpio_bitfield_cpu2.c new file mode 100644 index 0000000..e69de29 diff --git a/gpio_bitfield_cpu2/targetConfigs/TMS320F28377D.ccxml b/gpio_bitfield_cpu2/targetConfigs/TMS320F28377D.ccxml new file mode 100644 index 0000000..79dd5cc --- /dev/null +++ b/gpio_bitfield_cpu2/targetConfigs/TMS320F28377D.ccxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_bitfield_cpu2/targetConfigs/readme.txt b/gpio_bitfield_cpu2/targetConfigs/readme.txt new file mode 100644 index 0000000..af97b62 --- /dev/null +++ b/gpio_bitfield_cpu2/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file diff --git a/gpio_driverlib_cpu1/.ccsproject b/gpio_driverlib_cpu1/.ccsproject new file mode 100644 index 0000000..f062ad6 --- /dev/null +++ b/gpio_driverlib_cpu1/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/gpio_driverlib_cpu1/.clangd b/gpio_driverlib_cpu1/.clangd new file mode 100644 index 0000000..c9859d6 --- /dev/null +++ b/gpio_driverlib_cpu1/.clangd @@ -0,0 +1,8 @@ +# This is an auto-generated file - do not add it to source-control + +CompileFlags: + CompilationDatabase: CPU1_RAM/.clangd + +Diagnostics: + Suppress: '*' + diff --git a/gpio_driverlib_cpu1/.cproject b/gpio_driverlib_cpu1/.cproject new file mode 100644 index 0000000..9581708 --- /dev/null +++ b/gpio_driverlib_cpu1/.cproject @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_driverlib_cpu1/.project b/gpio_driverlib_cpu1/.project new file mode 100644 index 0000000..9093a87 --- /dev/null +++ b/gpio_driverlib_cpu1/.project @@ -0,0 +1,33 @@ + + + gpio_driverlib_cpu1 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + + + + driverlib.lib + 1 + COM_TI_C2000WARE_INSTALL_DIR/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib + + + + + C2000WARE_DLIB_ROOT + $%7BCOM_TI_C2000WARE_INSTALL_DIR%7D/driverlib/f2837xd/driverlib + + + diff --git a/gpio_driverlib_cpu1/.settings/org.eclipse.cdt.codan.core.prefs b/gpio_driverlib_cpu1/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..f653028 --- /dev/null +++ b/gpio_driverlib_cpu1/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/gpio_driverlib_cpu1/.settings/org.eclipse.core.resources.prefs b/gpio_driverlib_cpu1/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..1e8c9e0 --- /dev/null +++ b/gpio_driverlib_cpu1/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +encoding//CPU1_RAM/device/subdir_rules.mk=UTF-8 +encoding//CPU1_RAM/device/subdir_vars.mk=UTF-8 +encoding//CPU1_RAM/makefile=UTF-8 +encoding//CPU1_RAM/objects.mk=UTF-8 +encoding//CPU1_RAM/sources.mk=UTF-8 +encoding//CPU1_RAM/subdir_rules.mk=UTF-8 +encoding//CPU1_RAM/subdir_vars.mk=UTF-8 +encoding/=UTF-8 diff --git a/gpio_driverlib_cpu1/2837xD_FLASH_lnk_cpu1.cmd b/gpio_driverlib_cpu1/2837xD_FLASH_lnk_cpu1.cmd new file mode 100644 index 0000000..0c4b505 --- /dev/null +++ b/gpio_driverlib_cpu1/2837xD_FLASH_lnk_cpu1.cmd @@ -0,0 +1,176 @@ + +MEMORY +{ +PAGE 0 : /* Program Memory */ + /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */ + /* BEGIN is used for the "boot to Flash" bootloader mode */ + + BEGIN : origin = 0x080000, length = 0x000002 + RAMM0 : origin = 0x000123, length = 0x0002DD + RAMD0 : origin = 0x00B000, length = 0x000800 + RAMLS0 : origin = 0x008000, length = 0x000800 + RAMLS1 : origin = 0x008800, length = 0x000800 + RAMLS2 : origin = 0x009000, length = 0x000800 + RAMLS3 : origin = 0x009800, length = 0x000800 + RAMLS4 : origin = 0x00A000, length = 0x000800 + RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS15 : origin = 0x01B000, length = 0x000FF8 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + +// RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + + RESET : origin = 0x3FFFC0, length = 0x000002 + + /* Flash sectors */ + FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ + FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ + FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ + FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ + FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ + FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ + FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ + FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ + FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ + FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ + FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ + FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ + FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ + FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */ + +// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + +PAGE 1 : /* Data Memory */ + /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */ + + BOOT_RSVD : origin = 0x000002, length = 0x000121 /* Part of M0, BOOT rom will use this for stack */ + RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */ +// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + RAMD1 : origin = 0x00B800, length = 0x000800 + + RAMLS5 : origin = 0x00A800, length = 0x000800 + + RAMGS0 : origin = 0x00C000, length = 0x001000 + RAMGS1 : origin = 0x00D000, length = 0x001000 + RAMGS2 : origin = 0x00E000, length = 0x001000 + RAMGS3 : origin = 0x00F000, length = 0x001000 + RAMGS4 : origin = 0x010000, length = 0x001000 + RAMGS5 : origin = 0x011000, length = 0x001000 + RAMGS6 : origin = 0x012000, length = 0x001000 + RAMGS7 : origin = 0x013000, length = 0x001000 + RAMGS8 : origin = 0x014000, length = 0x001000 + RAMGS9 : origin = 0x015000, length = 0x001000 + RAMGS10 : origin = 0x016000, length = 0x001000 + +// RAMGS11 : origin = 0x017000, length = 0x000FF8 /* Uncomment for F28374D, F28376D devices */ + +// RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + + RAMGS11 : origin = 0x017000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS12 : origin = 0x018000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS13 : origin = 0x019000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + + CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 + CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 +} + +SECTIONS +{ + /* Allocate program areas: */ + .cinit : > FLASHB PAGE = 0, ALIGN(8) + .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(8) + codestart : > BEGIN PAGE = 0, ALIGN(8) + /* Allocate uninitalized data sections: */ + .stack : > RAMM1 PAGE = 1 + .switch : > FLASHB PAGE = 0, ALIGN(8) + .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ + +#if defined(__TI_EABI__) + .init_array : > FLASHB, PAGE = 0, ALIGN(8) + .bss : > RAMLS5, PAGE = 1 + .bss:output : > RAMLS3, PAGE = 0 + .bss:cio : > RAMLS5, PAGE = 1 + .data : > RAMLS5, PAGE = 1 + .sysmem : > RAMLS5, PAGE = 1 + /* Initalized sections go in Flash */ + .const : > FLASHF, PAGE = 0, ALIGN(8) +#else + .pinit : > FLASHB, PAGE = 0, ALIGN(8) + .ebss : >> RAMLS5 | RAMGS0 | RAMGS1, PAGE = 1 + .esysmem : > RAMLS5, PAGE = 1 + .cio : > RAMLS5, PAGE = 1 + /* Initalized sections go in Flash */ + .econst : >> FLASHF PAGE = 0, ALIGN(8) +#endif + + Filter_RegsFile : > RAMGS0, PAGE = 1 + + SHARERAMGS0 : > RAMGS0, PAGE = 1 + SHARERAMGS1 : > RAMGS1, PAGE = 1 + SHARERAMGS2 : > RAMGS2, PAGE = 1 + ramgs0 : > RAMGS0, PAGE = 1 + ramgs1 : > RAMGS1, PAGE = 1 + +#ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + #if defined(__TI_EABI__) + .TI.ramfunc : {} LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(RamfuncsLoadStart), + LOAD_SIZE(RamfuncsLoadSize), + LOAD_END(RamfuncsLoadEnd), + RUN_START(RamfuncsRunStart), + RUN_SIZE(RamfuncsRunSize), + RUN_END(RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #else + .TI.ramfunc : {} LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(_RamfuncsLoadStart), + LOAD_SIZE(_RamfuncsLoadSize), + LOAD_END(_RamfuncsLoadEnd), + RUN_START(_RamfuncsRunStart), + RUN_SIZE(_RamfuncsRunSize), + RUN_END(_RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #endif + #else + ramfuncs : LOAD = FLASHD, + RUN = RAMLS0, + LOAD_START(_RamfuncsLoadStart), + LOAD_SIZE(_RamfuncsLoadSize), + LOAD_END(_RamfuncsLoadEnd), + RUN_START(_RamfuncsRunStart), + RUN_SIZE(_RamfuncsRunSize), + RUN_END(_RamfuncsRunEnd), + PAGE = 0, ALIGN(8) + #endif + +#endif + + /* The following section definitions are required when using the IPC API Drivers */ + GROUP : > CPU1TOCPU2RAM, PAGE = 1 + { + PUTBUFFER + PUTWRITEIDX + GETREADIDX + } + + GROUP : > CPU2TOCPU1RAM, PAGE = 1 + { + GETBUFFER : TYPE = DSECT + GETWRITEIDX : TYPE = DSECT + PUTREADIDX : TYPE = DSECT + } + + /* The following section definition are for SDFM examples */ + Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111 + Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222 + Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333 + Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444 + Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333 +} + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/gpio_driverlib_cpu1/2837xD_RAM_lnk_cpu1.cmd b/gpio_driverlib_cpu1/2837xD_RAM_lnk_cpu1.cmd new file mode 100644 index 0000000..5d5167a --- /dev/null +++ b/gpio_driverlib_cpu1/2837xD_RAM_lnk_cpu1.cmd @@ -0,0 +1,141 @@ + +MEMORY +{ +PAGE 0 : + /* BEGIN is used for the "boot to SARAM" bootloader mode */ + + BEGIN : origin = 0x000000, length = 0x000002 + RAMM0 : origin = 0x000123, length = 0x0002DD + RAMD0 : origin = 0x00B000, length = 0x000800 + RAMLS0 : origin = 0x008000, length = 0x000800 + RAMLS1 : origin = 0x008800, length = 0x000800 + RAMLS2 : origin = 0x009000, length = 0x000800 + RAMLS3 : origin = 0x009800, length = 0x000800 + RAMLS4 : origin = 0x00A000, length = 0x000800 + RESET : origin = 0x3FFFC0, length = 0x000002 + + /* Flash sectors */ + FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ + FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ + FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ + FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ + FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ + FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ + FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ + FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ + FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ + FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ + FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ + FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ + FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ + FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */ + +// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + +PAGE 1 : + + BOOT_RSVD : origin = 0x000002, length = 0x000121 /* Part of M0, BOOT rom will use this for stack */ + RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */ +// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + RAMD1 : origin = 0x00B800, length = 0x000800 + + RAMLS5 : origin = 0x00A800, length = 0x000800 + + RAMGS0 : origin = 0x00C000, length = 0x001000 + RAMGS1 : origin = 0x00D000, length = 0x001000 + RAMGS2 : origin = 0x00E000, length = 0x001000 + RAMGS3 : origin = 0x00F000, length = 0x001000 + RAMGS4 : origin = 0x010000, length = 0x001000 + RAMGS5 : origin = 0x011000, length = 0x001000 + RAMGS6 : origin = 0x012000, length = 0x001000 + RAMGS7 : origin = 0x013000, length = 0x001000 + RAMGS8 : origin = 0x014000, length = 0x001000 + RAMGS9 : origin = 0x015000, length = 0x001000 + RAMGS10 : origin = 0x016000, length = 0x001000 + +// RAMGS11 : origin = 0x017000, length = 0x000FF8 /* Uncomment for F28374D, F28376D devices */ + +// RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + + RAMGS11 : origin = 0x017000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS12 : origin = 0x018000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS13 : origin = 0x019000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + RAMGS15 : origin = 0x01B000, length = 0x000FF8 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + +// RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ + /* Only on F28379D, F28377D, F28375D devices. Remove line on other devices. */ + + CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 + CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 + + CANA_MSG_RAM : origin = 0x049000, length = 0x000800 + CANB_MSG_RAM : origin = 0x04B000, length = 0x000800 +} + + +SECTIONS +{ + codestart : > BEGIN, PAGE = 0 + .text : >> RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4, PAGE = 0 + .cinit : > RAMM0, PAGE = 0 + .switch : > RAMM0, PAGE = 0 + .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ + .stack : > RAMM1, PAGE = 1 + +#if defined(__TI_EABI__) + .bss : > RAMLS5, PAGE = 1 + .bss:output : > RAMLS3, PAGE = 0 + .init_array : > RAMM0, PAGE = 0 + .const : > RAMLS5, PAGE = 1 + .data : > RAMLS5, PAGE = 1 + .sysmem : > RAMLS5, PAGE = 1 +#else + .pinit : > RAMM0, PAGE = 0 + .ebss : > RAMLS5, PAGE = 1 + .econst : > RAMLS5, PAGE = 1 + .esysmem : > RAMLS5, PAGE = 1 +#endif + + Filter_RegsFile : > RAMGS0, PAGE = 1 + + + ramgs0 : > RAMGS0, PAGE = 1 + ramgs1 : > RAMGS1, PAGE = 1 + +#ifdef __TI_COMPILER_VERSION__ + #if __TI_COMPILER_VERSION__ >= 15009000 + .TI.ramfunc : {} > RAMM0, PAGE = 0 + #else + ramfuncs : > RAMM0 PAGE = 0 + #endif +#endif + + /* The following section definitions are required when using the IPC API Drivers */ + GROUP : > CPU1TOCPU2RAM, PAGE = 1 + { + PUTBUFFER + PUTWRITEIDX + GETREADIDX + } + + GROUP : > CPU2TOCPU1RAM, PAGE = 1 + { + GETBUFFER : TYPE = DSECT + GETWRITEIDX : TYPE = DSECT + PUTREADIDX : TYPE = DSECT + } + + /* The following section definition are for SDFM examples */ + Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111 + Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222 + Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333 + Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444 + Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333 +} + +/* +//=========================================================================== +// End of file. +//=========================================================================== +*/ diff --git a/gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.9982C06611A2C0D7.idx b/gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/F2837xD_CodeStartBranch.asm.9982C06611A2C0D7.idx new file mode 100644 index 0000000000000000000000000000000000000000..92728e3b032d4f262449a7ec8c8c437eb66c02b7 GIT binary patch literal 1024 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 literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/driverlib.h.87B503574AD85612.idx b/gpio_driverlib_cpu1/CPU1_RAM/.clangd/.cache/clangd/index/driverlib.h.87B503574AD85612.idx new file mode 100644 index 0000000000000000000000000000000000000000..ca47acaa8c7435f7e4088986847e81a87f924aff GIT binary patch literal 860 zcmWIYbaM+~W?*nm@vO*AElFfyU|9;>PP^;ZVj$4^y>&xJ zXMOpxbb~lEXX^t;wq4=Vd2{=AY41Dc3Lz$5&ih;1jn#`KR6cAre5U$bp-*h)Q%@c-BGCC{G5+Xl0 zC8W0~UHsY=u*mBTo6EN=9-C*(|L(l4(Y;9Bfw8n{!7s*(4YL$yyPln$?G~}fZi^Aa zlfBDdN51yWRyB6h+RZuJ_;!q4$*j$BcD0|>0`7nCGh`3DZ2H{d`myyQQe37bL3b}r z+#h`JU)aXdRlCq&@*a)i9es*Y2aL`a&*=FcFS71{#_dQsWQSGaI zw@1^!WGxr-jqsLm@wkeYHtV12n?#sSH(7BlI!Pn-ac}a<>eQv1COS>`iWKZA_#2qn zyHEd{5C5z%wqW75|Ahs5T#_BJ@)MSrJ$$u)@~kDPvc8uV#AtoUkgCp&S+>W&Q!hwd zQqDYv=kb$^tJXC>ayr3yH2hh*PfYy(uq{fjYoZP|hZa6`I$f~-!}%|kpQRsMo}F3x zePY_*PqM$3Zz+h;+FToc(dnyM8uPJSwkkdY|BriHQ_k;wmr_#qx1x4`{8ZV9wxo$Z z^_&F^=X0I5*{pabW;@}{JH_oMgC6lNi#R%ip|~hG~=8{oh9QuZ}!WSWZq(A11uxNL^W1 z;3`9A9wAv4Sy7lUkB};hDiTkfMIFxT>*m__o}t|xWD<*|N>&@@381}Fsz^L_DRnrn#UuLjn&fATffmTK$P2;@ zE=tWw1ZgiWN-kCg(#%3Ev!70j*Z&m2Bq+cj2s4?1K>)!_&P~YyaryXonbPiP!f9LL}6ZqjX?TMr(+2p&8X@!~}V!TSBpzr1~&NTPVrAH03<`+J}F zd;fkjv-|6t8JsI>|Vlo;mfZx1Sn(`Puwji=7*+!b{~>lne@f zB}Gvi=D@0(>PDfsxIC9}gMtvf^2-mR;n=3zZxDHXV7pV-4j&;j)s?D>=E`?d>^Mv*pQi z^?5m8DlIJ(a`~cM!}P9P?YN%PZ<`&D+V!r}>pHq;Hkeezc^!Z2wEq;!f8q#I7msx3 zE5-au>GDPY>S^zcmHzhGWik4Hb#|rYm3*!k93E|+u_sY7>|y-U6MTP)Dx4=7Rg!cI zzZrHFzbSO=jRHryF${%``ImKPJS8FMi*N)%X|`McFlhRFHl=CWC)#)_MeCno>Fo5Q zk7sAIZ?2xgOwx=*jv48!6gyLIyea`B-+M=go4Jw9GSt*!EU7;@=b(QTRWP0& z_%zD#lYT9ZL5Y8i82sh0(Y@EIOnLe+pK(IxXmopvTya5q@0ICj^~kFOBdg z1wA3?Q_LFSCj~vlh9mu_1$~CS&h<~@{NCmCS)?o3SemhMsvnBZ4mSgP79~9v)<`&F z(vyr8sKz(d*SH>EPcXI=@+)Cop!~r2rLgw-(;<%s!{-s#=TR>bhk7}zef|Vv(_uVc zBb|L6tq1*)AHyCnY|YPy6#J|1`12L5Qr%j+wzATOA zhH3Phn$_9qMs3^bfD8P(VL0X>R`{3DG~Gz{`bI}@Lu+*e@Nzjnt`-FTmuAvxRn6#I zc0WVeIEf*bBm(Bt`B!aN9@V3fSzO1a2Na zemU=eqcw{ravy@56(MMm`}z=W87x2VkKp8lcp^7}_ec`AA;fzcTqPl%$aTQ2Cvdmn z!_oGlu1~?yT12zq;6Fz{fxC%~orfQu5ab*HCz_!g0}g z5%(4fa(*9`Z=2xwapWZK0~Fr>0v8WW-;%hOIga|tsQws*kJkc6`=gwpcPv>FHw2eM zA91*9-;%hGI1Wb{b6=pv&-*PmFFr+wa`!ln{y~t@yx*Yk@qPnGep(+sO}-^@1V!8# tj{5;^tT(=oEFgMTMf(K~Iwv{om<9KK*p4c?=RZ(*?kk!%N`Md~`6mkPEI9xG literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/CPU1_RAM/device/device.d b/gpio_driverlib_cpu1/CPU1_RAM/device/device.d new file mode 100644 index 0000000..ede74e3 --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/device/device.d @@ -0,0 +1,267 @@ +# FIXED + +device/device.obj: ../device/device.c +device/device.obj: ../device/device.h +device/device.obj: ../device/driverlib.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/adc.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h +device/device.obj: /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_adc.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_types.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cpu.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/debug.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/asysctl.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/can.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_can.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sysctl.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_otp.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/interrupt.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ints.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_pie.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cla.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cla.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/clb.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_clb.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cmpss.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cputimer.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dac.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dac.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dcsm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dma.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dma.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ecap.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/emif.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_emif.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/epwm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/eqep.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/flash.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_flash.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/gpio.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_xint.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/xbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hrpwm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/i2c.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ipc.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/mcbsp.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/memcfg.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/pin_map.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/pin_map_legacy.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sci.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sci.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sdfm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/spi.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_spi.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/upp.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_upp.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/version.h +device/device.obj: /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h + +../device/device.c: + +../device/device.h: + +../device/driverlib.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_memmap.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/adc.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdbool.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_ti_config.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/linkage.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/stdint.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/_stdint40.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/stdint.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/cdefs.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_types.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_types.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/machine/_stdint.h: + +/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include/sys/_stdint.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_adc.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sysctl.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_types.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cpu.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/debug.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/asysctl.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_asysctl.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/can.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_can.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sysctl.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_nmi.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_otp.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/interrupt.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ints.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_pie.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cla.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cla.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/clb.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_clb.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cmpss.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cmpss.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/cputimer.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_cputimer.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dac.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dac.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dcsm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dcsm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/dma.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_dma.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ecap.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ecap.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/emif.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_emif.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_memcfg.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/epwm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_epwm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/eqep.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_eqep.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/flash.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_flash.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/gpio.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_gpio.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_xint.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/xbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_clbxbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_epwmxbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_inputxbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_outputxbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_xbar.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hrpwm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_hrpwm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hrpwm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/i2c.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_i2c.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/hw_reg_inclusive_terminology.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ipc.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_ipc.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/mcbsp.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_mcbsp.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/memcfg.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/pin_map.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/pin_map_legacy.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sci.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sci.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/sdfm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_sdfm.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/spi.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_spi.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/upp.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/inc/hw_upp.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/version.h: + +/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/driver_inclusive_terminology_mapping.h: + diff --git a/gpio_driverlib_cpu1/CPU1_RAM/device/device.obj b/gpio_driverlib_cpu1/CPU1_RAM/device/device.obj new file mode 100644 index 0000000000000000000000000000000000000000..2bc4de3a500b7728202286b29e85658a44c037f5 GIT binary patch literal 28520 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 literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/CPU1_RAM/device/subdir_rules.mk b/gpio_driverlib_cpu1/CPU1_RAM/device/subdir_rules.mk new file mode 100644 index 0000000..40eff9e --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/device/subdir_rules.mk @@ -0,0 +1,18 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Each subdirectory must supply rules for building sources it contributes +device/%.obj: ../device/%.asm $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/bin/cl2000" -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -Ooff --include_path="/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1" --include_path="/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/device" --include_path="/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/" --include_path="/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=CPU1 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="device/$(basename $(> Linked Thu Jul 16 13:56:24 2026 + +OUTPUT FILE NAME: +ENTRY POINT SYMBOL: "code_start" address: 00000000 + + +MEMORY CONFIGURATION + + name origin length used unused attr fill +---------------------- -------- --------- -------- -------- ---- -------- +PAGE 0: + BEGIN 00000000 00000002 00000002 00000000 RWIX + RAMM0 00000123 000002dd 00000016 000002c7 RWIX + RAMLS0 00008000 00000800 00000397 00000469 RWIX + RAMLS1 00008800 00000800 00000000 00000800 RWIX + RAMLS2 00009000 00000800 00000000 00000800 RWIX + RAMLS3 00009800 00000800 00000000 00000800 RWIX + RAMLS4 0000a000 00000800 00000000 00000800 RWIX + RAMD0 0000b000 00000800 000007fd 00000003 RWIX + FLASHA 00080002 00001ffe 00000000 00001ffe RWIX + FLASHB 00082000 00002000 00000000 00002000 RWIX + FLASHC 00084000 00002000 00000000 00002000 RWIX + FLASHD 00086000 00002000 00000000 00002000 RWIX + FLASHE 00088000 00008000 00000000 00008000 RWIX + FLASHF 00090000 00008000 00000000 00008000 RWIX + FLASHG 00098000 00008000 00000000 00008000 RWIX + FLASHH 000a0000 00008000 00000000 00008000 RWIX + FLASHI 000a8000 00008000 00000000 00008000 RWIX + FLASHJ 000b0000 00008000 00000000 00008000 RWIX + FLASHK 000b8000 00002000 00000000 00002000 RWIX + FLASHL 000ba000 00002000 00000000 00002000 RWIX + FLASHM 000bc000 00002000 00000000 00002000 RWIX + FLASHN 000be000 00001ff0 00000000 00001ff0 RWIX + RESET 003fffc0 00000002 00000000 00000002 RWIX + +PAGE 1: + BOOT_RSVD 00000002 00000121 00000000 00000121 RWIX + RAMM1 00000400 000003f8 00000100 000002f8 RWIX + RAMLS5 0000a800 00000800 000001f1 0000060f RWIX + RAMD1 0000b800 00000800 00000000 00000800 RWIX + RAMGS0 0000c000 00001000 00000000 00001000 RWIX + RAMGS1 0000d000 00001000 00000000 00001000 RWIX + RAMGS2 0000e000 00001000 00000000 00001000 RWIX + RAMGS3 0000f000 00001000 00000000 00001000 RWIX + RAMGS4 00010000 00001000 00000000 00001000 RWIX + RAMGS5 00011000 00001000 00000000 00001000 RWIX + RAMGS6 00012000 00001000 00000000 00001000 RWIX + RAMGS7 00013000 00001000 00000000 00001000 RWIX + RAMGS8 00014000 00001000 00000000 00001000 RWIX + RAMGS9 00015000 00001000 00000000 00001000 RWIX + RAMGS10 00016000 00001000 00000000 00001000 RWIX + RAMGS11 00017000 00001000 00000000 00001000 RWIX + RAMGS12 00018000 00001000 00000000 00001000 RWIX + RAMGS13 00019000 00001000 00000000 00001000 RWIX + RAMGS14 0001a000 00001000 00000000 00001000 RWIX + RAMGS15 0001b000 00000ff8 00000000 00000ff8 RWIX + CPU2TOCPU1RAM 0003f800 00000400 00000000 00000400 RWIX + CPU1TOCPU2RAM 0003fc00 00000400 00000000 00000400 RWIX + CANA_MSG_RAM 00049000 00000800 00000000 00000800 RWIX + CANB_MSG_RAM 0004b000 00000800 00000000 00000800 RWIX + + +SECTION ALLOCATION MAP + + output attributes/ +section page origin length input sections +-------- ---- ---------- ---------- ---------------- +codestart +* 0 00000000 00000002 + 00000000 00000002 F2837xD_CodeStartBranch.obj (codestart) + +.cinit 0 00000128 00000012 + 00000128 00000009 (.cinit..data.load) [load image, compression = lzss] + 00000131 00000001 --HOLE-- [fill = 0] + 00000132 00000004 (__TI_handler_table) + 00000136 00000004 (__TI_cinit_table) + +.reset 0 003fffc0 00000000 DSECT + +.stack 1 00000400 00000100 UNINITIALIZED + 00000400 00000100 --HOLE-- + +.init_array +* 0 00000123 00000000 UNINITIALIZED + +.const 1 0000a800 000001e1 + 0000a800 000000c2 driverlib_eabi.lib : sysctl.obj (.const:.string) + 0000a8c2 000000bc : gpio.obj (.const:.string) + 0000a97e 00000050 gpio_driverlib_cpu1.obj (.const:.string) + 0000a9ce 00000013 device.obj (.const:.string) + +.data 1 0000a9e2 00000010 UNINITIALIZED + 0000a9e2 00000006 device.obj (.data) + 0000a9e8 00000006 rts2800_fpu32_eabi.lib : exit.c.obj (.data) + 0000a9ee 00000002 : _lock.c.obj (.data:_lock) + 0000a9f0 00000002 : _lock.c.obj (.data:_unlock) + +.TI.ramfunc +* 0 00000123 00000004 + 00000123 00000004 driverlib_eabi.lib : sysctl.obj (.TI.ramfunc) + +GETBUFFER +* 0 0003f800 00000000 DSECT + +GETWRITEIDX +* 0 0003f800 00000000 DSECT + +PUTREADIDX +* 0 0003f800 00000000 DSECT + +.text.1 0 00008000 00000397 + 00008000 00000051 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getClock) + 00008051 00000051 gpio_driverlib_cpu1.obj (.text) + 000080a2 00000048 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_selectOscSource) + 000080ea 00000037 : gpio.obj (.text:GPIO_setControllerCore) + 00008121 00000037 : gpio.obj (.text:GPIO_setPinConfig) + 00008158 00000037 : gpio.obj (.text:GPIO_setQualificationMode) + 0000818f 00000031 : gpio.obj (.text:GPIO_setDirectionMode) + 000081c0 0000002e rts2800_fpu32_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss) + 000081ee 0000002b : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit) + 00008219 00000029 : exit.c.obj (.text) + 00008242 00000028 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_selectClockSource) + 0000826a 0000001f : sysctl.obj (.text:CPUTimer_getTimerOverflowStatus) + 00008289 0000001a : sysctl.obj (.text:CPUTimer_startTimer) + 000082a3 0000001a : sysctl.obj (.text:SysCtl_getLowSpeedClock) + 000082bd 00000017 : sysctl.obj (.text:CPUTimer_isBaseValid) + 000082d4 00000017 rts2800_fpu32_eabi.lib : boot28.asm.obj (.text) + 000082eb 00000014 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_stopTimer) + 000082ff 00000012 : sysctl.obj (.text:CPUTimer_clearOverflowFlag) + 00008311 00000012 : sysctl.obj (.text:CPUTimer_disableInterrupt) + 00008323 00000012 rts2800_fpu32_eabi.lib : args_main.c.obj (.text) + 00008335 00000011 driverlib_eabi.lib : sysctl.obj (.text:CPUTimer_setPeriod) + 00008346 0000000f : sysctl.obj (.text:SysCtl_pollCpuTimer) + 00008355 0000000e : gpio.obj (.text:GPIO_isPinValid) + 00008363 0000000b : sysctl.obj (.text:SysCtl_isMCDClockFailureDetected) + 0000836e 00000009 : sysctl.obj (.text:SysCtl_serviceWatchdog) + 00008377 00000009 rts2800_fpu32_eabi.lib : _lock.c.obj (.text) + 00008380 00000008 F2837xD_CodeStartBranch.obj (.text) + 00008388 00000008 rts2800_fpu32_eabi.lib : copy_decompress_none.c.obj (.text:decompress:none) + 00008390 00000007 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_resetMCD) + +.text.2 0 0000b000 000007fd + 0000b000 000003ff device.obj (.text) + 0000b3ff 00000209 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_setClock) + 0000b608 00000090 : sysctl.obj (.text:SysCtl_selectXTAL) + 0000b698 00000088 rts2800_fpu32_eabi.lib : fs_div28.asm.obj (.text) + 0000b720 00000068 driverlib_eabi.lib : sysctl.obj (.text:SysCtl_getDeviceParametric) + 0000b788 00000052 : gpio.obj (.text:GPIO_setPadConfig) + 0000b7da 00000020 rts2800_fpu32_eabi.lib : memcpy.c.obj (.text) + 0000b7fa 00000002 : pre_init.c.obj (.text) + 0000b7fc 00000001 : startup.c.obj (.text) + +MODULE SUMMARY + + Module code ro data rw data + ------ ---- ------- ------- + ./ + gpio_driverlib_cpu1.obj 81 80 0 + +--+-----------------------------+------+---------+---------+ + Total: 81 80 0 + + ./device/ + device.obj 1023 19 6 + F2837xD_CodeStartBranch.obj 10 0 0 + +--+-----------------------------+------+---------+---------+ + Total: 1033 19 6 + + /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ccs/Debug/driverlib_eabi.lib + sysctl.obj 1187 194 0 + gpio.obj 310 188 0 + +--+-----------------------------+------+---------+---------+ + Total: 1497 382 0 + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/rts2800_fpu32_eabi.lib + fs_div28.asm.obj 136 0 0 + exit.c.obj 41 0 6 + copy_decompress_lzss.c.obj 46 0 0 + autoinit.c.obj 43 0 0 + memcpy.c.obj 32 0 0 + boot28.asm.obj 23 0 0 + args_main.c.obj 18 0 0 + _lock.c.obj 9 0 4 + copy_decompress_none.c.obj 8 0 0 + pre_init.c.obj 2 0 0 + startup.c.obj 1 0 0 + +--+-----------------------------+------+---------+---------+ + Total: 359 0 10 + + Stack: 0 0 256 + Linker Generated: 0 17 0 + +--+-----------------------------+------+---------+---------+ + Grand Total: 2970 498 272 + + +LINKER GENERATED COPY TABLES + +__TI_cinit_table @ 00000136 records: 1, size/record: 4, table size: 4 + .data: load addr=00000128, load size=00000009 bytes, run addr=0000a9e2, run size=00000010 bytes, compression=lzss + + +LINKER GENERATED HANDLER TABLE + +__TI_handler_table @ 00000132 records: 2, size/record: 2, table size: 4 + index: 0, handler: __TI_decompress_lzss + index: 1, handler: __TI_decompress_none + + +GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE + +address data page name +-------- ---------------- ---- +00000400 10 (00000400) __stack + +0000a9e2 2a7 (0000a9c0) Example_Result +0000a9e4 2a7 (0000a9c0) Example_PassCount +0000a9e6 2a7 (0000a9c0) Example_Fail +0000a9e8 2a7 (0000a9c0) __TI_enable_exit_profile_output +0000a9ea 2a7 (0000a9c0) __TI_cleanup_ptr +0000a9ec 2a7 (0000a9c0) __TI_dtors_ptr +0000a9ee 2a7 (0000a9c0) _lock +0000a9f0 2a7 (0000a9c0) _unlock + + +GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name + +page address name +---- ------- ---- +0 00008219 C$$EXIT +0 0000b273 Device_bootCPU2 +0 0000b242 Device_configureTMXAnalogTrim +0 0000b0f0 Device_enableAllPeripherals +0 0000b22c Device_enableUnbondedGPIOPullups +0 0000b20f Device_enableUnbondedGPIOPullupsFor100Pin +0 0000b1fc Device_enableUnbondedGPIOPullupsFor176Pin +0 0000b0ae Device_init +0 0000b1db Device_initGPIO +1 0000a9e6 Example_Fail +1 0000a9e4 Example_PassCount +1 0000a9e2 Example_Result +0 0000b3fe Example_done +0 0000b3f9 Example_setResultFail +0 0000b3f4 Example_setResultPass +0 000080ea GPIO_setControllerCore +0 0000818f GPIO_setDirectionMode +0 0000b788 GPIO_setPadConfig +0 00008121 GPIO_setPinConfig +0 00008158 GPIO_setQualificationMode +0 00000123 SysCtl_delay +0 00008000 SysCtl_getClock +0 0000b720 SysCtl_getDeviceParametric +0 000082a3 SysCtl_getLowSpeedClock +0 000080a2 SysCtl_selectOscSource +0 0000b608 SysCtl_selectXTAL +0 0000b3ff SysCtl_setClock +0 00000136 __TI_CINIT_Base +0 0000013a __TI_CINIT_Limit +0 0000013a __TI_CINIT_Warm +0 00000132 __TI_Handler_Table_Base +0 00000136 __TI_Handler_Table_Limit +1 00000500 __TI_STACK_END +abs 00000100 __TI_STACK_SIZE +0 000081ee __TI_auto_init_nobinit_nopinit +1 0000a9ea __TI_cleanup_ptr +0 000081c0 __TI_decompress_lzss +0 00008388 __TI_decompress_none +1 0000a9ec __TI_dtors_ptr +1 0000a9e8 __TI_enable_exit_profile_output +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +0 0000b698 __c28xabi_divf +abs ffffffff __c_args__ +0 0000b3ed __error__ +1 00000400 __stack +0 00008323 _args_main +0 000082d4 _c_int00 +1 0000a9ee _lock +0 0000837f _nop +0 0000837b _register_lock +0 00008377 _register_unlock +0 0000b7fc _system_post_cinit +0 0000b7fa _system_pre_init +1 0000a9f0 _unlock +0 00008219 abort +0 00000000 code_start +0 0000821b exit +0 00008084 main +0 0000b7da memcpy + + +GLOBAL SYMBOLS: SORTED BY Symbol Address + +page address name +---- ------- ---- +0 00000000 code_start +0 00000123 SysCtl_delay +0 00000132 __TI_Handler_Table_Base +0 00000136 __TI_CINIT_Base +0 00000136 __TI_Handler_Table_Limit +0 0000013a __TI_CINIT_Limit +0 0000013a __TI_CINIT_Warm +0 00008000 SysCtl_getClock +0 00008084 main +0 000080a2 SysCtl_selectOscSource +0 000080ea GPIO_setControllerCore +0 00008121 GPIO_setPinConfig +0 00008158 GPIO_setQualificationMode +0 0000818f GPIO_setDirectionMode +0 000081c0 __TI_decompress_lzss +0 000081ee __TI_auto_init_nobinit_nopinit +0 00008219 C$$EXIT +0 00008219 abort +0 0000821b exit +0 000082a3 SysCtl_getLowSpeedClock +0 000082d4 _c_int00 +0 00008323 _args_main +0 00008377 _register_unlock +0 0000837b _register_lock +0 0000837f _nop +0 00008388 __TI_decompress_none +0 0000b0ae Device_init +0 0000b0f0 Device_enableAllPeripherals +0 0000b1db Device_initGPIO +0 0000b1fc Device_enableUnbondedGPIOPullupsFor176Pin +0 0000b20f Device_enableUnbondedGPIOPullupsFor100Pin +0 0000b22c Device_enableUnbondedGPIOPullups +0 0000b242 Device_configureTMXAnalogTrim +0 0000b273 Device_bootCPU2 +0 0000b3ed __error__ +0 0000b3f4 Example_setResultPass +0 0000b3f9 Example_setResultFail +0 0000b3fe Example_done +0 0000b3ff SysCtl_setClock +0 0000b608 SysCtl_selectXTAL +0 0000b698 __c28xabi_divf +0 0000b720 SysCtl_getDeviceParametric +0 0000b788 GPIO_setPadConfig +0 0000b7da memcpy +0 0000b7fa _system_pre_init +0 0000b7fc _system_post_cinit +1 00000400 __stack +1 00000500 __TI_STACK_END +1 0000a9e2 Example_Result +1 0000a9e4 Example_PassCount +1 0000a9e6 Example_Fail +1 0000a9e8 __TI_enable_exit_profile_output +1 0000a9ea __TI_cleanup_ptr +1 0000a9ec __TI_dtors_ptr +1 0000a9ee _lock +1 0000a9f0 _unlock +abs 00000100 __TI_STACK_SIZE +abs ffffffff __TI_pprof_out_hndl +abs ffffffff __TI_prof_data_size +abs ffffffff __TI_prof_data_start +abs ffffffff __c_args__ + +[61 symbols] diff --git a/gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.obj b/gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.obj new file mode 100644 index 0000000000000000000000000000000000000000..0cc88ebc181d83f4017afd46135f5575eadfc479 GIT binary patch literal 7992 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 q!9%?E_teZ7t@N9@csjq8IAD( literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.out b/gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.out new file mode 100644 index 0000000000000000000000000000000000000000..bdb46faa7056ffd0595859a63e1e728ad8068bf8 GIT binary patch literal 57756 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 kg2wv#f(lopxejkaE)8?_=0UZ8h>{b3z + + TMS320C2000 Linker Unix v25.11.0.LTS + Copyright (c) 1996-2018 Texas Instruments Incorporated + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/bin/lnk2000 --tm_feedback=/var/tmp/TI1sMxajfDw --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --buffer_diagnostics --ecc=off --map_file=gpio_driverlib_cpu1.map --stack_size=0x100 --warn_sections --search_path=/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib --search_path=/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include --reread_libs --diag_wrap=off --display_error_number --xml_link_info=gpio_driverlib_cpu1_linkInfo.xml --entry_point=code_start --rom_model --output_file=gpio_driverlib_cpu1.out ./gpio_driverlib_cpu1.obj ./device/F2837xD_CodeStartBranch.obj ./device/device.obj ../2837xD_RAM_lnk_cpu1.cmd /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib --library=libc.a + 0x6a593768 + 0x0 + /Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/CPU1_RAM/gpio_driverlib_cpu1.out + + code_start +
    0x0
    +
    + + + /Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/CPU1_RAM/./ + object + gpio_driverlib_cpu1.obj + gpio_driverlib_cpu1.obj + + + /Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/CPU1_RAM/./device/ + object + F2837xD_CodeStartBranch.obj + F2837xD_CodeStartBranch.obj + + + /Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/CPU1_RAM/./device/ + object + device.obj + device.obj + + + /Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/CPU1_RAM/ + object + <internal> + <internal> + + + /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ccs/Debug/ + archive + driverlib_eabi.lib + gpio.obj + + + /Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ccs/Debug/ + archive + driverlib_eabi.lib + sysctl.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + boot28.asm.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + fs_div28.asm.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + pre_init.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + autoinit.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + copy_zero_init.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + copy_decompress_none.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + copy_decompress_lzss.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + exit.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + _lock.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + args_main.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + memset.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + cpy_tbl.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + memcpy.c.obj + + + /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib/ + archive + rts2800_fpu32_eabi.lib + startup.c.obj + + + + + codestart + 0x0 + true + true + 0x0 + 0x2 + 0x1 + + + + .text:SysCtl_getClock + 0x8000 + true + true + 0x8000 + 0x51 + 0x1 + + + + .text + 0x8051 + true + true + 0x8051 + 0x51 + 0x1 + + + + .text:SysCtl_selectOscSource + 0x80a2 + true + true + 0x80a2 + 0x48 + 0x1 + + + + .text:GPIO_setControllerCore + 0x80ea + true + true + 0x80ea + 0x37 + 0x1 + + + + .text:GPIO_setPinConfig + 0x8121 + true + true + 0x8121 + 0x37 + 0x1 + + + + .text:GPIO_setQualificationMode + 0x8158 + true + true + 0x8158 + 0x37 + 0x1 + + + + .text:GPIO_setDirectionMode + 0x818f + true + true + 0x818f + 0x31 + 0x1 + + + + .text:decompress:lzss + 0x81c0 + true + true + 0x81c0 + 0x2e + 0x1 + + + + .text:__TI_auto_init_nobinit_nopinit + 0x81ee + true + true + 0x81ee + 0x2b + 0x1 + + + + .text + 0x8219 + true + true + 0x8219 + 0x29 + 0x1 + + + + .text:CPUTimer_selectClockSource + 0x8242 + true + true + 0x8242 + 0x28 + 0x1 + + + + .text:CPUTimer_getTimerOverflowStatus + 0x826a + true + true + 0x826a + 0x1f + 0x1 + + + + .text:CPUTimer_startTimer + 0x8289 + true + true + 0x8289 + 0x1a + 0x1 + + + + .text:SysCtl_getLowSpeedClock + 0x82a3 + true + true + 0x82a3 + 0x1a + 0x1 + + + + .text:CPUTimer_isBaseValid + 0x82bd + true + true + 0x82bd + 0x17 + 0x1 + + + + .text + 0x82d4 + true + true + 0x82d4 + 0x17 + 0x1 + + + + .text:CPUTimer_stopTimer + 0x82eb + true + true + 0x82eb + 0x14 + 0x1 + + + + .text:CPUTimer_clearOverflowFlag + 0x82ff + true + true + 0x82ff + 0x12 + 0x1 + + + + .text:CPUTimer_disableInterrupt + 0x8311 + true + true + 0x8311 + 0x12 + 0x1 + + + + .text + 0x8323 + true + true + 0x8323 + 0x12 + 0x1 + + + + .text:CPUTimer_setPeriod + 0x8335 + true + true + 0x8335 + 0x11 + 0x1 + + + + .text:SysCtl_pollCpuTimer + 0x8346 + true + true + 0x8346 + 0xf + 0x1 + + + + .text:GPIO_isPinValid + 0x8355 + true + true + 0x8355 + 0xe + 0x1 + + + + .text:SysCtl_isMCDClockFailureDetected + 0x8363 + true + true + 0x8363 + 0xb + 0x1 + + + + .text:SysCtl_serviceWatchdog + 0x836e + true + true + 0x836e + 0x9 + 0x1 + + + + .text + 0x8377 + true + true + 0x8377 + 0x9 + 0x1 + + + + .text + 0x8380 + true + true + 0x8380 + 0x8 + 0x1 + + + + .text:decompress:none + 0x8388 + true + true + 0x8388 + 0x8 + 0x1 + + + + .text:SysCtl_resetMCD + 0x8390 + true + true + 0x8390 + 0x7 + 0x1 + + + + .text + 0xb000 + true + true + 0xb000 + 0x3ff + 0x1 + + + + .text:SysCtl_setClock + 0xb3ff + true + true + 0xb3ff + 0x209 + 0x1 + + + + .text:SysCtl_selectXTAL + 0xb608 + true + true + 0xb608 + 0x90 + 0x1 + + + + .text + 0xb698 + true + true + 0xb698 + 0x88 + 0x1 + + + + .text:SysCtl_getDeviceParametric + 0xb720 + true + true + 0xb720 + 0x68 + 0x1 + + + + .text:GPIO_setPadConfig + 0xb788 + true + true + 0xb788 + 0x52 + 0x1 + + + + .text + 0xb7da + true + true + 0xb7da + 0x20 + 0x1 + + + + .text + 0xb7fa + true + true + 0xb7fa + 0x2 + 0x1 + + + + .text + 0xb7fc + true + true + 0xb7fc + 0x1 + 0x1 + + + + .cinit..data.load + 0x128 + true + 0x128 + 0x9 + 0x1 + + + __TI_handler_table + 0x132 + true + 0x132 + 0x4 + 0x2 + + + __TI_cinit_table + 0x136 + true + 0x136 + 0x4 + 0x2 + + + .stack + true + true + 0x400 + 0x0 + 0x1 + + + + .stack + true + true + 0x400 + 0x0 + 0x2 + + + .const:.string + 0xa800 + true + 0xa800 + 0xc2 + 0x2 + + + + .const:.string + 0xa8c2 + true + 0xa8c2 + 0xbc + 0x2 + + + + .const:.string + 0xa97e + true + 0xa97e + 0x50 + 0x2 + + + + .const:.string + 0xa9ce + true + 0xa9ce + 0x13 + 0x2 + + + + .data + 0xa9e2 + true + 0xa9e2 + 0x6 + 0x2 + + + + .data + 0xa9e8 + true + 0xa9e8 + 0x6 + 0x2 + + + + .data:_lock + 0xa9ee + true + 0xa9ee + 0x2 + 0x2 + + + + .data:_unlock + 0xa9f0 + true + 0xa9f0 + 0x2 + 0x2 + + + + .TI.ramfunc + 0x123 + true + true + 0x123 + 0x4 + 0x1 + + + + .debug_types + 0x0 + 0x0 + 0x48f + 0x0 + + + + .debug_types + 0x48f + 0x48f + 0xfbd + 0x0 + + + + .debug_types + 0x144c + 0x144c + 0x332 + 0x0 + + + + .debug_types + 0x177e + 0x177e + 0x254 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_types + 0x19d2 + 0x19d2 + 0x4e8 + 0x0 + + + + .debug_types + 0x1eba + 0x1eba + 0x1c8 + 0x0 + + + + .debug_types + 0x2082 + 0x2082 + 0x191 + 0x0 + + + + .debug_types + 0x2213 + 0x2213 + 0xbf + 0x0 + + + + .debug_types + 0x22d2 + 0x22d2 + 0x2f + 0x0 + + + + .debug_types + 0x2301 + 0x2301 + 0xe1 + 0x0 + + + + .debug_types + 0x23e2 + 0x23e2 + 0xe3 + 0x0 + + + + .debug_types + 0x0 + 0x0 + 0x0 + 0x0 + + + + .debug_info + 0x0 + 0x0 + 0x38c + 0x0 + + + + .debug_info + 0x38c + 0x38c + 0x13c + 0x0 + + + + .debug_info + 0x4c8 + 0x4c8 + 0x13d + 0x0 + + + + .debug_info + 0x605 + 0x605 + 0x187 + 0x0 + + + + .debug_info + 0x78c + 0x78c + 0x1d6e + 0x0 + + + + .debug_info + 0x24fa + 0x24fa + 0x205 + 0x0 + + + + .debug_info + 0x26ff + 0x26ff + 0x27d + 0x0 + + + + .debug_info + 0x297c + 0x297c + 0x266 + 0x0 + + + + .debug_info + 0x2be2 + 0x2be2 + 0x2ae + 0x0 + + + + .debug_info + 0x2e90 + 0x2e90 + 0x296 + 0x0 + + + + .debug_info + 0x3126 + 0x3126 + 0x24f + 0x0 + + + + .debug_info + 0x3375 + 0x3375 + 0x1f2 + 0x0 + + + + .debug_info + 0x3567 + 0x3567 + 0x20e + 0x0 + + + + .debug_info + 0x3775 + 0x3775 + 0x1e4 + 0x0 + + + + .debug_info + 0x3959 + 0x3959 + 0x217 + 0x0 + + + + .debug_info + 0x3b70 + 0x3b70 + 0x244 + 0x0 + + + + .debug_info + 0x3db4 + 0x3db4 + 0x242 + 0x0 + + + + .debug_info + 0x3ff6 + 0x3ff6 + 0x24a + 0x0 + + + + .debug_info + 0x4240 + 0x4240 + 0x24d + 0x0 + + + + .debug_info + 0x448d + 0x448d + 0x24e + 0x0 + + + + .debug_info + 0x46db + 0x46db + 0x258 + 0x0 + + + + .debug_info + 0x4933 + 0x4933 + 0x27c + 0x0 + + + + .debug_info + 0x4baf + 0x4baf + 0x241 + 0x0 + + + + .debug_info + 0x4df0 + 0x4df0 + 0x277 + 0x0 + + + + .debug_info + 0x5067 + 0x5067 + 0x519 + 0x0 + + + + .debug_info + 0x5580 + 0x5580 + 0x3ba + 0x0 + + + + .debug_info + 0x593a + 0x593a + 0x243 + 0x0 + + + + .debug_info + 0x5b7d + 0x5b7d + 0x251 + 0x0 + + + + .debug_info + 0x5dce + 0x5dce + 0x241 + 0x0 + + + + .debug_info + 0x600f + 0x600f + 0x148 + 0x0 + + + + .debug_info + 0x6157 + 0x6157 + 0x117 + 0x0 + + + + .debug_info + 0x626e + 0x626e + 0x13d + 0x0 + + + + .debug_info + 0x63ab + 0x63ab + 0x1af + 0x0 + + + + .debug_info + 0x655a + 0x655a + 0x1a7 + 0x0 + + + + .debug_info + 0x6701 + 0x6701 + 0x1fc + 0x0 + + + + .debug_info + 0x68fd + 0x68fd + 0x18e + 0x0 + + + + .debug_info + 0x6a8b + 0x6a8b + 0x199 + 0x0 + + + + .debug_info + 0x6c24 + 0x6c24 + 0xf7 + 0x0 + + + + .debug_info + 0x6d1b + 0x6d1b + 0xfb + 0x0 + + + + .debug_info + 0x6e16 + 0x6e16 + 0x1f3 + 0x0 + + + + .debug_info + 0x7009 + 0x7009 + 0x15d + 0x0 + + + + .debug_info + 0x7166 + 0x7166 + 0x18b + 0x0 + + + + .debug_info + 0x72f1 + 0x72f1 + 0x137 + 0x0 + + + + .debug_info + 0x7428 + 0x7428 + 0xdc + 0x0 + + + .debug_line + 0x0 + 0x0 + 0xe6 + 0x0 + + + + .debug_line + 0xe6 + 0xe6 + 0x138 + 0x0 + + + + .debug_line + 0x21e + 0x21e + 0x55 + 0x0 + + + + .debug_line + 0x273 + 0x273 + 0x5d + 0x0 + + + + .debug_line + 0x2d0 + 0x2d0 + 0x37 + 0x0 + + + + .debug_line + 0x307 + 0x307 + 0x421 + 0x0 + + + + .debug_line + 0x728 + 0x728 + 0xc9 + 0x0 + + + + .debug_line + 0x7f1 + 0x7f1 + 0x98 + 0x0 + + + + .debug_line + 0x889 + 0x889 + 0xa2 + 0x0 + + + + .debug_line + 0x92b + 0x92b + 0xb1 + 0x0 + + + + .debug_line + 0x9dc + 0x9dc + 0x9f + 0x0 + + + + .debug_line + 0xa7b + 0xa7b + 0x9f + 0x0 + + + + .debug_line + 0xb1a + 0xb1a + 0x9f + 0x0 + + + + .debug_line + 0xbb9 + 0xbb9 + 0xe4 + 0x0 + + + + .debug_line + 0xc9d + 0xc9d + 0x9d + 0x0 + + + + .debug_line + 0xd3a + 0xd3a + 0x9a + 0x0 + + + + .debug_line + 0xdd4 + 0xdd4 + 0x9c + 0x0 + + + + .debug_line + 0xe70 + 0xe70 + 0x9c + 0x0 + + + + .debug_line + 0xf0c + 0xf0c + 0x9d + 0x0 + + + + .debug_line + 0xfa9 + 0xfa9 + 0x9d + 0x0 + + + + .debug_line + 0x1046 + 0x1046 + 0xa1 + 0x0 + + + + .debug_line + 0x10e7 + 0x10e7 + 0xa2 + 0x0 + + + + .debug_line + 0x1189 + 0x1189 + 0x9d + 0x0 + + + + .debug_line + 0x1226 + 0x1226 + 0x9d + 0x0 + + + + .debug_line + 0x12c3 + 0x12c3 + 0xa7 + 0x0 + + + + .debug_line + 0x136a + 0x136a + 0xa1 + 0x0 + + + + .debug_line + 0x140b + 0x140b + 0xb4 + 0x0 + + + + .debug_line + 0x14bf + 0x14bf + 0x19e + 0x0 + + + + .debug_line + 0x165d + 0x165d + 0xd2 + 0x0 + + + + .debug_line + 0x172f + 0x172f + 0xbe + 0x0 + + + + .debug_line + 0x17ed + 0x17ed + 0xa1 + 0x0 + + + + .debug_line + 0x188e + 0x188e + 0xc7 + 0x0 + + + + .debug_line + 0x1955 + 0x1955 + 0x14b + 0x0 + + + + .debug_line + 0x1aa0 + 0x1aa0 + 0x4f + 0x0 + + + + .debug_line + 0x1aef + 0x1aef + 0xae + 0x0 + + + + .debug_line + 0x1b9d + 0x1b9d + 0x3f + 0x0 + + + + .debug_line + 0x1bdc + 0x1bdc + 0x21 + 0x0 + + + + .debug_line + 0x1bfd + 0x1bfd + 0x74 + 0x0 + + + + .debug_line + 0x1c71 + 0x1c71 + 0x21 + 0x0 + + + + .debug_line + 0x1c92 + 0x1c92 + 0x57 + 0x0 + + + + .debug_line + 0x1ce9 + 0x1ce9 + 0x21 + 0x0 + + + + .debug_line + 0x1d0a + 0x1d0a + 0x9a + 0x0 + + + + .debug_line + 0x1da4 + 0x1da4 + 0x21 + 0x0 + + + + .debug_line + 0x1dc5 + 0x1dc5 + 0x2b + 0x0 + + + + .debug_line + 0x1df0 + 0x1df0 + 0x66 + 0x0 + + + + .debug_line + 0x1e56 + 0x1e56 + 0x21 + 0x0 + + + + .debug_line + 0x1e77 + 0x1e77 + 0x2c + 0x0 + + + + .debug_line + 0x1ea3 + 0x1ea3 + 0x2c + 0x0 + + + + .debug_line + 0x1ecf + 0x1ecf + 0x5f + 0x0 + + + + .debug_line + 0x1f2e + 0x1f2e + 0x21 + 0x0 + + + + .debug_line + 0x1f4f + 0x1f4f + 0x50 + 0x0 + + + + .debug_line + 0x1f9f + 0x1f9f + 0x30 + 0x0 + + + + .debug_line + 0x1fcf + 0x1fcf + 0x57 + 0x0 + + + + .debug_line + 0x2026 + 0x2026 + 0x21 + 0x0 + + + + .debug_line + 0x2047 + 0x2047 + 0x3b + 0x0 + + + + .debug_line + 0x2082 + 0x2082 + 0x21 + 0x0 + + + + .debug_frame + 0x0 + 0x0 + 0x78 + 0x4 + + + + .debug_frame + 0x78 + 0x78 + 0x230 + 0x4 + + + + .debug_frame + 0x2a8 + 0x2a8 + 0x44 + 0x4 + + + + .debug_frame + 0x2ec + 0x2ec + 0x44 + 0x4 + + + + .debug_frame + 0x330 + 0x330 + 0x44 + 0x4 + + + + .debug_frame + 0x374 + 0x374 + 0x44 + 0x4 + + + + .debug_frame + 0x3b8 + 0x3b8 + 0x44 + 0x4 + + + + .debug_frame + 0x3fc + 0x3fc + 0x44 + 0x4 + + + + .debug_frame + 0x440 + 0x440 + 0x40 + 0x4 + + + + .debug_frame + 0x480 + 0x480 + 0x40 + 0x4 + + + + .debug_frame + 0x4c0 + 0x4c0 + 0x40 + 0x4 + + + + .debug_frame + 0x500 + 0x500 + 0x44 + 0x4 + + + + .debug_frame + 0x544 + 0x544 + 0x44 + 0x4 + + + + .debug_frame + 0x588 + 0x588 + 0x44 + 0x4 + + + + .debug_frame + 0x5cc + 0x5cc + 0x44 + 0x4 + + + + .debug_frame + 0x610 + 0x610 + 0x44 + 0x4 + + + + .debug_frame + 0x654 + 0x654 + 0x44 + 0x4 + + + + .debug_frame + 0x698 + 0x698 + 0x44 + 0x4 + + + + .debug_frame + 0x6dc + 0x6dc + 0x44 + 0x4 + + + + .debug_frame + 0x720 + 0x720 + 0x40 + 0x4 + + + + .debug_frame + 0x760 + 0x760 + 0x44 + 0x4 + + + + .debug_frame + 0x7a4 + 0x7a4 + 0x50 + 0x4 + + + + .debug_frame + 0x7f4 + 0x7f4 + 0x44 + 0x4 + + + + .debug_frame + 0x838 + 0x838 + 0x44 + 0x4 + + + + .debug_frame + 0x87c + 0x87c + 0x44 + 0x4 + + + + .debug_frame + 0x8c0 + 0x8c0 + 0x44 + 0x4 + + + + .debug_frame + 0x904 + 0x904 + 0x40 + 0x4 + + + + .debug_frame + 0x944 + 0x944 + 0x58 + 0x4 + + + + .debug_frame + 0x99c + 0x99c + 0x40 + 0x4 + + + + .debug_frame + 0x9dc + 0x9dc + 0x40 + 0x4 + + + + .debug_frame + 0xa1c + 0xa1c + 0x60 + 0x4 + + + + .debug_frame + 0xa7c + 0xa7c + 0x70 + 0x4 + + + + .debug_frame + 0xaec + 0xaec + 0x40 + 0x4 + + + + .debug_frame + 0xb2c + 0xb2c + 0x40 + 0x4 + + + + .debug_frame + 0xb6c + 0xb6c + 0x40 + 0x4 + + + + .debug_abbrev + 0x0 + 0x0 + 0xae + 0x0 + + + + .debug_abbrev + 0xae + 0xae + 0x69 + 0x0 + + + + .debug_abbrev + 0x117 + 0x117 + 0x25 + 0x0 + + + + .debug_abbrev + 0x13c + 0x13c + 0x25 + 0x0 + + + + .debug_abbrev + 0x161 + 0x161 + 0x28 + 0x0 + + + + .debug_abbrev + 0x189 + 0x189 + 0x103 + 0x0 + + + + .debug_abbrev + 0x28c + 0x28c + 0xa5 + 0x0 + + + + .debug_abbrev + 0x331 + 0x331 + 0x5c + 0x0 + + + + .debug_abbrev + 0x38d + 0x38d + 0x6a + 0x0 + + + + .debug_abbrev + 0x3f7 + 0x3f7 + 0x6a + 0x0 + + + + .debug_abbrev + 0x461 + 0x461 + 0x6a + 0x0 + + + + .debug_abbrev + 0x4cb + 0x4cb + 0x6a + 0x0 + + + + .debug_abbrev + 0x535 + 0x535 + 0x5c + 0x0 + + + + .debug_abbrev + 0x591 + 0x591 + 0x69 + 0x0 + + + + .debug_abbrev + 0x5fa + 0x5fa + 0x44 + 0x0 + + + + .debug_abbrev + 0x63e + 0x63e + 0x46 + 0x0 + + + + .debug_abbrev + 0x684 + 0x684 + 0x44 + 0x0 + + + + .debug_abbrev + 0x6c8 + 0x6c8 + 0x5c + 0x0 + + + + .debug_abbrev + 0x724 + 0x724 + 0x68 + 0x0 + + + + .debug_abbrev + 0x78c + 0x78c + 0x68 + 0x0 + + + + .debug_abbrev + 0x7f4 + 0x7f4 + 0x68 + 0x0 + + + + .debug_abbrev + 0x85c + 0x85c + 0x68 + 0x0 + + + + .debug_abbrev + 0x8c4 + 0x8c4 + 0x68 + 0x0 + + + + .debug_abbrev + 0x92c + 0x92c + 0x6a + 0x0 + + + + .debug_abbrev + 0x996 + 0x996 + 0x68 + 0x0 + + + + .debug_abbrev + 0x9fe + 0x9fe + 0x52 + 0x0 + + + + .debug_abbrev + 0xa50 + 0xa50 + 0x6c + 0x0 + + + + .debug_abbrev + 0xabc + 0xabc + 0x6c + 0x0 + + + + .debug_abbrev + 0xb28 + 0xb28 + 0x5f + 0x0 + + + + .debug_abbrev + 0xb87 + 0xb87 + 0x6a + 0x0 + + + + .debug_abbrev + 0xbf1 + 0xbf1 + 0x6c + 0x0 + + + + .debug_abbrev + 0xc5d + 0xc5d + 0x5e + 0x0 + + + + .debug_abbrev + 0xcbb + 0xcbb + 0x8f + 0x0 + + + + .debug_abbrev + 0xd4a + 0xd4a + 0x3d + 0x0 + + + + .debug_abbrev + 0xd87 + 0xd87 + 0x3b + 0x0 + + + + .debug_abbrev + 0xdc2 + 0xdc2 + 0x4b + 0x0 + + + + .debug_abbrev + 0xe0d + 0xe0d + 0x1c + 0x0 + + + + .debug_abbrev + 0xe29 + 0xe29 + 0x71 + 0x0 + + + + .debug_abbrev + 0xe9a + 0xe9a + 0xb3 + 0x0 + + + + .debug_abbrev + 0xf4d + 0xf4d + 0x6d + 0x0 + + + + .debug_abbrev + 0xfba + 0xfba + 0x44 + 0x0 + + + + .debug_abbrev + 0xffe + 0xffe + 0x5f + 0x0 + + + + .debug_abbrev + 0x105d + 0x105d + 0x44 + 0x0 + + + + .debug_abbrev + 0x10a1 + 0x10a1 + 0x28 + 0x0 + + + + .debug_abbrev + 0x10c9 + 0x10c9 + 0xa0 + 0x0 + + + + .debug_abbrev + 0x1169 + 0x1169 + 0x57 + 0x0 + + + + .debug_abbrev + 0x11c0 + 0x11c0 + 0x28 + 0x0 + + + + .debug_abbrev + 0x11e8 + 0x11e8 + 0x28 + 0x0 + + + + .debug_abbrev + 0x1210 + 0x1210 + 0x5f + 0x0 + + + + .debug_abbrev + 0x126f + 0x126f + 0x3a + 0x0 + + + + .debug_abbrev + 0x12a9 + 0x12a9 + 0x64 + 0x0 + + + + .debug_abbrev + 0x130d + 0x130d + 0x79 + 0x0 + + + + .debug_abbrev + 0x1386 + 0x1386 + 0x61 + 0x0 + + + + .debug_abbrev + 0x13e7 + 0x13e7 + 0x44 + 0x0 + + + + .debug_abbrev + 0x142b + 0x142b + 0x49 + 0x0 + + + + .debug_abbrev + 0x1474 + 0x1474 + 0x1c + 0x0 + + + + .debug_abbrev + 0x1490 + 0x1490 + 0xf + 0x0 + + + .debug_str + 0x0 + 0x0 + 0x6a + 0x0 + + + + .debug_str + 0x6a + 0x6a + 0x6a + 0x0 + + + + .debug_str + 0xd4 + 0xd4 + 0x69 + 0x0 + + + + .debug_str + 0x13d + 0x13d + 0x69 + 0x0 + + + + .debug_str + 0x1a6 + 0x1a6 + 0x6a + 0x0 + + + + .debug_str + 0x210 + 0x210 + 0x6a + 0x0 + + + + .debug_str + 0x27a + 0x27a + 0x6a + 0x0 + + + + .debug_str + 0x2e4 + 0x2e4 + 0x6a + 0x0 + + + + .debug_str + 0x34e + 0x34e + 0x6a + 0x0 + + + + .debug_str + 0x3b8 + 0x3b8 + 0x6a + 0x0 + + + + .debug_str + 0x422 + 0x422 + 0x6a + 0x0 + + + + .debug_str + 0x48c + 0x48c + 0x6a + 0x0 + + + + .debug_str + 0x4f6 + 0x4f6 + 0x6a + 0x0 + + + + .debug_aranges + 0x0 + 0x0 + 0x30 + 0x0 + + + + .debug_aranges + 0x30 + 0x30 + 0x20 + 0x0 + + + + .debug_aranges + 0x50 + 0x50 + 0x20 + 0x0 + + + + .debug_aranges + 0x70 + 0x70 + 0xb8 + 0x0 + + + + .debug_aranges + 0x128 + 0x128 + 0x20 + 0x0 + + + + .debug_aranges + 0x148 + 0x148 + 0x20 + 0x0 + + + + .debug_aranges + 0x168 + 0x168 + 0x20 + 0x0 + + + + .debug_aranges + 0x188 + 0x188 + 0x20 + 0x0 + + + + .debug_aranges + 0x1a8 + 0x1a8 + 0x20 + 0x0 + + + + .debug_aranges + 0x1c8 + 0x1c8 + 0x20 + 0x0 + + + + .debug_aranges + 0x1e8 + 0x1e8 + 0x20 + 0x0 + + + + .debug_aranges + 0x208 + 0x208 + 0x20 + 0x0 + + + + .debug_aranges + 0x228 + 0x228 + 0x20 + 0x0 + + + + .debug_aranges + 0x248 + 0x248 + 0x20 + 0x0 + + + + .debug_aranges + 0x268 + 0x268 + 0x20 + 0x0 + + + + .debug_aranges + 0x288 + 0x288 + 0x20 + 0x0 + + + + .debug_aranges + 0x2a8 + 0x2a8 + 0x20 + 0x0 + + + + .debug_aranges + 0x2c8 + 0x2c8 + 0x20 + 0x0 + + + + .debug_aranges + 0x2e8 + 0x2e8 + 0x20 + 0x0 + + + + .debug_aranges + 0x308 + 0x308 + 0x20 + 0x0 + + + + .debug_aranges + 0x328 + 0x328 + 0x20 + 0x0 + + + + .debug_aranges + 0x348 + 0x348 + 0x20 + 0x0 + + + + .debug_aranges + 0x368 + 0x368 + 0x20 + 0x0 + + + + .debug_aranges + 0x388 + 0x388 + 0x20 + 0x0 + + + + .debug_aranges + 0x3a8 + 0x3a8 + 0x20 + 0x0 + + + + .debug_aranges + 0x3c8 + 0x3c8 + 0x20 + 0x0 + + + + .debug_aranges + 0x3e8 + 0x3e8 + 0x20 + 0x0 + + + + .debug_aranges + 0x408 + 0x408 + 0x20 + 0x0 + + + + .debug_aranges + 0x428 + 0x428 + 0x20 + 0x0 + + + + .debug_aranges + 0x448 + 0x448 + 0x20 + 0x0 + + + + .debug_aranges + 0x468 + 0x468 + 0x20 + 0x0 + + + + .debug_aranges + 0x488 + 0x488 + 0x20 + 0x0 + + + + .debug_aranges + 0x4a8 + 0x4a8 + 0x20 + 0x0 + + + + .debug_aranges + 0x4c8 + 0x4c8 + 0x20 + 0x0 + + + + .debug_aranges + 0x4e8 + 0x4e8 + 0x28 + 0x0 + + + + .debug_aranges + 0x510 + 0x510 + 0x30 + 0x0 + + + + .debug_aranges + 0x540 + 0x540 + 0x20 + 0x0 + + + + .debug_aranges + 0x560 + 0x560 + 0x20 + 0x0 + + + + .debug_aranges + 0x580 + 0x580 + 0x20 + 0x0 + + + + .debug_pubnames + 0x0 + 0x0 + 0x41 + 0x0 + + + + .debug_pubnames + 0x41 + 0x41 + 0x44 + 0x0 + + + + .debug_pubnames + 0x85 + 0x85 + 0x45 + 0x0 + + + + .debug_pubnames + 0xca + 0xca + 0x4c + 0x0 + + + + .debug_pubnames + 0x116 + 0x116 + 0x239 + 0x0 + + + + .debug_pubnames + 0x34f + 0x34f + 0x26 + 0x0 + + + + .debug_pubnames + 0x375 + 0x375 + 0x2c + 0x0 + + + + .debug_pubnames + 0x3a1 + 0x3a1 + 0x28 + 0x0 + + + + .debug_pubnames + 0x3c9 + 0x3c9 + 0x30 + 0x0 + + + + .debug_pubnames + 0x3f9 + 0x3f9 + 0x2d + 0x0 + + + + .debug_pubnames + 0x426 + 0x426 + 0x28 + 0x0 + + + + .debug_pubnames + 0x44e + 0x44e + 0x2d + 0x0 + + + + .debug_pubnames + 0x47b + 0x47b + 0x37 + 0x0 + + + + .debug_pubnames + 0x4b2 + 0x4b2 + 0x26 + 0x0 + + + + .debug_pubnames + 0x4d8 + 0x4d8 + 0x2b + 0x0 + + + + .debug_pubnames + 0x503 + 0x503 + 0x31 + 0x0 + + + + .debug_pubnames + 0x534 + 0x534 + 0x30 + 0x0 + + + + .debug_pubnames + 0x564 + 0x564 + 0x29 + 0x0 + + + + .debug_pubnames + 0x58d + 0x58d + 0x2a + 0x0 + + + + .debug_pubnames + 0x5b7 + 0x5b7 + 0x29 + 0x0 + + + + .debug_pubnames + 0x5e0 + 0x5e0 + 0x36 + 0x0 + + + + .debug_pubnames + 0x616 + 0x616 + 0x31 + 0x0 + + + + .debug_pubnames + 0x647 + 0x647 + 0x2a + 0x0 + + + + .debug_pubnames + 0x671 + 0x671 + 0x26 + 0x0 + + + + .debug_pubnames + 0x697 + 0x697 + 0x26 + 0x0 + + + + .debug_pubnames + 0x6bd + 0x6bd + 0x28 + 0x0 + + + + .debug_pubnames + 0x6e5 + 0x6e5 + 0x2d + 0x0 + + + + .debug_pubnames + 0x712 + 0x712 + 0x2e + 0x0 + + + + .debug_pubnames + 0x740 + 0x740 + 0x31 + 0x0 + + + + .debug_pubnames + 0x771 + 0x771 + 0x1f + 0x0 + + + + .debug_pubnames + 0x790 + 0x790 + 0x25 + 0x0 + + + + .debug_pubnames + 0x7b5 + 0x7b5 + 0x27 + 0x0 + + + + .debug_pubnames + 0x7dc + 0x7dc + 0x35 + 0x0 + + + + .debug_pubnames + 0x811 + 0x811 + 0x2b + 0x0 + + + + .debug_pubnames + 0x83c + 0x83c + 0x2b + 0x0 + + + + .debug_pubnames + 0x867 + 0x867 + 0x5e + 0x0 + + + + .debug_pubnames + 0x8c5 + 0x8c5 + 0x25 + 0x0 + + + + .debug_pubnames + 0x8ea + 0x8ea + 0x1c + 0x0 + + + + .debug_pubnames + 0x906 + 0x906 + 0x1e + 0x0 + + + + .debug_pubnames + 0x924 + 0x924 + 0x43 + 0x0 + + + + .debug_pubnames + 0x967 + 0x967 + 0x21 + 0x0 + + + + .debug_pubnames + 0x988 + 0x988 + 0x1d + 0x0 + + + + .debug_pubnames + 0x9a5 + 0x9a5 + 0x29 + 0x0 + + + + + + codestart + 0x0 + 0x0 + 0x2 + + + + + + .text.1 + 0x8000 + 0x8000 + 0x397 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .text.2 + 0xb000 + 0xb000 + 0x7fd + + + + + + + + + + + + + + .text + + + + + + + .cinit + 0x128 + 0x128 + 0x12 + + + + + + + + .switch + 0x0 + 0x0 + + + + + .reset + 0x3fffc0 + 0x0 + + + + + .stack + 0x400 + 0x100 + + + + + + + .bss + 0x0 + 0x0 + + + + + .bss:output + 0x0 + 0x0 + + + + + .init_array + 0x0 + 0x0 + + + + + .const + 0xa800 + 0xa800 + 0x1e1 + + + + + + + + + .data + 0xa9e2 + 0x10 + + + + + + + + + .sysmem + 0x0 + 0x0 + + + + + Filter_RegsFile + 0x0 + 0x0 + + + + + ramgs0 + 0x0 + 0x0 + + + + + ramgs1 + 0x0 + 0x0 + + + + + .TI.ramfunc + 0x123 + 0x123 + 0x4 + + + + + + PUTBUFFER + 0x0 + 0x0 + + + + + PUTWRITEIDX + 0x0 + 0x0 + + + + + GETREADIDX + 0x0 + 0x0 + + + + + GROUP_1 + 0x0 + 0x0 + + + + + + true + + + GETBUFFER + 0x3f800 + 0x0 + + + + + GETWRITEIDX + 0x3f800 + 0x0 + + + + + PUTREADIDX + 0x3f800 + 0x0 + + + + + GROUP_2 + 0x3f800 + 0x0 + + + + + + true + + + Filter1_RegsFile + 0xd000 + 0xd000 + 0x0 + + + + + Filter2_RegsFile + 0xe000 + 0xe000 + 0x0 + + + + + Filter3_RegsFile + 0xf000 + 0xf000 + 0x0 + + + + + Filter4_RegsFile + 0x10000 + 0x10000 + 0x0 + + + + + Difference_RegsFile + 0x11000 + 0x11000 + 0x0 + + + + + .ppdata + 0x0 + 0x0 + + + + + .debug_types + 0x0 + 0x0 + 0x24c5 + + + + + + + + + + + + + + + + + + .debug_info + 0x0 + 0x0 + 0x7504 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_line + 0x0 + 0x0 + 0x20a3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_frame + 0x0 + 0x0 + 0xbac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_abbrev + 0x0 + 0x0 + 0x149f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_str + 0x0 + 0x0 + 0x560 + + + + + + + + + + + + + + + + + + .debug_aranges + 0x0 + 0x0 + 0x5a0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .debug_pubnames + 0x0 + 0x0 + 0x9ce + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SEGMENT_0 + 0x0 + 0x0 + 0x2 + 0x5 + + + + + + SEGMENT_1 + 0x123 + 0x123 + 0x4 + 0x5 + + + + + + SEGMENT_2 + 0x128 + 0x128 + 0x12 + 0x4 + + + + + + SEGMENT_3 + 0x8000 + 0x8000 + 0x397 + 0x5 + + + + + + SEGMENT_4 + 0xb000 + 0xb000 + 0x7fd + 0x5 + + + + + + SEGMENT_5 + 0x400 + 0x100 + 0x6 + + + + + + SEGMENT_6 + 0xa800 + 0xa800 + 0x1e1 + 0x4 + + + + + + SEGMENT_7 + 0xa9e2 + 0x10 + 0x6 + + + + + + + + BEGIN + 0x0 + 0x0 + 0x2 + 0x2 + 0x0 + RWIX + + + 0x0 + 0x2 + + + + + + RAMM0 + 0x0 + 0x123 + 0x2dd + 0x16 + 0x2c7 + RWIX + + + 0x123 + 0x4 + + + + 0x127 + 0x1 + + + 0x128 + 0x12 + + + + 0x13a + 0x2c6 + + + + + RAMLS0 + 0x0 + 0x8000 + 0x800 + 0x397 + 0x469 + RWIX + + + 0x8000 + 0x397 + + + + 0x8397 + 0x469 + + + + + RAMLS1 + 0x0 + 0x8800 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMLS2 + 0x0 + 0x9000 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMLS3 + 0x0 + 0x9800 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMLS4 + 0x0 + 0xa000 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMD0 + 0x0 + 0xb000 + 0x800 + 0x7fd + 0x3 + RWIX + + + 0xb000 + 0x7fd + + + + 0xb7fd + 0x3 + + + + + FLASHA + 0x0 + 0x80002 + 0x1ffe + 0x0 + 0x1ffe + RWIX + + + + + FLASHB + 0x0 + 0x82000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHC + 0x0 + 0x84000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHD + 0x0 + 0x86000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHE + 0x0 + 0x88000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHF + 0x0 + 0x90000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHG + 0x0 + 0x98000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHH + 0x0 + 0xa0000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHI + 0x0 + 0xa8000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHJ + 0x0 + 0xb0000 + 0x8000 + 0x0 + 0x8000 + RWIX + + + + + FLASHK + 0x0 + 0xb8000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHL + 0x0 + 0xba000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHM + 0x0 + 0xbc000 + 0x2000 + 0x0 + 0x2000 + RWIX + + + + + FLASHN + 0x0 + 0xbe000 + 0x1ff0 + 0x0 + 0x1ff0 + RWIX + + + + + RESET + 0x0 + 0x3fffc0 + 0x2 + 0x0 + 0x2 + RWIX + + + + + BOOT_RSVD + 0x1 + 0x2 + 0x121 + 0x0 + 0x121 + RWIX + + + + + RAMM1 + 0x1 + 0x400 + 0x3f8 + 0x100 + 0x2f8 + RWIX + + + 0x400 + 0x100 + + + + 0x500 + 0x2f8 + + + + + RAMLS5 + 0x1 + 0xa800 + 0x800 + 0x1f1 + 0x60f + RWIX + + + 0xa800 + 0x1e1 + + + + 0xa9e1 + 0x1 + + + 0xa9e2 + 0x10 + + + + 0xa9f2 + 0x60e + + + + + RAMD1 + 0x1 + 0xb800 + 0x800 + 0x0 + 0x800 + RWIX + + + + + RAMGS0 + 0x1 + 0xc000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS1 + 0x1 + 0xd000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS2 + 0x1 + 0xe000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS3 + 0x1 + 0xf000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS4 + 0x1 + 0x10000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS5 + 0x1 + 0x11000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS6 + 0x1 + 0x12000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS7 + 0x1 + 0x13000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS8 + 0x1 + 0x14000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS9 + 0x1 + 0x15000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS10 + 0x1 + 0x16000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS11 + 0x1 + 0x17000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS12 + 0x1 + 0x18000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS13 + 0x1 + 0x19000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS14 + 0x1 + 0x1a000 + 0x1000 + 0x0 + 0x1000 + RWIX + + + + + RAMGS15 + 0x1 + 0x1b000 + 0xff8 + 0x0 + 0xff8 + RWIX + + + + + CPU2TOCPU1RAM + 0x1 + 0x3f800 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CPU1TOCPU2RAM + 0x1 + 0x3fc00 + 0x400 + 0x0 + 0x400 + RWIX + + + + + CANA_MSG_RAM + 0x1 + 0x49000 + 0x800 + 0x0 + 0x800 + RWIX + + + + + CANB_MSG_RAM + 0x1 + 0x4b000 + 0x800 + 0x0 + 0x800 + RWIX + + + + + + + __TI_cinit_table + + .data + 0x128 + 0x9 + 0xa9e2 + 0x10 + lzss + + + + + __TI_handler_table + + 0x0 + __TI_decompress_lzss + + + 0x1 + __TI_decompress_none + + + + + __TI_CINIT_Base + 0x136 + + + __TI_CINIT_Limit + 0x13a + + + __TI_CINIT_Warm + 0x13a + + + __TI_Handler_Table_Base + 0x132 + + + __TI_Handler_Table_Limit + 0x136 + + + __TI_STACK_SIZE + 0x100 + + + __TI_STACK_END + 0x500 + + + __c_args__ + 0xffffffff + + + __TI_pprof_out_hndl + 0xffffffff + + + __TI_prof_data_start + 0xffffffff + + + __TI_prof_data_size + 0xffffffff + + + main + 0x8084 + + + + code_start + 0x0 + + + + Device_enableAllPeripherals + 0xb0f0 + + + + Device_initGPIO + 0xb1db + + + + Example_Fail + 0xa9e6 + + + + Example_setResultFail + 0xb3f9 + + + + Device_bootCPU2 + 0xb273 + + + + Device_init + 0xb0ae + + + + Example_Result + 0xa9e2 + + + + Device_enableUnbondedGPIOPullups + 0xb22c + + + + __error__ + 0xb3ed + + + + Example_setResultPass + 0xb3f4 + + + + Device_configureTMXAnalogTrim + 0xb242 + + + + Device_enableUnbondedGPIOPullupsFor176Pin + 0xb1fc + + + + Example_done + 0xb3fe + + + + Example_PassCount + 0xa9e4 + + + + Device_enableUnbondedGPIOPullupsFor100Pin + 0xb20f + + + + GPIO_setQualificationMode + 0x8158 + + + + GPIO_setPadConfig + 0xb788 + + + + GPIO_setDirectionMode + 0x818f + + + + GPIO_setPinConfig + 0x8121 + + + + GPIO_setControllerCore + 0x80ea + + + + SysCtl_delay + 0x123 + + + + SysCtl_getDeviceParametric + 0xb720 + + + + SysCtl_selectXTAL + 0xb608 + + + + SysCtl_selectOscSource + 0x80a2 + + + + SysCtl_getLowSpeedClock + 0x82a3 + + + + SysCtl_setClock + 0xb3ff + + + + SysCtl_getClock + 0x8000 + + + + _c_int00 + 0x82d4 + + + + __stack + 0x400 + + + + __c28xabi_divf + 0xb698 + + + + _system_pre_init + 0xb7fa + + + + __TI_auto_init_nobinit_nopinit + 0x81ee + + + + __TI_decompress_none + 0x8388 + + + + __TI_decompress_lzss + 0x81c0 + + + + C$$EXIT + 0x8219 + + + + abort + 0x8219 + + + + exit + 0x821b + + + + __TI_dtors_ptr + 0xa9ec + + + + __TI_cleanup_ptr + 0xa9ea + + + + __TI_enable_exit_profile_output + 0xa9e8 + + + + _nop + 0x837f + + + + _lock + 0xa9ee + + + + _unlock + 0xa9f0 + + + + _register_lock + 0x837b + + + + _register_unlock + 0x8377 + + + + _args_main + 0x8323 + + + + memcpy + 0xb7da + + + + _system_post_cinit + 0xb7fc + + + + Link successful +
    diff --git a/gpio_driverlib_cpu1/CPU1_RAM/makefile b/gpio_driverlib_cpu1/CPU1_RAM/makefile new file mode 100644 index 0000000..c5463b7 --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/makefile @@ -0,0 +1,149 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +CG_TOOL_ROOT := /Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS + +GEN_OPTS__FLAG := +GEN_CMDS__FLAG := + +ORDERED_OBJS += \ +"./gpio_driverlib_cpu1.obj" \ +"./device/F2837xD_CodeStartBranch.obj" \ +"./device/device.obj" \ +"../2837xD_RAM_lnk_cpu1.cmd" \ +"/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/ccs/Debug/driverlib.lib" \ +$(GEN_CMDS__FLAG) \ +-llibc.a \ + +-include ../makefile.init + +RM := rm -rf +RMDIR := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include subdir_vars.mk +-include device/subdir_vars.mk +-include subdir_rules.mk +-include device/subdir_rules.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C55_DEPS)),) +-include $(C55_DEPS) +endif +ifneq ($(strip $(C_UPPER_DEPS)),) +-include $(C_UPPER_DEPS) +endif +ifneq ($(strip $(S67_DEPS)),) +-include $(S67_DEPS) +endif +ifneq ($(strip $(S62_DEPS)),) +-include $(S62_DEPS) +endif +ifneq ($(strip $(S_DEPS)),) +-include $(S_DEPS) +endif +ifneq ($(strip $(OPT_DEPS)),) +-include $(OPT_DEPS) +endif +ifneq ($(strip $(C??_DEPS)),) +-include $(C??_DEPS) +endif +ifneq ($(strip $(ASM_UPPER_DEPS)),) +-include $(ASM_UPPER_DEPS) +endif +ifneq ($(strip $(S??_DEPS)),) +-include $(S??_DEPS) +endif +ifneq ($(strip $(C64_DEPS)),) +-include $(C64_DEPS) +endif +ifneq ($(strip $(CXX_DEPS)),) +-include $(CXX_DEPS) +endif +ifneq ($(strip $(S64_DEPS)),) +-include $(S64_DEPS) +endif +ifneq ($(strip $(CLA_DEPS)),) +-include $(CLA_DEPS) +endif +ifneq ($(strip $(S55_DEPS)),) +-include $(S55_DEPS) +endif +ifneq ($(strip $(SV7A_DEPS)),) +-include $(SV7A_DEPS) +endif +ifneq ($(strip $(C62_DEPS)),) +-include $(C62_DEPS) +endif +ifneq ($(strip $(C67_DEPS)),) +-include $(C67_DEPS) +endif +ifneq ($(strip $(K_DEPS)),) +-include $(K_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +ifneq ($(strip $(CC_DEPS)),) +-include $(CC_DEPS) +endif +ifneq ($(strip $(C++_DEPS)),) +-include $(C++_DEPS) +endif +ifneq ($(strip $(C43_DEPS)),) +-include $(C43_DEPS) +endif +ifneq ($(strip $(S43_DEPS)),) +-include $(S43_DEPS) +endif +ifneq ($(strip $(ASM_DEPS)),) +-include $(ASM_DEPS) +endif +ifneq ($(strip $(S_UPPER_DEPS)),) +-include $(S_UPPER_DEPS) +endif +ifneq ($(strip $(CPP_DEPS)),) +-include $(CPP_DEPS) +endif +ifneq ($(strip $(SA_DEPS)),) +-include $(SA_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables +EXE_OUTPUTS += \ +gpio_driverlib_cpu1.out + +EXE_OUTPUTS__QUOTED += \ +"gpio_driverlib_cpu1.out" + + +# All Target +all: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @$(MAKE) --no-print-directory -Onone "gpio_driverlib_cpu1.out" + +# Tool invocations +gpio_driverlib_cpu1.out: $(OBJS) $(CMD_SRCS) $(LIB_SRCS) $(GEN_CMDS) + @echo 'C2000 Linker - building target: "$@"' + "/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/bin/cl2000" -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -Ooff --define=DEBUG --define=CPU1 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi -z -m"gpio_driverlib_cpu1.map" --stack_size=0x100 --warn_sections -i"/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/lib" -i"/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --reread_libs --diag_wrap=off --display_error_number --xml_link_info="gpio_driverlib_cpu1_linkInfo.xml" --entry_point=code_start --rom_model -o "gpio_driverlib_cpu1.out" $(ORDERED_OBJS) + @echo 'Finished building target: "$@"' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(EXE_OUTPUTS__QUOTED) + -$(RM) "gpio_driverlib_cpu1.obj" "device/F2837xD_CodeStartBranch.obj" "device/device.obj" + -$(RM) "gpio_driverlib_cpu1.d" "device/device.d" + -$(RM) "device/F2837xD_CodeStartBranch.d" + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets + diff --git a/gpio_driverlib_cpu1/CPU1_RAM/objects.mk b/gpio_driverlib_cpu1/CPU1_RAM/objects.mk new file mode 100644 index 0000000..ad64ce9 --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := -llibc.a + diff --git a/gpio_driverlib_cpu1/CPU1_RAM/sources.mk b/gpio_driverlib_cpu1/CPU1_RAM/sources.mk new file mode 100644 index 0000000..beb2fed --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/sources.mk @@ -0,0 +1,110 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C55_SRCS := +A_SRCS := +ASM_UPPER_SRCS := +EXE_SRCS := +LDS_UPPER_SRCS := +CPP_SRCS := +CMD_SRCS := +O_SRCS := +ELF_SRCS := +C??_SRCS := +C64_SRCS := +C67_SRCS := +SA_SRCS := +S64_SRCS := +OPT_SRCS := +CXX_SRCS := +S67_SRCS := +S??_SRCS := +SV7A_SRCS := +K_SRCS := +CLA_SRCS := +S55_SRCS := +LD_UPPER_SRCS := +OUT_SRCS := +LIB_SRCS := +ASM_SRCS := +S_UPPER_SRCS := +S43_SRCS := +LD_SRCS := +CMD_UPPER_SRCS := +C_UPPER_SRCS := +C++_SRCS := +C43_SRCS := +OBJ_SRCS := +LDS_SRCS := +S_SRCS := +CC_SRCS := +S62_SRCS := +C62_SRCS := +C_SRCS := +C55_DEPS := +C_UPPER_DEPS := +S67_DEPS := +S62_DEPS := +S_DEPS := +OPT_DEPS := +C??_DEPS := +ASM_UPPER_DEPS := +S??_DEPS := +C64_DEPS := +CXX_DEPS := +S64_DEPS := +CLA_DEPS := +S55_DEPS := +SV7A_DEPS := +EXE_OUTPUTS := +C62_DEPS := +C67_DEPS := +K_DEPS := +C_DEPS := +CC_DEPS := +BIN_OUTPUTS := +C++_DEPS := +C43_DEPS := +S43_DEPS := +OBJS := +ASM_DEPS := +S_UPPER_DEPS := +CPP_DEPS := +SA_DEPS := +C++_DEPS__QUOTED := +OPT_DEPS__QUOTED := +SA_DEPS__QUOTED := +S_UPPER_DEPS__QUOTED := +C??_DEPS__QUOTED := +S67_DEPS__QUOTED := +C55_DEPS__QUOTED := +CC_DEPS__QUOTED := +ASM_UPPER_DEPS__QUOTED := +SV7A_DEPS__QUOTED := +S??_DEPS__QUOTED := +OBJS__QUOTED := +C67_DEPS__QUOTED := +K_DEPS__QUOTED := +S55_DEPS__QUOTED := +C62_DEPS__QUOTED := +C_DEPS__QUOTED := +C_UPPER_DEPS__QUOTED := +C43_DEPS__QUOTED := +CPP_DEPS__QUOTED := +BIN_OUTPUTS__QUOTED := +C64_DEPS__QUOTED := +CXX_DEPS__QUOTED := +CLA_DEPS__QUOTED := +S_DEPS__QUOTED := +ASM_DEPS__QUOTED := +S43_DEPS__QUOTED := +EXE_OUTPUTS__QUOTED := +S64_DEPS__QUOTED := +S62_DEPS__QUOTED := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ +device \ + diff --git a/gpio_driverlib_cpu1/CPU1_RAM/subdir_rules.mk b/gpio_driverlib_cpu1/CPU1_RAM/subdir_rules.mk new file mode 100644 index 0000000..e2a189c --- /dev/null +++ b/gpio_driverlib_cpu1/CPU1_RAM/subdir_rules.mk @@ -0,0 +1,12 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Each subdirectory must supply rules for building sources it contributes +%.obj: ../%.c $(GEN_OPTS) | $(GEN_FILES) $(GEN_MISC_FILES) + @echo 'C2000 Compiler - building file: "$<"' + "/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/bin/cl2000" -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -Ooff --include_path="/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1" --include_path="/Users/gmarx/lwc/workshops/f28379d/lab-examples/2-gpios-dual-alternative/gpio_driverlib_cpu1/device" --include_path="/Applications/ti/c2000/C2000Ware_26_00_00_00/driverlib/f2837xd/driverlib/" --include_path="/Applications/ti/ccs2050/ccs/tools/compiler/ti-cgt-c2000_25.11.0.LTS/include" --define=DEBUG --define=CPU1 --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number --abi=eabi --preproc_with_compile --preproc_dependency="$(basename $(>6 ;Set data page for WDCR register + MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD + EDIS ;Disable EALLOW protected register access + LB _c_int00 ;Branch to start of boot._asm in RTS library + + .endif + +;end wd_disable + + .end + +;// +;// End of file. +;// diff --git a/gpio_driverlib_cpu1/device/device.c b/gpio_driverlib_cpu1/device/device.c new file mode 100644 index 0000000..b64b33d --- /dev/null +++ b/gpio_driverlib_cpu1/device/device.c @@ -0,0 +1,706 @@ +//############################################################################# +// +// FILE: device.c +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +// +// Included Files +// +#include "device.h" +#include "driverlib.h" +#include "inc/hw_ipc.h" + +#ifdef CMDTOOL +#include "device_cmd.h" +#endif + +#ifdef __cplusplus +using std::memcpy; +#endif + +#define PASS 0 +#define FAIL 1 + +uint32_t Example_Result = FAIL; +uint32_t Example_PassCount = 0; +uint32_t Example_Fail = 0; + +//***************************************************************************** +// +// Function to initialize the device. Primarily initializes system control to a +// known state by disabling the watchdog, setting up the SYSCLKOUT frequency, +// and enabling the clocks to the peripherals. +// +//***************************************************************************** +void Device_init(void) +{ + // + // Disable the watchdog + // + SysCtl_disableWatchdog(); + +#ifdef CMDTOOL + CMD_init(); +#endif + +#ifdef _FLASH +#ifndef CMDTOOL + // + // Copy time critical code and flash setup code to RAM. This includes the + // following functions: InitFlash(); + // + // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols + // are created by the linker. Refer to the device .cmd file. + // + memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize); +#endif + + // + // Call Flash Initialization to setup flash waitstates. This function must + // reside in RAM. + // + Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES); +#endif +#ifdef CPU1 + + // + // Configure Analog Trim in case of untrimmed or TMX sample + // + if((SysCtl_getDeviceParametric(SYSCTL_DEVICE_QUAL) == 0x0U) && + (HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMA) == 0x0U)) + { + Device_configureTMXAnalogTrim(); + } + + // + // Set up PLL control and clock dividers + // + SysCtl_setClock(DEVICE_SETCLOCK_CFG); + + // + // Make sure the LSPCLK divider is set to the default (divide by 4) + // + SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4); + + // + // These asserts will check that the #defines for the clock rates in + // device.h match the actual rates that have been configured. If they do + // not match, check that the calculations of DEVICE_SYSCLK_FREQ and + // DEVICE_LSPCLK_FREQ are accurate. Some examples will not perform as + // expected if these are not correct. + // + ASSERT(SysCtl_getClock(DEVICE_OSCSRC_FREQ) == DEVICE_SYSCLK_FREQ); + ASSERT(SysCtl_getLowSpeedClock(DEVICE_OSCSRC_FREQ) == DEVICE_LSPCLK_FREQ); + +#ifndef _FLASH + // + // Call Device_cal function when run using debugger + // This function is called as part of the Boot code. The function is called + // in the Device_init function since during debug time resets, the boot code + // will not be executed and the gel script will reinitialize all the + // registers and the calibrated values will be lost. + // Sysctl_deviceCal is a wrapper function for Device_Cal + // + SysCtl_deviceCal(); +#endif + +#endif + // + // Turn on all peripherals + // + Device_enableAllPeripherals(); + + // + // Initialize result parameter as FAIL + // + Example_Result = FAIL; +} + +//***************************************************************************** +// +// Function to turn on all peripherals, enabling reads and writes to the +// peripherals' registers. +// +// Note that to reduce power, unused peripherals should be disabled. +// +//***************************************************************************** +void Device_enableAllPeripherals(void) +{ + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DMA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER2); +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM); +#endif + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); + +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EMIF2); +#endif + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM6); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM7); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM8); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM9); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM10); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM11); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM12); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP6); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EQEP3); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SD2); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCID); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SPIC); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_I2CB); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANB); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_MCBSPB); + +#ifdef CPU1 + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_USBA); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_UPPA); +#endif + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS1); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS2); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS3); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS4); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS5); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS6); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS7); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CMPSS8); + + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_DACC); +} + +//***************************************************************************** +// +// Function to disable pin locks on GPIOs. +// +//***************************************************************************** +void Device_initGPIO(void) +{ + // + // Disable pin locks. + // + GPIO_unlockPortConfig(GPIO_PORT_A, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_B, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_D, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_E, 0xFFFFFFFF); + GPIO_unlockPortConfig(GPIO_PORT_F, 0xFFFFFFFF); + + // + // Enable GPIO Pullups + // + Device_enableUnbondedGPIOPullups(); +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 176PTP package: +// GPIOs Grp Bits +// 95-132 C 31 +// D 31:0 +// E 4:0 +// 134-168 E 31:6 +// F 8:0 +// +//***************************************************************************** + +void Device_enableUnbondedGPIOPullupsFor176Pin(void) +{ + EALLOW; + HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0x80000000U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFDFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU; + EDIS; +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 100PZ package: +// GPIOs Grp Bits +// 0-1 A 1:0 +// 5-9 A 9:5 +// 22-40 A 31:22 +// B 8:0 +// 44-57 B 25:12 +// 67-68 C 4:3 +// 74-77 C 13:10 +// 79-83 C 19:15 +// 93-168 C 31:29 +// D 31:0 +// E 31:0 +// F 8:0 +// +//***************************************************************************** +void Device_enableUnbondedGPIOPullupsFor100Pin(void) +{ + EALLOW; + HWREG(GPIOCTRL_BASE + GPIO_O_GPAPUD) = ~0xFFC003E3U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPBPUD) = ~0x03FFF1FFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPCPUD) = ~0xE10FBC18U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPDPUD) = ~0xFFFFFFF7U; + HWREG(GPIOCTRL_BASE + GPIO_O_GPEPUD) = ~0xFFFFFFFFU; + HWREG(GPIOCTRL_BASE + GPIO_O_GPFPUD) = ~0x000001FFU; + EDIS; +} + +//***************************************************************************** +// +// Function to enable pullups for the unbonded GPIOs on the 100PZ or +// 176PTP package. +// +//***************************************************************************** +void Device_enableUnbondedGPIOPullups(void) +{ + // + // bits 8-10 have pin count + // + uint16_t pinCount = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + (uint32_t)SYSCTL_PARTIDL_PIN_COUNT_M) >> + SYSCTL_PARTIDL_PIN_COUNT_S); + + /* + * 5 = 100 pin + * 6 = 176 pin + * 7 = 337 pin + */ + if(pinCount == 5) + { + Device_enableUnbondedGPIOPullupsFor100Pin(); + } + else if(pinCount == 6) + { + Device_enableUnbondedGPIOPullupsFor176Pin(); + } + else + { + // + // Do nothing - this is 337 pin package + // + } +} + +#ifdef CPU1 +//***************************************************************************** +// +// Function to implement Analog trim of TMX devices +// +//***************************************************************************** +void Device_configureTMXAnalogTrim(void) +{ + // + // Enable ADC clock + // + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCD); + + // + // Configure ADC reference trim for TMX devices + // + EALLOW; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMA) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMB) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMC) = 0x7BDDU; + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFTRIMD) = 0x7BDDU; + + // + // Configure ADC offset trim. The user should generate the trim values + // by following the instructions in the "ADC Zero Offset Calibration" + // section in device TRM. The below lines needs to be uncommented and + // updated with the correct trim values. + // +// HWREGH(ADCA_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCB_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCC_BASE + ADC_O_OFFTRIM) = 0x0U; +// HWREGH(ADCD_BASE + ADC_O_OFFTRIM) = 0x0U; + + // + // Configure internal oscillator trim. If the internal oscillator trim + // contains all zeros, the user can adjust the lowest 10 bits of the + // oscillator trim register between 1 (minimum) and 1023 (maximum) + // while observing the system clock on the XCLOCKOUT pin. The below + // lines needs to be uncommented and updated with the correct trim values. + // +// if(HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC1TRIM) == 0x0U) +// { +// HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC1TRIM) = 0x0U; +// } +// if( HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC2TRIM) = 0x0U) +// { +// HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_INTOSC2TRIM) = 0x0U; +// } + + EDIS; + + // + // Disable ADC clock + // + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCA); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCB); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCC); + SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_ADCD); +} + +//***************************************************************************** +//! Executes a CPU02 control system bootloader. +//! +//! \param bootMode specifies which CPU02 control system boot mode to execute. +//! +//! This function will allow the CPU01 master system to boot the CPU02 control +//! system via the following modes: Boot to RAM, Boot to Flash, Boot via SPI, +//! SCI, I2C, or parallel I/O. This function blocks and waits until the +//! control system boot ROM is configured and ready to receive CPU01 to CPU02 +//! IPC INT0 interrupts. It then blocks and waits until IPC INT0 and +//! IPC FLAG31 are available in the CPU02 boot ROM prior to sending the +//! command to execute the selected bootloader. +//! +//! The \e bootMode parameter accepts one of the following values: +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SCI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SPI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_I2C +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_CAN +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_RAM +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH +//! +//! \return 0 (success) if command is sent, or 1 (failure) if boot mode is +//! invalid and command was not sent. +// +//***************************************************************************** +uint16_t +Device_bootCPU2(uint32_t bootMode) +{ + uint32_t bootStatus; + uint16_t pin; + uint16_t returnStatus = STATUS_PASS; + + // + // If CPU2 has already booted, return a fail to let the application + // know that something is out of the ordinary. + // + bootStatus = HWREG(IPC_BASE + IPC_O_BOOTSTS) & 0x0000000FU; + + if(bootStatus == C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK) + { + // + // Check if MSB is set as well + // + bootStatus = ((uint32_t)(HWREG(IPC_BASE + IPC_O_BOOTSTS) & + 0x80000000U)) >> 31U; + + if(bootStatus != 0) + { + returnStatus = STATUS_FAIL; + + return returnStatus; + } + } + + // + // Wait until CPU02 control system boot ROM is ready to receive + // CPU01 to CPU02 INT1 interrupts. + // + do + { + bootStatus = HWREG(IPC_BASE + IPC_O_BOOTSTS) & + C2_BOOTROM_BOOTSTS_SYSTEM_READY; + } while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY)); + + // + // Loop until CPU02 control system IPC flags 1 and 32 are available + // + while (((HWREG(IPC_BASE + IPC_O_FLG) & IPC_FLG_IPC0) != 0U) || + ((HWREG(IPC_BASE + IPC_O_FLG) & IPC_FLG_IPC31) != 0U)) + { + + } + + if (bootMode >= C1C2_BROM_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE) + { + returnStatus = STATUS_FAIL; + } + else + { + // + // Based on boot mode, enable pull-ups on peripheral pins and + // give GPIO pin control to CPU02 control system. + // + switch (bootMode) + { + case C1C2_BROM_BOOTMODE_BOOT_FROM_SCI: + + // + //SCIA connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL5_SCI, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU02 bootrom to take control of clock + //configuration registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = 0x0002U; + EDIS; + + GPIO_setDirectionMode(29, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(29, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_29_SCITXDA); + GPIO_setMasterCore(29, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(28, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(28, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_28_SCIRXDA); + GPIO_setMasterCore(28, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_SPI: + + // + //SPI-A connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL6_SPI, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU02 bootrom to take control of clock configuration + // registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + EDIS; + + GPIO_setDirectionMode(16, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_16_SPISIMOA); + GPIO_setMasterCore(16, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_17_SPISOMIA); + GPIO_setMasterCore(17, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(18, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_18_SPICLKA); + GPIO_setMasterCore(18, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(19, GPIO_DIR_MODE_OUT); + GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_19_GPIO19); + GPIO_setMasterCore(19, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_I2C: + + // + //I2CA connected to CPU02 + // + SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL7_I2C, 1, + SYSCTL_CPUSEL_CPU2); + + // + //Allows CPU2 bootrom to take control of clock + //configuration registers + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSEM) = 0xA5A50000U; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = 0x0002U; + EDIS; + + GPIO_setDirectionMode(32, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(32, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_32_SDAA); + GPIO_setMasterCore(32, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(33, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(33, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_33_SCLA); + GPIO_setMasterCore(33, GPIO_CORE_CPU2); + + break; + + case C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL: + + for(pin=58;pin<=65;pin++) + { + GPIO_setDirectionMode(pin, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(pin, GPIO_QUAL_ASYNC); + GPIO_setMasterCore(pin, GPIO_CORE_CPU2); + } + + GPIO_setDirectionMode(69, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(69, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_69_GPIO69); + GPIO_setMasterCore(69, GPIO_CORE_CPU2); + + GPIO_setDirectionMode(70, GPIO_DIR_MODE_IN); + GPIO_setQualificationMode(70, GPIO_QUAL_ASYNC); + GPIO_setPinConfig(GPIO_70_GPIO70); + GPIO_setMasterCore(70, GPIO_CORE_CPU2); + + break; + + + case C1C2_BROM_BOOTMODE_BOOT_FROM_CAN: + // + //Set up the GPIO mux to bring out CANATX on GPIO71 + //and CANARX on GPIO70 + // + GPIO_unlockPortConfig(GPIO_PORT_C, 0xFFFFFFFFU); + + GPIO_setMasterCore(71, GPIO_CORE_CPU2); + GPIO_setPinConfig(GPIO_71_CANTXA); + GPIO_setQualificationMode(71, GPIO_QUAL_ASYNC); + + GPIO_setMasterCore(70, GPIO_CORE_CPU2); + GPIO_setPinConfig(GPIO_70_CANRXA); + GPIO_setQualificationMode(70, GPIO_QUAL_ASYNC); + + + GPIO_lockPortConfig(GPIO_PORT_C, 0xFFFFFFFFU); + + // + // Set CANA Bit-Clock Source Select = SYSCLK and enable CAN + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &= + SYSCTL_CLKSRCCTL2_CANABCLKSEL_M; + EDIS; + SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANA); + + break; + + } + + // + //CPU01 to CPU02 IPC Boot Mode Register + // + HWREG(IPC_BASE + IPC_O_BOOTMODE) = bootMode; + + // + // CPU01 To CPU02 IPC Command Register + // + HWREG(IPC_BASE + IPC_O_SENDCOM) = BROM_IPC_EXECUTE_BOOTMODE_CMD; + + // + // CPU01 to CPU02 IPC flag register + // + HWREG(IPC_BASE + IPC_O_SET) = 0x80000001U; + + } + return returnStatus; +} +#endif // #ifdef CPU1 +//***************************************************************************** +// +// Error handling function to be called when an ASSERT is violated +// +//***************************************************************************** +void __error__(const char *filename, uint32_t line) +{ + // + // An ASSERT condition was evaluated as false. You can use the filename and + // line parameters to determine what went wrong. + // + ESTOP0; +} + +void Example_setResultPass(void) +{ + Example_Result = PASS; +} + +void Example_setResultFail(void) +{ + Example_Result = FAIL; +} + +void Example_done(void) +{ + while(1); +} diff --git a/gpio_driverlib_cpu1/device/device.h b/gpio_driverlib_cpu1/device/device.h new file mode 100644 index 0000000..ec143e5 --- /dev/null +++ b/gpio_driverlib_cpu1/device/device.h @@ -0,0 +1,394 @@ +//############################################################################# +// +// FILE: device.h +// +// TITLE: Device setup for examples. +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +// +// Included Files +// +#include "driverlib.h" + +#if (!defined(CPU1) && !defined(CPU2)) +#error "You must define CPU1 or CPU2 in your project properties. Otherwise, \ +the offsets in your header files will be inaccurate." +#endif + +#if (defined(CPU1) && defined(CPU2)) +#error "You have defined both CPU1 and CPU2 in your project properties. Only \ +a single CPU should be defined." +#endif + +//***************************************************************************** +// +// Defines for pin numbers and other GPIO configuration +// +//***************************************************************************** +// +// LEDs +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_PIN_LED1 31U // GPIO number for LD10 +#define DEVICE_GPIO_PIN_LED2 34U // GPIO number for LD9 +#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 // "pinConfig" for LD10 +#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 // "pinConfig" for LD9 +#else +#define DEVICE_GPIO_PIN_LED1 31U // GPIO number for LD2 +#define DEVICE_GPIO_PIN_LED2 34U // GPIO number for LD3 +#define DEVICE_GPIO_CFG_LED1 GPIO_31_GPIO31 // "pinConfig" for LD2 +#define DEVICE_GPIO_CFG_LED2 GPIO_34_GPIO34 // "pinConfig" for LD3 +#endif + + +// +// SCI for USB-to-UART adapter on FTDI chip +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_PIN_SCIRXDA 43U // GPIO number for SCI RX +#define DEVICE_GPIO_PIN_SCITXDA 42U // GPIO number for SCI TX +#define DEVICE_GPIO_CFG_SCIRXDA GPIO_43_SCIRXDA // "pinConfig" for SCI RX +#define DEVICE_GPIO_CFG_SCITXDA GPIO_42_SCITXDA // "pinConfig" for SCI TX +#else +#define DEVICE_GPIO_PIN_SCIRXDA 28U // GPIO number for SCI RX +#define DEVICE_GPIO_PIN_SCITXDA 29U // GPIO number for SCI TX +#define DEVICE_GPIO_CFG_SCIRXDA GPIO_28_SCIRXDA // "pinConfig" for SCI RX +#define DEVICE_GPIO_CFG_SCITXDA GPIO_29_SCITXDA // "pinConfig" for SCI TX +#endif + +// +// GPIO assignment for CAN-A and CAN-B +// +#ifdef _LAUNCHXL_F28379D +#define DEVICE_GPIO_CFG_CANRXA GPIO_36_CANRXA // "pinConfig" for CANA RX +#define DEVICE_GPIO_CFG_CANTXA GPIO_37_CANTXA // "pinConfig" for CANA TX +#define DEVICE_GPIO_CFG_CANRXB GPIO_17_CANRXB // "pinConfig" for CANB RX +#define DEVICE_GPIO_CFG_CANTXB GPIO_12_CANTXB // "pinConfig" for CANB TX +#else +#define DEVICE_GPIO_CFG_CANRXA GPIO_30_CANRXA // "pinConfig" for CANA RX +#define DEVICE_GPIO_CFG_CANTXA GPIO_31_CANTXA // "pinConfig" for CANA TX +#define DEVICE_GPIO_CFG_CANRXB GPIO_10_CANRXB // "pinConfig" for CANB RX +#define DEVICE_GPIO_CFG_CANTXB GPIO_8_CANTXB // "pinConfig" for CANB TX + +//I2CA GPIO pins +#define DEVICE_GPIO_PIN_SDAA 104 +#define DEVICE_GPIO_PIN_SCLA 105 + +#define DEVICE_GPIO_CFG_SDAA GPIO_104_SDAA +#define DEVICE_GPIO_CFG_SCLA GPIO_105_SCLA + + +//I2CB GPIO pins +#define DEVICE_GPIO_PIN_SDAB 40 +#define DEVICE_GPIO_PIN_SCLB 41 + +#define DEVICE_GPIO_CFG_SDAB GPIO_40_SDAB +#define DEVICE_GPIO_CFG_SCLB GPIO_41_SCLB + +#endif + +//***************************************************************************** +// +// Defines related to clock configuration +// +//***************************************************************************** +// +// Launchpad Configuration +// +#ifdef _LAUNCHXL_F28379D + +// +// 10MHz XTAL on LaunchPad. For use with SysCtl_getClock(). +// +#define DEVICE_OSCSRC_FREQ 10000000U + +// +// Define to pass to SysCtl_setClock(). Will configure the clock as follows: +// PLLSYSCLK = 10MHz (XTAL_OSC) * 40 (IMULT) * 1 (FMULT) / 2 (PLLCLK_BY_2) +// +#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(40) | \ + SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) | \ + SYSCTL_PLL_ENABLE) + +// +// 200MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the +// code below if a different clock configuration is used! +// +#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40 * 1) / 2) + +// +// ControlCARD Configuration +// +#else + +// +// 20MHz XTAL on controlCARD. For use with SysCtl_getClock(). +// +#define DEVICE_OSCSRC_FREQ 20000000U + +// +// Define to pass to SysCtl_setClock(). Will configure the clock as follows: +// PLLSYSCLK = 20MHz (XTAL_OSC) * 20 (IMULT) * 1 (FMULT) / 2 (PLLCLK_BY_2) +// +#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(20) | \ + SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) | \ + SYSCTL_PLL_ENABLE) + +// +// 200MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the +// code below if a different clock configuration is used! +// +#define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 20 * 1) / 2) + +#endif + +// +// 50MHz LSPCLK frequency based on the above DEVICE_SYSCLK_FREQ and a default +// low speed peripheral clock divider of 4. Update the code below if a +// different LSPCLK divider is used! +// +#define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ / 4) + +//***************************************************************************** +// +// Macro to call SysCtl_delay() to achieve a delay in microseconds. The macro +// will convert the desired delay in microseconds to the count value expected +// by the function. \b x is the number of microseconds to delay. +// +//***************************************************************************** +#define DEVICE_DELAY_US(x) SysCtl_delay(((((long double)(x)) / (1000000.0L / \ + (long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L) + +// +// The macros that can be used as parameter to the function Device_bootCPU2 +// +#define C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL 0x00000000U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_SCI 0x00000001U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_SPI 0x00000004U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_I2C 0x00000005U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_CAN 0x00000007U +#define C1C2_BROM_BOOTMODE_BOOT_FROM_RAM 0x0000000AU +#define C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH 0x0000000BU + +// +// Other macros that are needed for the Device_bootCPU2 function +// +#define BROM_IPC_EXECUTE_BOOTMODE_CMD 0x00000013U +#define C1C2_BROM_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE 0x0000000CU +#define C2_BOOTROM_BOOTSTS_C2TOC1_IGNORE 0x00000000U +#define C2_BOOTROM_BOOTSTS_SYSTEM_START_BOOT 0x00000001U +#define C2_BOOTROM_BOOTSTS_SYSTEM_READY 0x00000002U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK 0x00000003U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_NAK_STATUS_NOT_SUPPORTED 0x00000004U +#define C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_NAK_STATUS_BUSY_WITH_BOOT 0x00000005U + +// +// Macros used as return value by the Device_bootCPU2 function +// +#define STATUS_FAIL 0x0001 +#define STATUS_PASS 0x0000 + +//***************************************************************************** +// +// Defines, Globals, and Header Includes related to Flash Support +// +//***************************************************************************** +#ifdef _FLASH +#include + +extern uint16_t RamfuncsLoadStart; +extern uint16_t RamfuncsLoadEnd; +extern uint16_t RamfuncsLoadSize; +extern uint16_t RamfuncsRunStart; +extern uint16_t RamfuncsRunEnd; +extern uint16_t RamfuncsRunSize; + +#define DEVICE_FLASH_WAITSTATES 3 + +#endif + +extern uint32_t Example_PassCount; +extern uint32_t Example_Fail; + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +//***************************************************************************** +// +//! \addtogroup device_api +//! @{ +// +//***************************************************************************** +//***************************************************************************** +// +//! @brief Function to initialize the device. Primarily initializes system control to a +//! known state by disabling the watchdog, setting up the SYSCLKOUT frequency, +//! and enabling the clocks to the peripherals. +//! +//! \param None. +//! \return None. +// +//***************************************************************************** +extern void Device_init(void); +//***************************************************************************** +//! +//! +//! @brief Function to turn on all peripherals, enabling reads and writes to the +//! peripherals' registers. +//! +//! Note that to reduce power, unused peripherals should be disabled. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableAllPeripherals(void); +//***************************************************************************** +//! +//! +//! @brief Function to disable pin locks on GPIOs. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_initGPIO(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the 176PTP package: +//! GPIOs Grp Bits +//! 95-132 C 31 +//! D 31:0 +//! E 4:0 +//! 134-168 E 31:6 +//! F 8:0 +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullupsFor176Pin(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the 100PZ package: +//! GPIOs Grp Bits +//! 0-1 A 1:0 +//! 5-9 A 9:5 +//! 22-40 A 31:22 +//! B 8:0 +//! 44-57 B 25:12 +//! 67-68 C 4:3 +//! 74-77 C 13:10 +//! 79-83 C 19:15 +//! 93-168 C 31:29 +//! D 31:0 +//! E 31:0 +//! F 8:0 +//! @param None +//! @return None +// +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullupsFor100Pin(void); +//***************************************************************************** +//! +//! @brief Function to enable pullups for the unbonded GPIOs on the +//! 176PTP package. +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_enableUnbondedGPIOPullups(void); +#ifdef CPU1 +//***************************************************************************** +//! +//! @brief Function to implement Analog trim of TMX devices +//! +//! @param None +//! @return None +// +//***************************************************************************** +extern void Device_configureTMXAnalogTrim(void); +//***************************************************************************** +//! @brief Executes a CPU02 control system bootloader. +//! +//! \param bootMode specifies which CPU02 control system boot mode to execute. +//! +//! This function will allow the CPU01 master system to boot the CPU02 control +//! system via the following modes: Boot to RAM, Boot to Flash, Boot via SPI, +//! SCI, I2C, or parallel I/O. This function blocks and waits until the +//! control system boot ROM is configured and ready to receive CPU01 to CPU02 +//! IPC INT0 interrupts. It then blocks and waits until IPC INT0 and +//! IPC FLAG31 are available in the CPU02 boot ROM prior to sending the +//! command to execute the selected bootloader. +//! +//! The \e bootMode parameter accepts one of the following values: +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SCI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_SPI +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_I2C +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_CAN +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_RAM +//! - \b C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH +//! +//! \return 0 (success) if command is sent, or 1 (failure) if boot mode is +//! invalid and command was not sent. +// +//***************************************************************************** +extern uint16_t Device_bootCPU2(uint32_t ulBootMode); +#endif +//***************************************************************************** +//! +//! @brief Error handling function to be called when an ASSERT is violated +//! +//! @param *filename File name in which the error has occurred +//! @param line Line number within the file +//! @return None +// +//***************************************************************************** +extern void __error__(const char *filename, uint32_t line); +extern void Example_setResultPass(void); +extern void Example_setResultFail(void); +extern void Example_done(void); + +// +// End of file +// diff --git a/gpio_driverlib_cpu1/device/driverlib.h b/gpio_driverlib_cpu1/device/driverlib.h new file mode 100644 index 0000000..932ace6 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib.h @@ -0,0 +1,87 @@ +//############################################################################# +// +// FILE: driverlib.h +// +// TITLE: C28x Driverlib Header File +// +//############################################################################# +// +// $Release Date: $ +// $Copyright: +// Copyright (C) 2013-2026 Texas Instruments Incorporated - http://www.ti.com/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# +#ifndef DRIVERLIB_H +#define DRIVERLIB_H + +#include "inc/hw_memmap.h" + +#include "adc.h" +#include "asysctl.h" +#include "can.h" +#include "cla.h" +#include "clb.h" +#include "cmpss.h" +#include "cpu.h" +#include "cputimer.h" +#include "dac.h" +#include "dcsm.h" +#include "debug.h" +#include "dma.h" +#include "ecap.h" +#include "emif.h" +#include "epwm.h" +#include "eqep.h" +#include "flash.h" +#include "gpio.h" +#include "hrpwm.h" +#include "i2c.h" +#include "interrupt.h" +#include "ipc.h" +#include "mcbsp.h" +#include "memcfg.h" +#include "pin_map.h" +#include "pin_map_legacy.h" +#include "sci.h" +#include "sdfm.h" +#include "spi.h" +#include "sysctl.h" +#include "upp.h" +#include "version.h" +#include "xbar.h" + +#include "driver_inclusive_terminology_mapping.h" + +#endif // end of DRIVERLIB_H definition + +// +// End of file +// diff --git a/gpio_driverlib_cpu1/device/driverlib/adc.c b/gpio_driverlib_cpu1/device/driverlib/adc.c new file mode 100644 index 0000000..9e74809 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/adc.c @@ -0,0 +1,342 @@ +//########################################################################### +// +// FILE: adc.c +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "adc.h" + +//***************************************************************************** +// +// Defines for locations of ADC calibration functions in OTP for use in +// ADC_setMode() ONLY. Not intended for use by application code. +// +//***************************************************************************** +// +// The following functions calibrate the ADC linearity. Use them in the +// ADC_setMode() function only. +// +#define ADC_calADCAINL 0x0703B4U +#define ADC_calADCBINL 0x0703B2U +#define ADC_calADCCINL 0x0703B0U +#define ADC_calADCDINL 0x0703AEU + +// +// This function looks up the ADC offset trim for a given condition. Use this +// in the ADC_setMode() function only. +// +#define ADC_getOffsetTrim 0x0703ACU + +//***************************************************************************** +// +// ADC_setMode +// +//***************************************************************************** +void +ADC_setMode(uint32_t base, ADC_Resolution resolution, + ADC_SignalMode signalMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Check for correct signal mode & resolution. In this device: + // Single ended signal conversions are supported in 12-bit mode only + // Differential signal conversions are supported in 16-bit mode only + // + if(signalMode == ADC_MODE_SINGLE_ENDED) + { + ASSERT(resolution == ADC_RESOLUTION_12BIT); + } + else + { + ASSERT(resolution == ADC_RESOLUTION_16BIT); + } + + + // + // Apply the resolution and signalMode to the specified ADC. + // + EALLOW; + HWREGH(base + ADC_O_CTL2) = (HWREGH(base + ADC_O_CTL2) & + ~(ADC_CTL2_RESOLUTION | ADC_CTL2_SIGNALMODE)) | + ((uint16_t)resolution | (uint16_t)signalMode); + EDIS; + + // + // Apply INL and offset trims + // + ADC_setINLTrim(base); + ADC_setOffsetTrim(base); +} + +//***************************************************************************** +// +// ADC_setINLTrim +// +//***************************************************************************** +void +ADC_setINLTrim(uint32_t base) +{ + ADC_Resolution resolution; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + resolution = (ADC_Resolution) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_RESOLUTION); + + EALLOW; + switch(base) + { + case ADCA_BASE: + if(HWREGH(ADC_calADCAINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCAINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCB_BASE: + if(HWREGH(ADC_calADCBINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCBINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCC_BASE: + if(HWREGH(ADC_calADCCINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCCINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + case ADCD_BASE: + if(HWREGH(ADC_calADCDINL) != 0xFFFFU) + { + // + // Trim function is programmed into OTP, so call it + // + (*((void (*)(void))ADC_calADCDINL))(); + } + else + { + // + // Do nothing, no INL trim function populated + // + } + break; + default: + // + // Invalid base address! Do nothing! + // + break; + } + + // + // Apply linearity trim workaround for 12-bit resolution + // + if(resolution == ADC_RESOLUTION_12BIT) + { + // + // 12-bit linearity trim workaround + // + HWREG(base + ADC_O_INLTRIM1) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM2) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM4) &= 0xFFFF0000U; + HWREG(base + ADC_O_INLTRIM5) &= 0xFFFF0000U; + } + EDIS; +} + +//***************************************************************************** +// +// ADC_setOffsetTrim +// +//***************************************************************************** +void +ADC_setOffsetTrim(uint32_t base) +{ + uint16_t offsetIndex = 0U; + uint16_t offsetTrim = 0U; + ADC_Resolution resolution; + ADC_SignalMode signalMode; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + resolution = (ADC_Resolution) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_RESOLUTION); + signalMode = (ADC_SignalMode) + (HWREGH(base + ADC_O_CTL2) & ADC_CTL2_SIGNALMODE); + + switch(base) + { + case ADCA_BASE: + offsetIndex = (uint16_t)(0U * 4U); + break; + case ADCB_BASE: + offsetIndex = (uint16_t)(1U * 4U); + break; + case ADCC_BASE: + offsetIndex = (uint16_t)(2U * 4U); + break; + case ADCD_BASE: + offsetIndex = (uint16_t)(3U * 4U); + break; + default: + // + // Invalid base address! + // + offsetIndex = 0U; + break; + } + + // + // Offset trim function is programmed into OTP, so call it + // + if(HWREGH(ADC_getOffsetTrim) != 0xFFFFU) + { + // + // Calculate the index into OTP table of offset trims and call + // function to return the correct offset trim + // + offsetIndex += ((signalMode == ADC_MODE_DIFFERENTIAL) ? 1U : 0U) + + (2U * ((resolution == ADC_RESOLUTION_16BIT) ? 1U : 0U)); + + offsetTrim = + (*((uint16_t (*)(uint16_t index))ADC_getOffsetTrim))(offsetIndex); + } + else + { + // + // Offset trim function is not populated, so set offset trim to 0 + // + offsetTrim = 0U; + } + + // + // Apply the offset trim. Offset Trim is not updated here in case of TMX or + // untrimmed devices. The default trims for TMX devices should be handled in + // Device_init(). Refer to Device_init() and Device_configureTMXAnalogTrim() + // APIs for more details. + // + if(offsetTrim > 0x0U) + { + EALLOW; + HWREGH(base + ADC_O_OFFTRIM) = offsetTrim; + EDIS; + } +} + + +//***************************************************************************** +// +// ADC_setPPBTripLimits +// +//***************************************************************************** +void +ADC_setPPBTripLimits(uint32_t base, ADC_PPBNumber ppbNumber, + int32_t tripHiLimit, int32_t tripLoLimit) +{ + uint32_t ppbHiOffset; + uint32_t ppbLoOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((tripHiLimit <= 65535) && (tripHiLimit >= -65536)); + ASSERT((tripLoLimit <= 65535) && (tripLoLimit >= -65536)); + + // + // Get the offset to the appropriate trip limit registers. + // + ppbHiOffset = (ADC_PPBxTRIPHI_STEP * (uint32_t)ppbNumber) + + ADC_O_PPB1TRIPHI; + ppbLoOffset = (ADC_PPBxTRIPLO_STEP * (uint32_t)ppbNumber) + + ADC_O_PPB1TRIPLO; + + EALLOW; + + // + // Set the trip high limit. + // + HWREG(base + ppbHiOffset) = + (HWREG(base + ppbHiOffset) & ~ADC_PPBTRIP_MASK) | + ((uint32_t)tripHiLimit & ADC_PPBTRIP_MASK); + + // + // Set the trip low limit. + // + HWREG(base + ppbLoOffset) = + (HWREG(base + ppbLoOffset) & ~ADC_PPBTRIP_MASK) | + ((uint32_t)tripLoLimit & ADC_PPBTRIP_MASK); + + EDIS; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/adc.h b/gpio_driverlib_cpu1/device/driverlib/adc.h new file mode 100644 index 0000000..136638d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/adc.h @@ -0,0 +1,2098 @@ +//########################################################################### +// +// FILE: adc.h +// +// TITLE: C28x ADC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef ADC_H +#define ADC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup adc_api ADC +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_adc.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define ADC_NUM_INTERRUPTS 4U + +#define ADC_SOCxCTL_OFFSET_BASE ADC_O_SOC0CTL +#define ADC_RESULTx_OFFSET_BASE ADC_O_RESULT0 +#define ADC_INTSELxNy_OFFSET_BASE ADC_O_INTSEL1N2 +#define ADC_PPBxRESULT_OFFSET_BASE ADC_O_PPB1RESULT + + +#define ADC_PPBxCONFIG_STEP (ADC_O_PPB2CONFIG - ADC_O_PPB1CONFIG) +#define ADC_PPBxTRIPHI_STEP (ADC_O_PPB2TRIPHI - ADC_O_PPB1TRIPHI) +#define ADC_PPBxTRIPLO_STEP (ADC_O_PPB2TRIPLO - ADC_O_PPB1TRIPLO) +#define ADC_PPBxOFFCAL_STEP (ADC_O_PPB2OFFCAL - ADC_O_PPB1OFFCAL) +#define ADC_PPBxOFFREF_STEP (ADC_O_PPB2OFFREF - ADC_O_PPB1OFFREF) +#define ADC_PPBxSTAMP_STEP (ADC_O_PPB2STAMP - ADC_O_PPB1STAMP) + +#define ADC_PPBTRIP_MASK ((uint32_t)ADC_PPB1TRIPHI_LIMITHI_M |\ + (uint32_t)ADC_PPB1TRIPHI_HSIGN) +// +// Slope of the temperature sensor based in degrees C in fixed point Q15 format +// +#define ADC_getTempSlope() (*(int16_t (*)(void))0x7036E)() + +// +// Offset of the temp sensor output at 0 degrees C +// +#define ADC_getTempOffset() (*(int16_t (*)(void))0x70372)() + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to ADC_enablePPBEvent(), ADC_disablePPBEvent(), +// ADC_enablePPBEventInterrupt(), ADC_disablePPBEventInterrupt(), and +// ADC_clearPPBEventStatus() as the intFlags and evtFlags parameters. They also +// make up the enumerated bit field returned by ADC_getPPBEventStatus(). +// +//***************************************************************************** +#define ADC_EVT_TRIPHI 0x0001U //!< Trip High Event +#define ADC_EVT_TRIPLO 0x0002U //!< Trip Low Event +#define ADC_EVT_ZERO 0x0004U //!< Zero Crossing Event +#endif + +//***************************************************************************** +// +// Values that can be passed to ADC_forceMultipleSOC() as socMask parameter. +// These values can be OR'd together to trigger multiple SOCs at a time. +// +//***************************************************************************** +#define ADC_FORCE_SOC0 0x0001U //!< SW trigger ADC SOC 0 +#define ADC_FORCE_SOC1 0x0002U //!< SW trigger ADC SOC 1 +#define ADC_FORCE_SOC2 0x0004U //!< SW trigger ADC SOC 2 +#define ADC_FORCE_SOC3 0x0008U //!< SW trigger ADC SOC 3 +#define ADC_FORCE_SOC4 0x0010U //!< SW trigger ADC SOC 4 +#define ADC_FORCE_SOC5 0x0020U //!< SW trigger ADC SOC 5 +#define ADC_FORCE_SOC6 0x0040U //!< SW trigger ADC SOC 6 +#define ADC_FORCE_SOC7 0x0080U //!< SW trigger ADC SOC 7 +#define ADC_FORCE_SOC8 0x0100U //!< SW trigger ADC SOC 8 +#define ADC_FORCE_SOC9 0x0200U //!< SW trigger ADC SOC 9 +#define ADC_FORCE_SOC10 0x0400U //!< SW trigger ADC SOC 10 +#define ADC_FORCE_SOC11 0x0800U //!< SW trigger ADC SOC 11 +#define ADC_FORCE_SOC12 0x1000U //!< SW trigger ADC SOC 12 +#define ADC_FORCE_SOC13 0x2000U //!< SW trigger ADC SOC 13 +#define ADC_FORCE_SOC14 0x4000U //!< SW trigger ADC SOC 14 +#define ADC_FORCE_SOC15 0x8000U //!< SW trigger ADC SOC 15 + + + +//***************************************************************************** +// +//! Values that can be passed to ADC_setPrescaler() as the \e clkPrescale +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_CLK_DIV_1_0 = 0U, //!< ADCCLK = (input clock) / 1.0 + ADC_CLK_DIV_2_0 = 2U, //!< ADCCLK = (input clock) / 2.0 + ADC_CLK_DIV_2_5 = 3U, //!< ADCCLK = (input clock) / 2.5 + ADC_CLK_DIV_3_0 = 4U, //!< ADCCLK = (input clock) / 3.0 + ADC_CLK_DIV_3_5 = 5U, //!< ADCCLK = (input clock) / 3.5 + ADC_CLK_DIV_4_0 = 6U, //!< ADCCLK = (input clock) / 4.0 + ADC_CLK_DIV_4_5 = 7U, //!< ADCCLK = (input clock) / 4.5 + ADC_CLK_DIV_5_0 = 8U, //!< ADCCLK = (input clock) / 5.0 + ADC_CLK_DIV_5_5 = 9U, //!< ADCCLK = (input clock) / 5.5 + ADC_CLK_DIV_6_0 = 10U, //!< ADCCLK = (input clock) / 6.0 + ADC_CLK_DIV_6_5 = 11U, //!< ADCCLK = (input clock) / 6.5 + ADC_CLK_DIV_7_0 = 12U, //!< ADCCLK = (input clock) / 7.0 + ADC_CLK_DIV_7_5 = 13U, //!< ADCCLK = (input clock) / 7.5 + ADC_CLK_DIV_8_0 = 14U, //!< ADCCLK = (input clock) / 8.0 + ADC_CLK_DIV_8_5 = 15U //!< ADCCLK = (input clock) / 8.5 +} ADC_ClkPrescale; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setMode() as the \e resolution +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_RESOLUTION_12BIT = 0x00U, //!< 12-bit conversion resolution + ADC_RESOLUTION_16BIT = 0x40U //!< 16-bit conversion resolution +} ADC_Resolution; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setMode() as the \e signalMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_MODE_SINGLE_ENDED = 0x00U, //!< Sample on single pin with VREFLO + ADC_MODE_DIFFERENTIAL = 0x80U //!< Sample on pair of pins +} ADC_SignalMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setupSOC() as the \e trigger +//! parameter to specify the event that will trigger a conversion to start. +//! It is also used with ADC_setBurstModeConfig() and +//! ADC_triggerRepeaterSelect(). +// +//***************************************************************************** +typedef enum +{ + ADC_TRIGGER_SW_ONLY = 0U, //!< Software only + ADC_TRIGGER_CPU1_TINT0 = 1U, //!< CPU1 Timer 0, TINT0 + ADC_TRIGGER_CPU1_TINT1 = 2U, //!< CPU1 Timer 1, TINT1 + ADC_TRIGGER_CPU1_TINT2 = 3U, //!< CPU1 Timer 2, TINT2 + ADC_TRIGGER_GPIO = 4U, //!< GPIO, ADCEXTSOC + ADC_TRIGGER_EPWM1_SOCA = 5U, //!< ePWM1, ADCSOCA + ADC_TRIGGER_EPWM1_SOCB = 6U, //!< ePWM1, ADCSOCB + ADC_TRIGGER_EPWM2_SOCA = 7U, //!< ePWM2, ADCSOCA + ADC_TRIGGER_EPWM2_SOCB = 8U, //!< ePWM2, ADCSOCB + ADC_TRIGGER_EPWM3_SOCA = 9U, //!< ePWM3, ADCSOCA + ADC_TRIGGER_EPWM3_SOCB = 10U, //!< ePWM3, ADCSOCB + ADC_TRIGGER_EPWM4_SOCA = 11U, //!< ePWM4, ADCSOCA + ADC_TRIGGER_EPWM4_SOCB = 12U, //!< ePWM4, ADCSOCB + ADC_TRIGGER_EPWM5_SOCA = 13U, //!< ePWM5, ADCSOCA + ADC_TRIGGER_EPWM5_SOCB = 14U, //!< ePWM5, ADCSOCB + ADC_TRIGGER_EPWM6_SOCA = 15U, //!< ePWM6, ADCSOCA + ADC_TRIGGER_EPWM6_SOCB = 16U, //!< ePWM6, ADCSOCB + ADC_TRIGGER_EPWM7_SOCA = 17U, //!< ePWM7, ADCSOCA + ADC_TRIGGER_EPWM7_SOCB = 18U, //!< ePWM7, ADCSOCB + ADC_TRIGGER_EPWM8_SOCA = 19U, //!< ePWM8, ADCSOCA + ADC_TRIGGER_EPWM8_SOCB = 20U, //!< ePWM8, ADCSOCB + ADC_TRIGGER_EPWM9_SOCA = 21U, //!< ePWM9, ADCSOCA + ADC_TRIGGER_EPWM9_SOCB = 22U, //!< ePWM9, ADCSOCB + ADC_TRIGGER_EPWM10_SOCA = 23U, //!< ePWM10, ADCSOCA + ADC_TRIGGER_EPWM10_SOCB = 24U, //!< ePWM10, ADCSOCB + ADC_TRIGGER_EPWM11_SOCA = 25U, //!< ePWM11, ADCSOCA + ADC_TRIGGER_EPWM11_SOCB = 26U, //!< ePWM11, ADCSOCB + ADC_TRIGGER_EPWM12_SOCA = 27U, //!< ePWM12, ADCSOCA + ADC_TRIGGER_EPWM12_SOCB = 28U, //!< ePWM12, ADCSOCB + ADC_TRIGGER_CPU2_TINT0 = 29U, //!< CPU2 Timer 0, TINT0 + ADC_TRIGGER_CPU2_TINT1 = 30U, //!< CPU2 Timer 1, TINT1 + ADC_TRIGGER_CPU2_TINT2 = 31U //!< CPU2 Timer 2, TINT2 +} ADC_Trigger; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setupSOC() as the \e channel +//! parameter. This is the input pin on which the signal to be converted is +//! located. +// +//***************************************************************************** +typedef enum +{ + ADC_CH_ADCIN0 = 0U, //!< single-ended, ADCIN0 + ADC_CH_ADCIN1 = 1U, //!< single-ended, ADCIN1 + ADC_CH_ADCIN2 = 2U, //!< single-ended, ADCIN2 + ADC_CH_ADCIN3 = 3U, //!< single-ended, ADCIN3 + ADC_CH_ADCIN4 = 4U, //!< single-ended, ADCIN4 + ADC_CH_ADCIN5 = 5U, //!< single-ended, ADCIN5 + ADC_CH_ADCIN6 = 6U, //!< single-ended, ADCIN6 + ADC_CH_ADCIN7 = 7U, //!< single-ended, ADCIN7 + ADC_CH_ADCIN8 = 8U, //!< single-ended, ADCIN8 + ADC_CH_ADCIN9 = 9U, //!< single-ended, ADCIN9 + ADC_CH_ADCIN10 = 10U, //!< single-ended, ADCIN10 + ADC_CH_ADCIN11 = 11U, //!< single-ended, ADCIN11 + ADC_CH_ADCIN12 = 12U, //!< single-ended, ADCIN12 + ADC_CH_ADCIN13 = 13U, //!< single-ended, ADCIN13 + ADC_CH_ADCIN14 = 14U, //!< single-ended, ADCIN14 + ADC_CH_ADCIN15 = 15U, //!< single-ended, ADCIN15 + ADC_CH_ADCIN0_ADCIN1 = 0U, //!< differential, ADCIN0 and ADCIN1 + ADC_CH_ADCIN2_ADCIN3 = 2U, //!< differential, ADCIN2 and ADCIN3 + ADC_CH_ADCIN4_ADCIN5 = 4U, //!< differential, ADCIN4 and ADCIN5 + ADC_CH_ADCIN6_ADCIN7 = 6U, //!< differential, ADCIN6 and ADCIN7 + ADC_CH_ADCIN8_ADCIN9 = 8U, //!< differential, ADCIN8 and ADCIN9 + ADC_CH_ADCIN10_ADCIN11 = 10U, //!< differential, ADCIN10 and ADCIN11 + ADC_CH_ADCIN12_ADCIN13 = 12U, //!< differential, ADCIN12 and ADCIN13 + ADC_CH_ADCIN14_ADCIN15 = 14U //!< differential, ADCIN14 and ADCIN15 +} ADC_Channel; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setInterruptPulseMode() as the +//! \e pulseMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Occurs at the end of the acquisition window + ADC_PULSE_END_OF_ACQ_WIN = 0x00U, + //! Occurs at the end of the conversion + ADC_PULSE_END_OF_CONV = 0x04U +} ADC_PulseMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_enableInterrupt(), ADC_disableInterrupt(), +//! and ADC_getInterruptStatus() as the \e adcIntNum parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_INT_NUMBER1 = 0U, //!< ADCINT1 Interrupt + ADC_INT_NUMBER2 = 1U, //!< ADCINT2 Interrupt + ADC_INT_NUMBER3 = 2U, //!< ADCINT3 Interrupt + ADC_INT_NUMBER4 = 3U //!< ADCINT4 Interrupt +} ADC_IntNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e ppbNumber parameter for several +//! functions. +// +//***************************************************************************** +typedef enum +{ + ADC_PPB_NUMBER1 = 0U, //!< Post-processing block 1 + ADC_PPB_NUMBER2 = 1U, //!< Post-processing block 2 + ADC_PPB_NUMBER3 = 2U, //!< Post-processing block 3 + ADC_PPB_NUMBER4 = 3U //!< Post-processing block 4 +} ADC_PPBNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e socNumber parameter for several +//! functions. This value identifies the start-of-conversion (SOC) that a +//! function is configuring or accessing. Note that in some cases (for example, +//! ADC_setInterruptSource()) \e socNumber is used to refer to the +//! corresponding end-of-conversion (EOC). +// +//***************************************************************************** +typedef enum +{ + ADC_SOC_NUMBER0 = 0U, //!< SOC/EOC number 0 + ADC_SOC_NUMBER1 = 1U, //!< SOC/EOC number 1 + ADC_SOC_NUMBER2 = 2U, //!< SOC/EOC number 2 + ADC_SOC_NUMBER3 = 3U, //!< SOC/EOC number 3 + ADC_SOC_NUMBER4 = 4U, //!< SOC/EOC number 4 + ADC_SOC_NUMBER5 = 5U, //!< SOC/EOC number 5 + ADC_SOC_NUMBER6 = 6U, //!< SOC/EOC number 6 + ADC_SOC_NUMBER7 = 7U, //!< SOC/EOC number 7 + ADC_SOC_NUMBER8 = 8U, //!< SOC/EOC number 8 + ADC_SOC_NUMBER9 = 9U, //!< SOC/EOC number 9 + ADC_SOC_NUMBER10 = 10U, //!< SOC/EOC number 10 + ADC_SOC_NUMBER11 = 11U, //!< SOC/EOC number 11 + ADC_SOC_NUMBER12 = 12U, //!< SOC/EOC number 12 + ADC_SOC_NUMBER13 = 13U, //!< SOC/EOC number 13 + ADC_SOC_NUMBER14 = 14U, //!< SOC/EOC number 14 + ADC_SOC_NUMBER15 = 15U //!< SOC/EOC number 15 +} ADC_SOCNumber; + +//***************************************************************************** +// +//! Values that can be passed in as the \e trigger parameter for the +//! ADC_setInterruptSOCTrigger() function. +// +//***************************************************************************** +typedef enum +{ + ADC_INT_SOC_TRIGGER_NONE = 0U, //!< No ADCINT will trigger the SOC + ADC_INT_SOC_TRIGGER_ADCINT1 = 1U, //!< ADCINT1 will trigger the SOC + ADC_INT_SOC_TRIGGER_ADCINT2 = 2U //!< ADCINT2 will trigger the SOC +} ADC_IntSOCTrigger; + +//***************************************************************************** +// +//! Values that can be passed to ADC_setSOCPriority() as the \e priMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_PRI_ALL_ROUND_ROBIN = 0U, //!< Round robin mode is used for all + ADC_PRI_SOC0_HIPRI = 1U, //!< SOC 0 hi pri, others in round robin + ADC_PRI_THRU_SOC1_HIPRI = 2U, //!< SOC 0-1 hi pri, others in round robin + ADC_PRI_THRU_SOC2_HIPRI = 3U, //!< SOC 0-2 hi pri, others in round robin + ADC_PRI_THRU_SOC3_HIPRI = 4U, //!< SOC 0-3 hi pri, others in round robin + ADC_PRI_THRU_SOC4_HIPRI = 5U, //!< SOC 0-4 hi pri, others in round robin + ADC_PRI_THRU_SOC5_HIPRI = 6U, //!< SOC 0-5 hi pri, others in round robin + ADC_PRI_THRU_SOC6_HIPRI = 7U, //!< SOC 0-6 hi pri, others in round robin + ADC_PRI_THRU_SOC7_HIPRI = 8U, //!< SOC 0-7 hi pri, others in round robin + ADC_PRI_THRU_SOC8_HIPRI = 9U, //!< SOC 0-8 hi pri, others in round robin + ADC_PRI_THRU_SOC9_HIPRI = 10U, //!< SOC 0-9 hi pri, others in round robin + ADC_PRI_THRU_SOC10_HIPRI = 11U, //!< SOC 0-10 hi pri, others in round robin + ADC_PRI_THRU_SOC11_HIPRI = 12U, //!< SOC 0-11 hi pri, others in round robin + ADC_PRI_THRU_SOC12_HIPRI = 13U, //!< SOC 0-12 hi pri, others in round robin + ADC_PRI_THRU_SOC13_HIPRI = 14U, //!< SOC 0-13 hi pri, others in round robin + ADC_PRI_THRU_SOC14_HIPRI = 15U, //!< SOC 0-14 hi pri, SOC15 in round robin + ADC_PRI_ALL_HIPRI = 16U //!< All priorities based on SOC number +} ADC_PriorityMode; + +//***************************************************************************** +// +//! Values that can be passed to ADC_configOSDetectMode() as the \e modeVal +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ADC_OSDETECT_MODE_DISABLED = 0x0U,//!< Open/Shorts detection cir- + //!< cuit(O/S DC) is disabled + ADC_OSDETECT_MODE_VSSA = 0x1U,//!< O/S DC is enabled at zero + //!< scale + ADC_OSDETECT_MODE_VDDA = 0x2U,//!< O/S DC is enabled at full + //!< scale + ADC_OSDETECT_MODE_5BY12_VDDA = 0x3U,//!< O/S DC is enabled at 5/12 + //!< scale + ADC_OSDETECT_MODE_7BY12_VDDA = 0x4U,//!< O/S DC is enabled at 7/12 + //!< scale + ADC_OSDETECT_MODE_5K_PULLDOWN_TO_VSSA = 0x5U,//!< O/S DC is enabled at 5K + //!< pulldown to VSSA + ADC_OSDETECT_MODE_5K_PULLUP_TO_VDDA = 0x6U,//!< O/S DC is enabled at 5K + //!< pullup to VDDA + ADC_OSDETECT_MODE_7K_PULLDOWN_TO_VSSA = 0x7U //!< O/S DC is enabled at 7K + //!< pulldown to VSSA +} ADC_OSDetectMode; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an ADC base address. +//! +//! \param base specifies the ADC module base address. +//! +//! This function determines if a ADC module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +ADC_isBaseValid(uint32_t base) +{ + return( + (base == ADCA_BASE) || + (base == ADCB_BASE) || + (base == ADCC_BASE) || + (base == ADCD_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Configures the analog-to-digital converter module prescaler. +//! +//! \param base is the base address of the ADC module. +//! \param clkPrescale is the ADC clock prescaler. +//! +//! This function configures the ADC module's ADCCLK. +//! +//! The \e clkPrescale parameter specifies the value by which the input clock +//! is divided to make the ADCCLK. The clkPrescale value can be specified with +//! any of the following enum values: +//! \b ADC_CLK_DIV_1_0, \b ADC_CLK_DIV_2_0, \b ADC_CLK_DIV_2_5, ..., +//! \b ADC_CLK_DIV_7_5, \b ADC_CLK_DIV_8_0, or \b ADC_CLK_DIV_8_5. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setPrescaler(uint32_t base, ADC_ClkPrescale clkPrescale) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the configuration of the ADC module prescaler. + // + EALLOW; + HWREGH(base + ADC_O_CTL2) = (HWREGH(base + ADC_O_CTL2) & + ~ADC_CTL2_PRESCALE_M) | (uint16_t)clkPrescale; + EDIS; +} + +//***************************************************************************** +// +//! Configures a start-of-conversion (SOC) in the ADC. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! \param trigger the source that will cause the SOC. +//! \param channel is the number associated with the input signal. +//! \param sampleWindow is the acquisition window duration. +//! +//! This function configures the a start-of-conversion (SOC) in the ADC module. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC is to be configured on the ADC module +//! specified by \e base. +//! +//! The \e trigger specifies the event that causes the SOC such as software, a +//! timer interrupt, an ePWM event, or an ADC interrupt. It should be a value +//! in the format of \b ADC_TRIGGER_XXXX where XXXX is the event such as +//! \b ADC_TRIGGER_SW_ONLY, \b ADC_TRIGGER_CPU1_TINT0, \b ADC_TRIGGER_GPIO, +//! \b ADC_TRIGGER_EPWM1_SOCA, and so on. +//! +//! The \e channel parameter specifies the channel to be converted. In +//! single-ended mode this is a single pin given by \b ADC_CH_ADCINx where x is +//! the number identifying the pin between 0 and 15 inclusive. In differential +//! mode, two pins are used as inputs and are passed in the \e channel +//! parameter as \b ADC_CH_ADCIN0_ADCIN1, \b ADC_CH_ADCIN2_ADCIN3, ..., or +//! \b ADC_CH_ADCIN14_ADCIN15. +//! +//! The \e sampleWindow parameter is the acquisition window duration in SYSCLK +//! cycles. It should be a value between 1 and 512 cycles inclusive. The +//! selected duration must be at least as long as one ADCCLK cycle. Also, the +//! datasheet will specify a minimum window duration requirement in +//! nanoseconds. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setupSOC(uint32_t base, ADC_SOCNumber socNumber, ADC_Trigger trigger, + ADC_Channel channel, uint32_t sampleWindow) +{ + uint32_t ctlRegAddr, mask; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((sampleWindow >= 1U) && (sampleWindow <= 512U)); + + mask = (ADC_SOC0CTL_CHSEL_M | ADC_SOC0CTL_TRIGSEL_M | ADC_SOC0CTL_ACQPS_M); + + // + // Calculate address for the SOC control register. + // + ctlRegAddr = base + ADC_SOCxCTL_OFFSET_BASE + ((uint32_t)socNumber * 2U); + + // + // Set the configuration of the specified SOC. + // + EALLOW; + + HWREG(ctlRegAddr) = (HWREG(ctlRegAddr) & ~(mask)) | + ((uint32_t)channel << ADC_SOC0CTL_CHSEL_S) | + ((uint32_t)trigger << ADC_SOC0CTL_TRIGSEL_S) | + (sampleWindow - 1U); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the interrupt SOC trigger of an SOC. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! \param trigger the interrupt source that will cause the SOC. +//! +//! This function configures the interrupt start-of-conversion trigger in +//! the ADC module. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC is to be configured on the ADC module +//! specified by \e base. +//! +//! The \e trigger specifies the interrupt that causes a start of conversion or +//! none. It should be one of the following values. +//! +//! - \b ADC_INT_SOC_TRIGGER_NONE +//! - \b ADC_INT_SOC_TRIGGER_ADCINT1 +//! - \b ADC_INT_SOC_TRIGGER_ADCINT2 +//! +//! This functionality is useful for creating continuous conversions. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptSOCTrigger(uint32_t base, ADC_SOCNumber socNumber, + ADC_IntSOCTrigger trigger) +{ + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each SOC has a 2-bit field in this register. + // + shiftVal = (uint16_t)socNumber << 1U; + + // + // Set the configuration of the specified SOC. Not that we're treating + // ADCINTSOCSEL1 and ADCINTSOCSEL2 as one 32-bit register here. + // + EALLOW; + HWREG(base + ADC_O_INTSOCSEL1) = (HWREG(base + ADC_O_INTSOCSEL1) & + ~((uint32_t)ADC_INTSOCSEL1_SOC0_M << + shiftVal)) | + ((uint32_t)trigger << shiftVal); + EDIS; +} + +//***************************************************************************** +// +//! Sets the timing of the end-of-conversion pulse +//! +//! \param base is the base address of the ADC module. +//! \param pulseMode is the generation mode of the EOC pulse. +//! +//! This function configures the end-of-conversion (EOC) pulse generated by ADC. +//! This pulse will be generated either at the end of the acquisition window +//!(pass \b ADC_PULSE_END_OF_ACQ_WIN into \e pulseMode) or at the end of the +//! voltage conversion, one cycle prior to the ADC result latching into it's +//! result register (pass \b ADC_PULSE_END_OF_CONV into \e pulseMode). +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptPulseMode(uint32_t base, ADC_PulseMode pulseMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the position of the pulse. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) = (HWREGH(base + ADC_O_CTL1) & + ~ADC_CTL1_INTPULSEPOS) | (uint16_t)pulseMode; + EDIS; +} + + + + +//***************************************************************************** +// +//! Powers up the analog-to-digital converter core. +//! +//! \param base is the base address of the ADC module. +//! +//! This function powers up the analog circuitry inside the analog core. +//! +//! \note Allow at least a 500us delay before sampling after calling this API. +//! If you enable multiple ADCs, you can delay after they all have begun +//! powering up. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableConverter(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Set the bit that powers up the analog circuitry. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) |= ADC_CTL1_ADCPWDNZ; + EDIS; +} + +//***************************************************************************** +// +//! Powers down the analog-to-digital converter module. +//! +//! \param base is the base address of the ADC module. +//! +//! This function powers down the analog circuitry inside the analog core. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableConverter(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the bit that powers down the analog circuitry. + // + EALLOW; + HWREGH(base + ADC_O_CTL1) &= ~ADC_CTL1_ADCPWDNZ; + EDIS; +} + +//***************************************************************************** +// +//! Forces a SOC flag to a 1 in the analog-to-digital converter. +//! +//! \param base is the base address of the ADC module. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function forces the SOC flag associated with the SOC specified by +//! \e socNumber. This initiates a conversion once that SOC is given +//! priority. This software trigger can be used whether or not the SOC has been +//! configured to accept some other specific trigger. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_forceSOC(uint32_t base, ADC_SOCNumber socNumber) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Write to the register that will force a 1 to the corresponding SOC flag + // + HWREGH(base + ADC_O_SOCFRC1) = ((uint16_t)1U << (uint16_t)socNumber); +} + +//***************************************************************************** +// +//! Forces multiple SOC flags to 1 in the analog-to-digital converter. +//! +//! \param base is the base address of the ADC module. +//! \param socMask is the SOCs to be forced through software +//! +//! This function forces the SOCFRC1 flags associated with the SOCs specified +//! by \e socMask. This initiates a conversion once the desired SOCs are given +//! priority. This software trigger can be used whether or not the SOC has been +//! configured to accept some other specific trigger. +//! Valid values for \e socMask parameter can be any of the individual +//! ADC_FORCE_SOCx values or any of their OR'd combination to trigger multiple +//! SOCs. +//! +//! \note To trigger SOC0, SOC1 and SOC2, value (ADC_FORCE_SOC0 | +//! ADC_FORCE_SOC1 | ADC_FORCE_SOC2) should be passed as socMask. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_forceMultipleSOC(uint32_t base, uint16_t socMask) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Write to the register that will force a 1 to desired SOCs + // + HWREGH(base + ADC_O_SOCFRC1) = socMask; +} + +//***************************************************************************** +// +//! Gets the current ADC interrupt status. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function returns the interrupt status for the analog-to-digital +//! converter. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get +//! the interrupt status for the given interrupt number of the ADC module. +//! +//! \return \b true if the interrupt flag for the specified interrupt number is +//! set and \b false if it is not. +// +//***************************************************************************** +static inline bool +ADC_getInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + // + // Get the specified ADC interrupt status. + // + return((HWREGH(base + ADC_O_INTFLG) & (1U << (uint16_t)adcIntNum)) != 0U); +} + +//***************************************************************************** +// +//! Clears ADC interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function clears the specified ADC interrupt sources so that they no +//! longer assert. If not in continuous mode, this function must be called +//! before any further interrupt pulses may occur. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the specified interrupt. + // + HWREGH(base + ADC_O_INTFLGCLR) = (uint16_t)1U << (uint16_t)adcIntNum; + +} + +//***************************************************************************** +// +//! Gets the current ADC interrupt overflow status. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function returns the interrupt overflow status for the +//! analog-to-digital converter. An overflow condition is generated +//! irrespective of the continuous mode. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get +//! the interrupt overflow status for the given interrupt number. +//! +//! \return \b true if the interrupt overflow flag for the specified interrupt +//! number is set and \b false if it is not. +// +//***************************************************************************** +static inline bool +ADC_getInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the specified ADC interrupt status. + // + return((HWREGH(base + ADC_O_INTOVF) & (1U << (uint16_t)adcIntNum)) != 0U); +} + +//***************************************************************************** +// +//! Clears ADC interrupt overflow sources. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function clears the specified ADC interrupt overflow sources so that +//! they no longer assert. If software tries to clear the overflow in the same +//! cycle that hardware tries to set the overflow, then hardware has priority. +//! +//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupt overflow status of the ADC module +//! should be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Clear the specified interrupt overflow bit. + // + HWREGH(base + ADC_O_INTOVFCLR) = (uint16_t)1U << (uint16_t)adcIntNum; +} + +//***************************************************************************** +// +//! Reads the conversion result. +//! +//! \param resultBase is the base address of the ADC results. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function returns the conversion result that corresponds to the base +//! address passed into \e resultBase and the SOC passed into \e socNumber. +//! +//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which SOC's result is to be read. +//! +//! \note Take care that you are using a base address for the result registers +//! (ADCxRESULT_BASE) and not a base address for the control registers. +//! +//! \return Returns the conversion result. +// +//***************************************************************************** +static inline uint16_t +ADC_readResult(uint32_t resultBase, ADC_SOCNumber socNumber) +{ + // + // Check the arguments. + // + ASSERT( + (resultBase == ADCARESULT_BASE) || + (resultBase == ADCBRESULT_BASE) || + (resultBase == ADCCRESULT_BASE) || + (resultBase == ADCDRESULT_BASE) + ); + // + // Return the ADC result for the selected SOC. + // + return(HWREGH(resultBase + (uint32_t)ADC_RESULTx_OFFSET_BASE + + (uint32_t)socNumber)); +} + +//***************************************************************************** +// +//! Determines whether the ADC is busy or not. +//! +//! \param base is the base address of the ADC. +//! +//! This function allows the caller to determine whether or not the ADC is +//! busy and can sample another channel. +//! +//! \return Returns \b true if the ADC is sampling or \b false if all +//! samples are complete. +// +//***************************************************************************** +static inline bool +ADC_isBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Determine if the ADC is busy. + // + return((HWREGH(base + ADC_O_CTL1) & ADC_CTL1_ADCBSY) != 0U); +} + +//***************************************************************************** +// +//! Set SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! \param trigger the source that will cause the burst conversion sequence. +//! \param burstSize is the number of SOCs converted during a burst sequence. +//! +//! This function configures the burst trigger and burstSize of an ADC module. +//! Burst mode allows a single trigger to walk through the round-robin SOCs one +//! or more at a time. When burst mode is enabled, the trigger selected by the +//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin +//! mode. Instead, the source specified through the \e trigger parameter will +//! cause a burst of \e burstSize conversions to occur. +//! +//! The \e trigger parameter takes the same values as the ADC_setupSOC() API +//! The \e burstSize parameter should be a value between 1 and 16 inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setBurstModeConfig(uint32_t base, ADC_Trigger trigger, uint16_t burstSize) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT(((uint16_t)trigger & ~((uint16_t)0x1FU)) == 0U); + ASSERT((burstSize >= 1U) && (burstSize <= 16U)); + + // + // Write the burst mode configuration to the register. + // + EALLOW; + + regValue = (uint16_t)trigger | ((burstSize - 1U) << + ADC_BURSTCTL_BURSTSIZE_S); + + HWREGH(base + ADC_O_BURSTCTL) = (HWREGH(base + ADC_O_BURSTCTL) & + ~((uint16_t)ADC_BURSTCTL_BURSTTRIGSEL_M | + ADC_BURSTCTL_BURSTSIZE_M)) | regValue; + + EDIS; +} + +//***************************************************************************** +// +//! Enables SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! +//! This function enables SOC burst mode operation of the ADC. Burst mode +//! allows a single trigger to walk through the round-robin SOCs one or more at +//! a time. When burst mode is enabled, the trigger selected by the +//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin +//! mode. Use ADC_setBurstMode() to configure the burst trigger and size. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableBurstMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Enable burst mode. + // + EALLOW; + HWREGH(base + ADC_O_BURSTCTL) |= ADC_BURSTCTL_BURSTEN; + EDIS; +} + +//***************************************************************************** +// +//! Disables SOC burst mode. +//! +//! \param base is the base address of the ADC. +//! +//! This function disables SOC burst mode operation of the ADC. SOCs in +//! round-robin mode will be triggered by the trigger configured using the +//! ADC_setupSOC() API. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableBurstMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Disable burst mode. + // + EALLOW; + HWREGH(base + ADC_O_BURSTCTL) &= ~ADC_BURSTCTL_BURSTEN; + EDIS; +} + +//***************************************************************************** +// +//! Sets the priority mode of the SOCs. +//! +//! \param base is the base address of the ADC. +//! \param priMode is the priority mode of the SOCs. +//! +//! This function sets the priority mode of the SOCs. There are three main +//! modes that can be passed in the \e priMode parameter +//! +//! - All SOCs are in round-robin mode. This means no SOC has an inherent +//! higher priority over another. This is selected by passing in the value +//! \b ADC_PRI_ALL_ROUND_ROBIN. +//! - All priorities are in high priority mode. This means that the priority of +//! the SOC is determined by its SOC number. This option is selected by passing +//! in the value \b ADC_PRI_ALL_HIPRI. +//! - A range of SOCs are assigned high priority, with all others in round +//! robin mode. High priority mode means that an SOC with high priority will +//! interrupt the round robin wheel and insert itself as the next conversion. +//! Passing in the value \b ADC_PRI_SOC0_HIPRI will make SOC0 highest priority, +//! \b ADC_PRI_THRU_SOC1_HIPRI will put SOC0 and SOC 1 in high priority, and so +//! on up to \b ADC_PRI_THRU_SOC14_HIPRI where SOCs 0 through 14 are in high +//! priority. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setSOCPriority(uint32_t base, ADC_PriorityMode priMode) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + EALLOW; + + HWREGH(base + ADC_O_SOCPRICTL) = (HWREGH(base + ADC_O_SOCPRICTL) & + ~ADC_SOCPRICTL_SOCPRIORITY_M) | + (uint16_t)priMode; + + EDIS; +} + +//***************************************************************************** +// +//! Configures Open/Shorts Detection Circuit Mode. +//! +//! \param base is the base address of the ADC. +//! \param modeVal is the desired open/shorts detection circuit mode. +//! +//! This function configures the open/shorts detection circuit mode of the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_configOSDetectMode(uint32_t base, ADC_OSDetectMode modeVal) +{ + // + // Configure open/shorts detection circuit mode. + // + EALLOW; + HWREGH(base + ADC_O_OSDETECT) = ((HWREGH(base + ADC_O_OSDETECT) & + (~ADC_OSDETECT_DETECTCFG_M)) | + (uint16_t)modeVal); + EDIS; +} + +//***************************************************************************** +// +//! Configures a post-processing block (PPB) in the ADC. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function associates a post-processing block with a SOC. +//! +//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to +//! 4 inclusive that identifies a PPB to be configured. The \e socNumber +//! number is a value \b ADC_SOC_NUMBERX where X is a number from 0 to 15 +//! specifying which SOC is to be configured on the ADC module specified by +//! \e base. +//! +//! \note You can have more that one PPB associated with the same SOC, but a +//! PPB can only be configured to correspond to one SOC at a time. Also note +//! that when you have multiple PPBs for the same SOC, the calibration offset +//! that actually gets applied will be that of the PPB with the highest number. +//! Since SOC0 is the default for all PPBs, look out for unintentional +//! overwriting of a lower numbered PPB's offset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setupPPB(uint32_t base, ADC_PPBNumber ppbNumber, ADC_SOCNumber socNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Write the configuration to the register. + // + EALLOW; + HWREGH(base + ppbOffset) = (HWREGH(base + ppbOffset) & + ~ADC_PPB1CONFIG_CONFIG_M) | + ((uint16_t)socNumber & ADC_PPB1CONFIG_CONFIG_M); + EDIS; +} + +//***************************************************************************** +// +//! Enables individual ADC PPB event sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event sources to be enabled. +//! +//! This function enables the indicated ADC PPB event sources. This will allow +//! the specified events to propagate through the X-BAR to a pin or to an ePWM +//! module. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Enable the specified event. + // + EALLOW; + HWREGH(base + ADC_O_EVTSEL) |= evtFlags << ((uint16_t)ppbNumber * 4U); + EDIS; +} + +//***************************************************************************** +// +//! Disables individual ADC PPB event sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event sources to be enabled. +//! +//! This function disables the indicated ADC PPB event sources. This will stop +//! the specified events from propagating through the X-BAR to other modules. +//! The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Disable the specified event. + // + EALLOW; + HWREGH(base + ADC_O_EVTSEL) &= ~(evtFlags << ((uint16_t)ppbNumber * 4U)); + EDIS; +} + +//***************************************************************************** +// +//! Enables individual ADC PPB event interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated ADC PPB interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. The \e intFlags +//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, +//! or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((intFlags & ~0x7U) == 0U); + + // + // Enable the specified event interrupts. + // + EALLOW; + HWREGH(base + ADC_O_EVTINTSEL) |= intFlags << ((uint16_t)ppbNumber * 4U); + EDIS; +} + +//***************************************************************************** +// +//! Disables individual ADC PPB event interrupt sources. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param intFlags is a bit mask of the interrupt source to be disabled. +//! +//! This function disables the indicated ADC PPB interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. The \e intFlags +//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, +//! or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((intFlags & ~0x7U) == 0U); + + // + // Disable the specified event interrupts. + // + EALLOW; + HWREGH(base + ADC_O_EVTINTSEL) &= ~(intFlags << + ((uint16_t)ppbNumber * 4U)); + EDIS; +} + +//***************************************************************************** +// +//! Gets the current ADC event status. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the event status for the analog-to-digital converter. +//! +//! \return Returns the current event status, enumerated as a bit field of +//! \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, and \b ADC_EVT_ZERO. +// +//***************************************************************************** +static inline uint16_t +ADC_getPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the event status for the specified post-processing block. + // + return((HWREGH(base + ADC_O_EVTSTAT) >> ((uint16_t)ppbNumber * 4U)) & + 0x7U); +} + +//***************************************************************************** +// +//! Clears ADC event flags. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param evtFlags is a bit mask of the event source to be cleared. +//! +//! This function clears the indicated ADC PPB event flags. After an event +//! occurs this function must be called to allow additional events to be +//! produced. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI, +//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_clearPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t evtFlags) +{ + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT((evtFlags & ~0x7U) == 0U); + + // + // Clear the specified event interrupts. + // + HWREGH(base + ADC_O_EVTCLR) |= evtFlags << ((uint16_t)ppbNumber * 4U); +} + + +//***************************************************************************** +// +//! Reads the processed conversion result from the PPB. +//! +//! \param resultBase is the base address of the ADC results. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the processed conversion result that corresponds to +//! the base address passed into \e resultBase and the PPB passed into +//! \e ppbNumber. +//! +//! \note Take care that you are using a base address for the result registers +//! (ADCxRESULT_BASE) and not a base address for the control registers. +//! +//! \return Returns the signed 32-bit conversion result. +// +//***************************************************************************** +static inline int32_t +ADC_readPPBResult(uint32_t resultBase, ADC_PPBNumber ppbNumber) +{ + // + // Check the arguments. + // + ASSERT( + (resultBase == ADCARESULT_BASE) || + (resultBase == ADCBRESULT_BASE) || + (resultBase == ADCCRESULT_BASE) || + (resultBase == ADCDRESULT_BASE) + ); + // + // Return the result of selected PPB. + // + return((int32_t)HWREG(resultBase + (uint32_t)ADC_PPBxRESULT_OFFSET_BASE + + ((uint32_t)ppbNumber * 2UL))); +} + +//***************************************************************************** +// +//! Reads sample delay time stamp from a PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function returns the sample delay time stamp. This delay is the number +//! of system clock cycles between the SOC being triggered and when it began +//! converting. +//! +//! \return Returns the delay time stamp. +// +//***************************************************************************** +static inline uint16_t +ADC_getPPBDelayTimeStamp(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate delay. + // + ppbOffset = (ADC_PPBxSTAMP_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1STAMP; + + // + // Return the delay time stamp. + // + return(HWREGH(base + ppbOffset) & ADC_PPB2STAMP_DLYSTAMP_M); +} + +//***************************************************************************** +// +//! Sets the post processing block offset correction. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param offset is the 10-bit signed value subtracted from ADC the output. +//! +//! This function sets the PPB offset correction value. This value can be used +//! to digitally remove any system-level offset inherent in the ADCIN circuit +//! before it is stored in the appropriate result register. The \e offset +//! parameter is \b subtracted from the ADC output and is a signed value from +//! -512 to 511 inclusive. For example, when \e offset = 1, ADCRESULT = ADC +//! output - 1. When \e offset = -512, ADCRESULT = ADC output - (-512) or ADC +//! output + 512. +//! +//! Passing a zero in to the \e offset parameter will effectively disable the +//! calculation, allowing the raw ADC result to be passed unchanged into the +//! result register. +//! +//! \note If multiple PPBs are applied to the same SOC, the offset that will be +//! applied will be that of the PPB with the highest number. +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_setPPBCalibrationOffset(uint32_t base, ADC_PPBNumber ppbNumber, + int16_t offset) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate offset register. + // + ppbOffset = (ADC_PPBxOFFCAL_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1OFFCAL; + + // + // Write the offset amount. + // + EALLOW; + HWREGH(base + ppbOffset) = (HWREGH(base + ppbOffset) & + ~ADC_PPB1OFFCAL_OFFCAL_M) | + ((uint16_t)offset & ADC_PPB1OFFCAL_OFFCAL_M); + EDIS; +} + +//***************************************************************************** +// +//! Sets the post processing block reference offset. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param offset is the 16-bit unsigned value subtracted from ADC the output. +//! +//! This function sets the PPB reference offset value. This can be used to +//! either calculate the feedback error or convert a unipolar signal to bipolar +//! by subtracting a reference value. The result will be stored in the +//! appropriate PPB result register which can be read using ADC_readPPBResult(). +//! +//! Passing a zero in to the \e offset parameter will effectively disable the +//! calculation and will pass the ADC result to the PPB result register +//! unchanged. +//! +//! \note If in 12-bit mode, you may only pass a 12-bit value into the \e offset +//! parameter. +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_setPPBReferenceOffset(uint32_t base, ADC_PPBNumber ppbNumber, + uint16_t offset) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate offset register. + // + ppbOffset = (ADC_PPBxOFFREF_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1OFFREF; + + // + // Write the offset amount. + // + HWREGH(base + ppbOffset) = offset; +} + +//***************************************************************************** +// +//! Enables two's complement capability in the PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function enables two's complement in the post-processing block +//! specified by the \e ppbNumber parameter. When enabled, a two's complement +//! will be performed on the output of the offset subtraction before it is +//! stored in the appropriate PPB result register. In other words, the PPB +//! result will be the reference offset value minus the the ADC result value +//! (ADCPPBxRESULT = ADCSOCxOFFREF - ADCRESULTx). +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_enablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Enable PPB two's complement. + // + EALLOW; + HWREGH(base + ppbOffset) |= ADC_PPB1CONFIG_TWOSCOMPEN; + EDIS; +} + +//***************************************************************************** +// +//! Disables two's complement capability in the PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! +//! This function disables two's complement in the post-processing block +//! specified by the \e ppbNumber parameter. When disabled, a two's complement +//! will \b NOT be performed on the output of the offset subtraction before it +//! is stored in the appropriate PPB result register. In other words, the PPB +//! result will be the ADC result value minus the reference offset value +//! (ADCPPBxRESULT = ADCRESULTx - ADCSOCxOFFREF). +//! +//! \return None +// +//***************************************************************************** +static inline void +ADC_disablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber) +{ + uint32_t ppbOffset; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Get the offset to the appropriate PPB configuration register. + // + ppbOffset = (ADC_PPBxCONFIG_STEP * (uint32_t)ppbNumber) + ADC_O_PPB1CONFIG; + + // + // Disable PPB two's complement. + // + EALLOW; + HWREGH(base + ppbOffset) &= ~ADC_PPB1CONFIG_TWOSCOMPEN; + EDIS; +} + +//***************************************************************************** +// +//! Enables an ADC interrupt source. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function enables the indicated ADC interrupt source. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableInterrupt(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Enable the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) |= ADC_INTSEL1N2_INT1E << shiftVal; + + EDIS; +} + +//***************************************************************************** +// +//! Disables an ADC interrupt source. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function disables the indicated ADC interrupt source. +//! Only the sources that are enabled can be reflected to the processor +//! interrupt. Disabled sources have no effect on the processor. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module should be disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableInterrupt(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Disable the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) &= ~(ADC_INTSEL1N2_INT1E << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Sets the source EOC for an analog-to-digital converter interrupt. +//! +//! \param base is the base address of the ADC module. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! \param socNumber is the number of the start-of-conversion. +//! +//! This function sets which conversion is the source of an ADC interrupt. +//! +//! The \e intTrigger number is a value \b ADC_SOC_NUMBERX where X is a number +//! from 0 to 15 specifying which EOC is to be configured on the ADC module +//! specified by \e base. Refer \b ADC_SOCNumber enum for valid values for +//! this input. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_setInterruptSource(uint32_t base, ADC_IntNumber adcIntNum, + uint16_t intTrigger) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + ASSERT(intTrigger < 16U); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Set the specified ADC interrupt source. + // + EALLOW; + + HWREGH(intRegAddr) = + (HWREGH(intRegAddr) & ~(ADC_INTSEL1N2_INT1SEL_M << shiftVal)) | + ((uint16_t)intTrigger << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Enables continuous mode for an ADC interrupt. +//! +//! \param base is the base address of the ADC. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function enables continuous mode for the ADC interrupt passed into +//! \e adcIntNum. This means that pulses will be generated for the specified +//! ADC interrupt whenever an EOC pulse is generated irrespective of whether or +//! not the flag bit is set. +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_enableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Enable continuous mode for the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) |= ADC_INTSEL1N2_INT1CONT << shiftVal; + + EDIS; +} + +//***************************************************************************** +// +//! Disables continuous mode for an ADC interrupt. +//! +//! \param base is the base address of the ADC. +//! \param adcIntNum is interrupt number within the ADC wrapper. +//! +//! This function disables continuous mode for the ADC interrupt passed into +//! \e adcIntNum. This means that pulses will not be generated for the +//! specified ADC interrupt until the corresponding interrupt flag for the +//! previous interrupt occurrence has been cleared using +//! ADC_clearInterruptStatus(). +//! +//! \e adcIntNum can take the value \b ADC_INT_NUMBER1, +//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express +//! which of the four interrupts of the ADC module is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ADC_disableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum) +{ + uint32_t intRegAddr; + uint16_t shiftVal; + + // + // Check the arguments. + // + ASSERT(ADC_isBaseValid(base)); + + // + // Each INTSEL register manages two interrupts. If the interrupt number is + // even, we'll be accessing the upper byte and will need to shift. + // + intRegAddr = base + ADC_INTSELxNy_OFFSET_BASE + ((uint32_t)adcIntNum >> 1); + shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U; + + // + // Disable continuous mode for the specified ADC interrupt. + // + EALLOW; + + HWREGH(intRegAddr) &= ~(ADC_INTSEL1N2_INT1CONT << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +//! Converts temperature from sensor reading to degrees C +//! +//! \param tempResult is the raw ADC A conversion result from the temp sensor. +//! \param vref is the reference voltage being used (for example 3.3 for 3.3V). +//! +//! This function converts temperature from temp sensor reading to degrees C. +//! Temp sensor values in production test are derived with 2.5V reference. +//! The \b vref argument in the function is used to scale the temp sensor +//! reading accordingly if temp sensor value is read at a different VREF +//! setting. +//! +//! \return Returns the temperature sensor reading converted to degrees C. +// +//***************************************************************************** +static inline int16_t +ADC_getTemperatureC(uint16_t tempResult, float32_t vref) +{ + int16_t tsOffset, tsSlope; + float32_t temp; + + // + // Check the device revision + // + if(HWREGH(DEVCFG_BASE + SYSCTL_O_REVID) >= 3) + { + // + // For production devices (Rev. C), pull the slope and offset from OTP + // +#ifdef __TMS320C28XX__ + + // + // Only accessible from the CPU. + // + tsSlope = (int16_t)ADC_getTempSlope(); + tsOffset = (int16_t)ADC_getTempOffset(); +#endif + } + else + { + // + // For pre-production devices, use these static values for slope + // and offset + // + tsSlope = 5196; + tsOffset = 1788; + } + + // + // The slope is stored as a Q15 fixed point number hence the need to + // to an integer. + // + temp = (((float32_t)tempResult * (vref / 2.5F)) - (float32_t)tsOffset) * + (float32_t)tsSlope; + return((int16_t)((((int32_t)temp + (int32_t)0x4000 + + ((int32_t)273 * (int32_t)0x8000)) / + (int32_t)0x8000) - (int32_t)273)); +} + +//***************************************************************************** +// +//! Converts temperature from sensor reading to degrees K +//! +//! \param tempResult is the raw ADC A conversion result from the temp sensor. +//! \param vref is the reference voltage being used (for example 3.3 for 3.3V). +//! +//! This function converts temperature from temp sensor reading to degrees K. +//! Temp sensor values in production test are derived with 2.5V reference. +//! The \b vref argument in the function is used to scale the temp sensor +//! reading accordingly if temp sensor value is read at a different VREF +//! setting. +//! +//! \return Returns the temperature sensor reading converted to degrees K. +// +//***************************************************************************** +static inline int16_t +ADC_getTemperatureK(uint16_t tempResult, float32_t vref) +{ + int16_t tsOffset, tsSlope; + float32_t temp; + + // + // Check the device revision + // + if(HWREGH(DEVCFG_BASE + SYSCTL_O_REVID) >= 3) + { + // + // For production devices (Rev. C), pull the slope and offset from OTP + // +#ifdef __TMS320C28XX__ + + // + // Only accessible from the CPU. + // + tsSlope = (int16_t)ADC_getTempSlope(); + tsOffset = (int16_t)ADC_getTempOffset(); +#endif + } + else + { + // + // For pre-production devices, use these static values for slope + // and offset + // + tsSlope = 5196; + tsOffset = 1788; + } + + // + // The slope is stored as a Q15 fixed point number hence the need to + // to an integer. + // + temp = (((float32_t)tempResult * (vref / 2.5F)) - (float32_t)tsOffset) * + (float32_t)tsSlope; + return((int16_t)(((int32_t)temp + (int32_t)0x4000 + ((int32_t)273 * + (int32_t)0x8000)) / (int32_t)0x8000)); +} + + +//***************************************************************************** +// +//! Configures the analog-to-digital converter resolution and signal mode. +//! +//! \param base is the base address of the ADC module. +//! \param resolution is the resolution of the converter (12 or 16 bits). +//! \param signalMode is the input signal mode of the converter. +//! +//! This function configures the ADC module's conversion resolution and input +//! signal mode and ensures that the corresponding trims are loaded. +//! +//! The \e resolution parameter specifies the resolution of the conversion. +//! It can be 12-bit or 16-bit specified by \b ADC_RESOLUTION_12BIT +//! or \b ADC_RESOLUTION_16BIT. +//! +//! The \e signalMode parameter specifies the signal mode. In single-ended +//! mode, which is indicated by \b ADC_MODE_SINGLE_ENDED, the input voltage is +//! sampled on a single pin referenced to VREFLO. In differential mode, which +//! is indicated by \b ADC_MODE_DIFFERENTIAL, the input voltage to the +//! converter is sampled on a pair of input pins, a positive and a negative. +//! +//! \b Note: In this device, single-ended signal conversions are supported +//! only in 12-bit resolution mode and differential signal +//! conversions are supported only in 16-bit resolution mode. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setMode(uint32_t base, ADC_Resolution resolution, + ADC_SignalMode signalMode); + + +//***************************************************************************** +// +//! Configures the offset trim for the desired ADC instance +//! +//! \param base is the base address of the ADC module. +//! +//! This function loads the offset trims for the desired ADC instance. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setOffsetTrim(uint32_t base); + +//***************************************************************************** +// +//! Configures the INL trim for the desired ADC instance +//! +//! \param base is the base address of the ADC module. +//! +//! This function loads the INL trims for the desired ADC instance. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setINLTrim(uint32_t base); + +//***************************************************************************** +// +//! Sets the windowed trip limits for a PPB. +//! +//! \param base is the base address of the ADC module. +//! \param ppbNumber is the number of the post-processing block. +//! \param tripHiLimit is the value is the digital comparator trip high limit. +//! \param tripLoLimit is the value is the digital comparator trip low limit. +//! +//! This function sets the windowed trip limits for a PPB. These values set +//! the digital comparator so that when one of the values is exceeded, either a +//! high or low trip event will occur. +//! +//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to +//! 4 inclusive that identifies a PPB to be configured. +//! +//! If using 16-bit mode, you may pass a 17-bit number into the \e tripHiLimit +//! and \e tripLoLimit parameters where the 17th bit is the sign bit (that is +//! a value from -65536 and 65535). In 12-bit mode, only bits 12:0 will be +//! compared against bits 12:0 of the PPB result. +//! +//! \note On some devices, signed trip values do not work properly. See the +//! silicon errata for details. +//! +//! \return None. +// +//***************************************************************************** +extern void +ADC_setPPBTripLimits(uint32_t base, ADC_PPBNumber ppbNumber, + int32_t tripHiLimit, int32_t tripLoLimit); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ADC_H diff --git a/gpio_driverlib_cpu1/device/driverlib/asysctl.c b/gpio_driverlib_cpu1/device/driverlib/asysctl.c new file mode 100644 index 0000000..4f3d202 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/asysctl.c @@ -0,0 +1,43 @@ +//########################################################################### +// +// FILE: asysctl.c +// +// TITLE: C28x Driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "asysctl.h" diff --git a/gpio_driverlib_cpu1/device/driverlib/asysctl.h b/gpio_driverlib_cpu1/device/driverlib/asysctl.h new file mode 100644 index 0000000..40e6c5c --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/asysctl.h @@ -0,0 +1,160 @@ +//########################################################################### +// +// FILE: asysctl.h +// +// TITLE: C28x driver for Analog System Control. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef ASYSCTL_H +#define ASYSCTL_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup asysctl_api ASysCtl +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_asysctl.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "debug.h" +#include "cpu.h" + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Enable temperature sensor. +//! +//! This function enables the temperature sensor output to the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ASysCtl_enableTemperatureSensor(void) +{ + EALLOW; + + // + // Set the temperature sensor enable bit. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_TSNSCTL) |= ASYSCTL_TSNSCTL_ENABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Disable temperature sensor. +//! +//! This function disables the temperature sensor output to the ADC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +ASysCtl_disableTemperatureSensor(void) +{ + EALLOW; + + // + // Clear the temperature sensor enable bit. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_TSNSCTL) &= ~(ASYSCTL_TSNSCTL_ENABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the temperature sensor control register. +//! +//! \return None. +// +//***************************************************************************** +static inline void ASysCtl_lockTemperatureSensor(void) +{ + EALLOW; + + // + // Write a 1 to the lock bit in the LOCK register. + // + HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_LOCK) |= ASYSCTL_LOCK_TSNSCTL; + + EDIS; +} + + + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ASYSCTL_H diff --git a/gpio_driverlib_cpu1/device/driverlib/can.c b/gpio_driverlib_cpu1/device/driverlib/can.c new file mode 100644 index 0000000..5a33a50 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/can.c @@ -0,0 +1,1122 @@ +//########################################################################### +// +// FILE: can.c +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#include "can.h" + +//***************************************************************************** +// +// CAN_initModule +// +//***************************************************************************** +void +CAN_initModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Place CAN controller in init state, regardless of previous state. This + // will put controller in idle, and allow the message object RAM to be + // programmed. + // + HWREGH(base + CAN_O_CTL) |= ((uint16_t)CAN_CTL_INIT | + (uint16_t)CAN_INIT_PARITY_DISABLE); + + // + // Initialize the message RAM before using it. + // + CAN_initRAM(base); + + // + // Force module to reset state + // + + HWREGH(base + CAN_O_CTL) |= CAN_CTL_SWR; + + // + // Delay for 14 cycles + // + SysCtl_delay(1U); + + // + // Enable write access to the configuration registers + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_CCE; +} + +//***************************************************************************** +// +// CAN_setBitRate +// +//***************************************************************************** +void +CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate, + uint16_t bitTime) +{ + uint16_t brp; + uint16_t tPhase; + uint16_t phaseSeg2; + uint16_t tSync = 1U; + uint16_t tProp = 2U; + uint16_t tSeg1; + uint16_t tSeg2; + uint16_t sjw; + uint16_t prescaler; + uint16_t prescalerExtension; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((bitTime > 7U) && (bitTime < 26U)); + ASSERT(bitRate <= 1000000U); + + // + // Calculate bit timing values + // + brp = (uint16_t)(clockFreq / (bitRate * bitTime)); + tPhase = bitTime - (tSync + tProp); + if((tPhase / 2U) <= 8U) + { + phaseSeg2 = tPhase / 2U; + } + else + { + phaseSeg2 = 8U; + } + tSeg1 = ((tPhase - phaseSeg2) + tProp) - 1U; + tSeg2 = phaseSeg2 - 1U; + if(phaseSeg2 > 4U) + { + sjw = 3U; + } + else + { + sjw = tSeg2; + } + prescalerExtension = ((brp - 1U) / 64U); + prescaler = ((brp - 1U) % 64U); + + // + // Set the calculated timing parameters + // + CAN_setBitTiming(base, prescaler, prescalerExtension, tSeg1, tSeg2, sjw); +} + +//***************************************************************************** +// +// CAN_setBitTiming +// +//***************************************************************************** +void +CAN_setBitTiming(uint32_t base, uint16_t prescaler, + uint16_t prescalerExtension, uint16_t tSeg1, uint16_t tSeg2, + uint16_t sjw) +{ + uint16_t savedInit; + uint32_t bitReg; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT(prescaler < 64U); + ASSERT((tSeg1 > 0U) && (tSeg1 < 16U)); + ASSERT(tSeg2 < 8U); + ASSERT(sjw < 4U); + ASSERT(prescalerExtension < 16U); + + // + // To set the bit timing register, the controller must be placed in init + // mode (if not already), and also configuration change bit enabled. + // State of the init bit should be saved so it can be restored at the end. + // + savedInit = HWREGH(base + CAN_O_CTL); + HWREGH(base + CAN_O_CTL) = savedInit | CAN_CTL_INIT | CAN_CTL_CCE; + + // + // Set the bit fields of the bit timing register + // + bitReg = (uint32_t)((uint32_t)prescaler & CAN_BTR_BRP_M); + bitReg |= (uint32_t)(((uint32_t)sjw << CAN_BTR_SJW_S) & CAN_BTR_SJW_M); + bitReg |= (uint32_t)(((uint32_t)tSeg1 << CAN_BTR_TSEG1_S) & + CAN_BTR_TSEG1_M); + bitReg |= (uint32_t)(((uint32_t)tSeg2 << CAN_BTR_TSEG2_S) & + CAN_BTR_TSEG2_M); + bitReg |= (uint32_t)(((uint32_t)prescalerExtension << CAN_BTR_BRPE_S) & + CAN_BTR_BRPE_M); + + HWREG_BP(base + CAN_O_BTR) = bitReg; + + // + // Clear the config change bit, and restore the init bit. + // + savedInit &= ~((uint16_t)CAN_CTL_CCE); + + HWREGH(base + CAN_O_CTL) = savedInit; +} + + +//***************************************************************************** +// +// CAN_clearInterruptStatus +// +//***************************************************************************** +void +CAN_clearInterruptStatus(uint32_t base, uint32_t intClr) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intClr == CAN_INT_INT0ID_STATUS) || + ((intClr >= 1U) && (intClr <= 32U))); + + if(intClr == (uint32_t)CAN_INT_INT0ID_STATUS) + { + // + // Simply read and discard the status to clear the interrupt. + // + HWREGH(base + CAN_O_ES); + } + else + { + // + // Wait to be sure that this interface is not busy. + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == + CAN_IF1CMD_BUSY) + { + } + + // + // Only change the interrupt pending state by setting only the + // CAN_IF1CMD_CLRINTPND bit. + // + // Send the clear pending interrupt command to the CAN controller. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CLRINTPND | + (intClr & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait to be sure that this interface is not busy. + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == + CAN_IF1CMD_BUSY) + { + } + } +} + +//***************************************************************************** +// +// CAN_setupMessageObject +// +//***************************************************************************** +void +CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID, + CAN_MsgFrameType frame, CAN_MsgObjType msgType, + uint32_t msgIDMask, uint32_t flags, uint16_t msgLen) +{ + uint32_t cmdMaskReg = 0U; + uint32_t maskReg = 0U; + uint32_t arbReg = 0U; + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + switch(msgType) + { + // + // Transmit message object. + // + case CAN_MSG_OBJ_TYPE_TX: + { + // + // Set message direction to transmit. + // + arbReg = CAN_IF1ARB_DIR; + break; + } + + // + // Remote frame receive remote, with auto-transmit message object. + // + case CAN_MSG_OBJ_TYPE_RXTX_REMOTE: + { + // + // Set message direction to Tx for remote receivers. + // + arbReg = CAN_IF1ARB_DIR; + + // + // Set this object to auto answer if a matching identifier is seen. + // + msgCtrl = (uint32_t)((uint32_t)CAN_IF1MCTL_RMTEN | + (uint32_t)CAN_IF1MCTL_UMASK); + + break; + } + + // + // Transmit remote request message object (CAN_MSG_OBJ_TYPE_TX_REMOTE) + // or Receive message object (CAN_MSG_OBJ_TYPE_RX). + // + default: + { + // + // Set message direction to read. + // + arbReg = 0U; + + break; + } + } + + // + // Set values based on Extended Frame or Standard Frame + // + if(frame == CAN_MSG_FRAME_EXT) + { + // + // Configure the Mask Registers for 29 bit Identifier mask. + // + if((flags & CAN_MSG_OBJ_USE_ID_FILTER) == CAN_MSG_OBJ_USE_ID_FILTER) + { + maskReg = msgIDMask & CAN_IF1MSK_MSK_M; + } + + // + // Set the 29 bit version of the Identifier for this message + // object. Mark the message as valid and set the extended ID bit. + // + arbReg |= (msgID & CAN_IF1ARB_ID_M) | CAN_IF1ARB_MSGVAL | + CAN_IF1ARB_XTD; + } + else + { + // + // Configure the Mask Registers for 11 bit Identifier mask. + // + if((flags & CAN_MSG_OBJ_USE_ID_FILTER) == CAN_MSG_OBJ_USE_ID_FILTER) + { + maskReg = ((msgIDMask << CAN_IF1ARB_STD_ID_S) & + CAN_IF1ARB_STD_ID_M); + } + + // + // Set the 11 bit version of the Identifier for this message + // object. The lower 18 bits are set to zero. Mark the message as + // valid. + // + arbReg |= ((msgID << CAN_IF1ARB_STD_ID_S) & CAN_IF1ARB_STD_ID_M) | + CAN_IF1ARB_MSGVAL; + } + + // + // If the caller wants to filter on the extended ID bit then set it. + // + maskReg |= (flags & CAN_MSG_OBJ_USE_EXT_FILTER); + + // + // The caller wants to filter on the message direction field. + // + maskReg |= (flags & CAN_MSG_OBJ_USE_DIR_FILTER); + + // + // If any filtering is requested, set the UMASK bit to use mask register + // + if(((flags & CAN_MSG_OBJ_USE_ID_FILTER) | + (flags & CAN_MSG_OBJ_USE_DIR_FILTER) | + (flags & CAN_MSG_OBJ_USE_EXT_FILTER)) != 0U) + { + msgCtrl |= CAN_IF1MCTL_UMASK; + } + + // + // Set the data length for the transfers. This is applicable only for + // Tx mailboxes. For Rx mailboxes, dlc is updated on receving a frame. + // + if((msgType == CAN_MSG_OBJ_TYPE_TX) || + (msgType == CAN_MSG_OBJ_TYPE_RXTX_REMOTE)) + { + msgCtrl |= ((uint32_t)msgLen & CAN_IF1MCTL_DLC_M); + } + + // + // If this is a single transfer or the last mailbox of a FIFO, set EOB bit. + // If this is not the last entry in a FIFO, leave the EOB bit as 0. + // + if((flags & CAN_MSG_OBJ_FIFO) == 0U) + { + msgCtrl |= CAN_IF1MCTL_EOB; + } + + // + // Enable transmit interrupts if they should be enabled. + // + msgCtrl |= (flags & CAN_MSG_OBJ_TX_INT_ENABLE); + + // + // Enable receive interrupts if they should be enabled. + // + msgCtrl |= (flags & CAN_MSG_OBJ_RX_INT_ENABLE); + + // + // Set the Control, Arb, and Mask bit so that they get transferred to the + // Message object. + // + cmdMaskReg |= CAN_IF1CMD_ARB; + cmdMaskReg |= CAN_IF1CMD_CONTROL; + cmdMaskReg |= CAN_IF1CMD_MASK; + cmdMaskReg |= CAN_IF1CMD_DIR; + + // + // Write out the registers to program the message object. + // + HWREG_BP(base + CAN_O_IF1MSK) = maskReg; + HWREG_BP(base + CAN_O_IF1ARB) = arbReg; + HWREG_BP(base + CAN_O_IF1MCTL) = msgCtrl; + + // + // Transfer data to message object RAM + // + HWREG_BP(base + CAN_O_IF1CMD) = + cmdMaskReg | (objID & CAN_IF1CMD_MSG_NUM_M); +} + +//***************************************************************************** +// +// CAN_sendMessage +// +//***************************************************************************** +void +CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_16bit +// +//***************************************************************************** +void +CAN_sendMessage_16bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg_16bit(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_32bit +// +//***************************************************************************** +void +CAN_sendMessage_32bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint32_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg_32bit(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendMessage_updateDLC +// +//***************************************************************************** +void +CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + ASSERT(msgLen <= 8U); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Update to the new data length + // + msgCtrl &= ~CAN_IF1MCTL_DLC_M; + msgCtrl |= (msgLen & CAN_IF1MCTL_DLC_M); + + // + // Write out to the register to program the message object + // + HWREG_BP(base + CAN_O_IF1MCTL) = msgCtrl; + + // + // Transfer data to message object RAM + // + HWREG_BP(base + CAN_O_IF1CMD) = + (CAN_IF1CMD_CONTROL | CAN_IF1CMD_DIR | (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check provided DLC size with actual Message DLC size + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == msgLen); + + // + // Write the data out to the CAN Data registers. + // + CAN_writeDataReg(msgData, (base + CAN_O_IF1DATA), + (msgCtrl & CAN_IF1MCTL_DLC_M)); + + // + // Set Data to be transferred from IF + // + if(msgLen > 0U) + { + msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A; + } + else + { + msgCtrl = 0U; + } + + // + // Set Direction to write + // + // Set Tx Request Bit + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = (msgCtrl | (uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_sendRemoteRequestMessage +// +//***************************************************************************** +void +CAN_sendRemoteRequestMessage(uint32_t base, uint32_t objID) +{ + uint32_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID > 0U)); + + // + // Set IF command to read message object control value + // + // Set up the request for data from the message object. + // Transfer the message object to the IF register. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_CONTROL | + (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Read IF message control + // + msgCtrl = HWREGH(base + CAN_O_IF1MCTL); + + // + // Check configured DLC size with 0 as this is a remote frame + // + ASSERT((msgCtrl & CAN_IF1MCTL_DLC_M) == 0U); + + // + // Set Direction to write + // + // Set Tx Request Bit for this remote frame + // + // Transfer the message object to the message object specified by + // objID. + // + HWREG_BP(base + CAN_O_IF1CMD) = ((uint32_t)CAN_IF1CMD_DIR | + (uint32_t)CAN_IF1CMD_TXRQST | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_readMessage +// +//***************************************************************************** +bool +CAN_readMessage(uint32_t base, uint32_t objID, + uint16_t *msgData) +{ + bool status; + uint16_t msgCtrl = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID <= 32U) && (objID != 0U)); + + // + // Set the Message Data A, Data B, and control values to be read + // on request for data from the message object. + // + // Transfer the message object to the message object IF register. + // + HWREG_BP(base + CAN_O_IF2CMD) = + ((uint32_t)CAN_IF2CMD_DATA_A | (uint32_t)CAN_IF2CMD_DATA_B | + (uint32_t)CAN_IF2CMD_CONTROL | (objID & CAN_IF2CMD_MSG_NUM_M) | + (uint32_t)CAN_IF2CMD_ARB); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY) == CAN_IF2CMD_BUSY) + { + } + + // + // Read out the IF control Register. + // + msgCtrl = HWREGH(base + CAN_O_IF2MCTL); + + // + // See if there is new data available. + // + if((msgCtrl & CAN_IF2MCTL_NEWDAT) == CAN_IF2MCTL_NEWDAT) + { + // + // Read out the data from the CAN registers. + // + CAN_readDataReg(msgData, (base + CAN_O_IF2DATA), + ((uint32_t)msgCtrl & CAN_IF2MCTL_DLC_M)); + + status = true; + + // + // Now clear out the new data flag + // + HWREG_BP(base + CAN_O_IF2CMD) = ((uint32_t)CAN_IF2CMD_TXRQST | + (objID & CAN_IF2CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY) == + CAN_IF2CMD_BUSY) + { + } + } + else + { + status = false; + } + + return(status); +} + +//***************************************************************************** +// +// CAN_readMessageWithID +// +//***************************************************************************** +bool CAN_readMessageWithID(uint32_t base, + uint32_t objID, + CAN_MsgFrameType *frameType, + uint32_t *msgID, + uint16_t *msgData) +{ + bool status; + + // + // Check the pointers. + // + ASSERT(msgID != 0U); + ASSERT(frameType != 0U); + + // + //Read the message first this fills the IF2 registers + //with received message for that mailbox + // + status = CAN_readMessage(base, objID, msgData); + // + // See if there is new data available. + // + if(status) + { + if((HWREG_BP(base + CAN_O_IF2ARB) & CAN_IF2ARB_XTD) != 0U) + { + *frameType = CAN_MSG_FRAME_EXT; + *msgID = ((HWREG_BP(base + CAN_O_IF2ARB)) & CAN_IF2ARB_ID_M); + } + else + { + *frameType = CAN_MSG_FRAME_STD; + *msgID = (((HWREG_BP(base + CAN_O_IF2ARB)) & + CAN_IF2ARB_STD_ID_M) >> + CAN_IF2ARB_STD_ID_S); + } + } + + return(status); +} + +//***************************************************************************** +// +// CAN_transferMessage +// +//***************************************************************************** +void +CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID, + bool direction) +{ + uint32_t cmdMaskReg; + + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + ASSERT((interface == 1U) || (interface == 2U)); + + // + // This is always a read to the Message object as this call is setting a + // message object. + // + cmdMaskReg = + ((uint32_t)CAN_IF1CMD_DATA_A | (uint32_t)CAN_IF1CMD_DATA_B | + (uint32_t)CAN_IF1CMD_TXRQST | (uint32_t)CAN_IF1CMD_CONTROL | + (uint32_t)CAN_IF1CMD_MASK | (uint32_t)CAN_IF1CMD_ARB) | + (direction ? CAN_IF1CMD_DIR : 0U); + + // + // Ensure this IF isn't busy + // + while((HWREGH(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) & + CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Set up the request for data from the message object. Transfer the + // message object to the message object specified by objID. + // + HWREG_BP(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) = + (cmdMaskReg | (objID & CAN_IF1CMD_MSG_NUM_M)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + ((interface == 2U) ? CAN_O_IF2CMD : CAN_O_IF1CMD)) & + CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } +} + +//***************************************************************************** +// +// CAN_clearMessage +// +//***************************************************************************** +void +CAN_clearMessage(uint32_t base, uint32_t objID) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_disableMessageObject +// +//***************************************************************************** +void +CAN_disableMessageObject(uint32_t base, uint32_t objID) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((objID >= 1U) && (objID <= 32U)); + + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); +} + +//***************************************************************************** +// +// CAN_disableAllMessageObjects +// +//***************************************************************************** +void +CAN_disableAllMessageObjects(uint32_t base) +{ + uint32_t objID; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Loop to disable all valid message objects + // + for(objID = 0x01UL; objID <= 0x20UL; objID++) + { + // + // Wait for busy bit to clear + // + while((HWREGH(base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) == CAN_IF1CMD_BUSY) + { + } + + // + // Clear the message valid bit in the arbitration register. This disables + // the mailbox. + // + HWREG_BP(base + CAN_O_IF1ARB) = 0U; + + // + // Initiate programming the message object + // + HWREG_BP(base + CAN_O_IF1CMD) = + (((uint32_t)CAN_IF1CMD_DIR | (uint32_t)CAN_IF1CMD_ARB) | + (objID & CAN_IF1CMD_MSG_NUM_M)); + } +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/can.h b/gpio_driverlib_cpu1/device/driverlib/can.h new file mode 100644 index 0000000..247d1df --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/can.h @@ -0,0 +1,1924 @@ +//########################################################################### +// +// FILE: can.h +// +// TITLE: C28x CAN driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef CAN_H +#define CAN_H + + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup can_api CAN +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_can.h" +#include "debug.h" +#include "sysctl.h" + +// +// The key value for RAM initialization +// +#define CAN_RAM_INIT_KEY (0xAU) + +// +// RAM Initialization Register Mask +// +#define CAN_RAM_INIT_MASK (0x003FU) + +// +// The Parity disable key value +// +#define CAN_INIT_PARITY_DISABLE (0x1400U) + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Miscellaneous defines for Message ID Types +// +//***************************************************************************** +//***************************************************************************** +// +// These are the flags used by the flags parameter when calling +// the CAN_setupMessageObject() function. +// +//***************************************************************************** + +//! This indicates that transmit interrupts should be enabled, or are enabled. +#define CAN_MSG_OBJ_TX_INT_ENABLE CAN_IF1MCTL_TXIE + +//! This indicates that receive interrupts should be enabled, or are +//! enabled. +#define CAN_MSG_OBJ_RX_INT_ENABLE CAN_IF1MCTL_RXIE + +//! This indicates that a message object will use or is using filtering +//! based on the object's message identifier. +#define CAN_MSG_OBJ_USE_ID_FILTER (0x00000001U) + +//! This indicates that a message object will use or is using filtering +//! based on the direction of the transfer. +#define CAN_MSG_OBJ_USE_DIR_FILTER CAN_IF1MSK_MDIR + +//! This indicates that a message object will use or is using message +//! identifier filtering based on the extended identifier. +#define CAN_MSG_OBJ_USE_EXT_FILTER CAN_IF1MSK_MXTD + +//! This indicates that this message object is part of a FIFO structure and +//! not the final message object in a FIFO. +#define CAN_MSG_OBJ_FIFO (0x00000002U) + +//! This indicates that a message object has no flags set. +#define CAN_MSG_OBJ_NO_FLAGS (0x00000000U) + +//***************************************************************************** +// +// These definitions are used to specify interrupt sources to +// CAN_enableInterrupt() and CAN_disableInterrupt(). +// +//***************************************************************************** +//! This flag is used to allow a CAN controller to generate error +//! interrupts. +#define CAN_INT_ERROR (0x00000008UL) + +//! This flag is used to allow a CAN controller to generate status +//! interrupts. +#define CAN_INT_STATUS (0x00000004UL) + +//! This flag is used to allow a CAN controller to generate interrupts +//! on interrupt line 0 +#define CAN_INT_IE0 (0x00000002UL) + +//! This flag is used to allow a CAN controller to generate interrupts +//! on interrupt line 1 +#define CAN_INT_IE1 (0x00020000UL) + +//***************************************************************************** +// +// The following definitions contain all error or status indicators that can +// be returned when calling the CAN_getStatus() function. +// +//***************************************************************************** + +//! CAN controller has detected a parity error. +#define CAN_STATUS_PERR (0x00000100U) + +//! CAN controller has entered a Bus Off state. +#define CAN_STATUS_BUS_OFF (0x00000080U) + +//! CAN controller error level has reached warning level. +#define CAN_STATUS_EWARN (0x00000040U) + +//! CAN controller error level has reached error passive level. +#define CAN_STATUS_EPASS (0x00000020U) + +//! A message was received successfully since the last read of this status. +#define CAN_STATUS_RXOK (0x00000010U) + +//! A message was transmitted successfully since the last read of this +//! status. +#define CAN_STATUS_TXOK (0x00000008U) + +//! This is the mask for the last error code field. +#define CAN_STATUS_LEC_MSK (0x00000007U) + +//! There was no error. +#define CAN_STATUS_LEC_NONE (0x00000000U) + +//! A bit stuffing error has occurred. +#define CAN_STATUS_LEC_STUFF (0x00000001U) + +//! A formatting error has occurred. +#define CAN_STATUS_LEC_FORM (0x00000002U) + +//! An acknowledge error has occurred. +#define CAN_STATUS_LEC_ACK (0x00000003U) + +//! The bus remained a bit level of 1 for longer than is allowed. +#define CAN_STATUS_LEC_BIT1 (0x00000004U) + +//! The bus remained a bit level of 0 for longer than is allowed. +#define CAN_STATUS_LEC_BIT0 (0x00000005U) + +//! A CRC error has occurred. +#define CAN_STATUS_LEC_CRC (0x00000006U) + +//***************************************************************************** +// +// The following macros are added for the Global Interrupt EN/FLG/CLR +// register +// +//***************************************************************************** +//! CANINT0 global interrupt bit +#define CAN_GLOBAL_INT_CANINT0 (0x00000001U) + +//! CANINT1 global interrupt bit +#define CAN_GLOBAL_INT_CANINT1 (0x00000002U) + +//***************************************************************************** +// +// The following macros are added for accessing the interrupt register and +// the standard arbitration ID in the interface registers. +// +//***************************************************************************** +//! Status of INT0ID +#define CAN_INT_INT0ID_STATUS (0x8000U) + +//! IF1 Arbitration Standard ID Shift Offset +#define CAN_IF1ARB_STD_ID_S (18U) + +//! IF1 Arbitration Standard ID Mask +#define CAN_IF1ARB_STD_ID_M (0x1FFC0000U) + +//! IF2 Arbitration Standard ID Shift Offset +#define CAN_IF2ARB_STD_ID_S (18U) + +//! IF2 Arbitration Standard ID Mask +#define CAN_IF2ARB_STD_ID_M (0x1FFC0000U) + +#endif // DOXYGEN_PDF_IGNORE + +//***************************************************************************** +// +//! This data type is used to decide between STD_ID or EXT_ID for a mailbox. +//! This is used when calling the CAN_setupMessageObject() function. +// +//***************************************************************************** +typedef enum +{ + //! Set the message ID frame to standard. + CAN_MSG_FRAME_STD, + + //! Set the message ID frame to extended. + CAN_MSG_FRAME_EXT +} CAN_MsgFrameType; + +//***************************************************************************** +// +//! This definition is used to determine the type of message object that will +//! be set up via a call to the CAN_setupMessageObject() API. +// +//***************************************************************************** +typedef enum +{ + //! Transmit message object. + CAN_MSG_OBJ_TYPE_TX, + + //! Transmit remote request message object + CAN_MSG_OBJ_TYPE_TX_REMOTE, + + //! Receive message object. + CAN_MSG_OBJ_TYPE_RX, + + //! Remote frame receive remote, with auto-transmit message object. + CAN_MSG_OBJ_TYPE_RXTX_REMOTE +} CAN_MsgObjType; + +//***************************************************************************** +// +//! This definition is used to determine the clock source that will +//! be set up via a call to the CAN_selectClockSource() API. +// +//***************************************************************************** +typedef enum +{ + //! Peripheral System Clock Source + CAN_CLOCK_SOURCE_SYS = 0x0, + + //! External Oscillator Clock Source + CAN_CLOCK_SOURCE_XTAL = 0x1, + + //! Auxiliary Clock Input Source + CAN_CLOCK_SOURCE_AUX = 0x2 +} CAN_ClockSource; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! +//! Checks a CAN base address. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function determines if a CAN controller base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CAN_isBaseValid(uint32_t base) +{ + return( + (base == CANA_BASE) || + (base == CANB_BASE) + ); +} +#endif + + +//***************************************************************************** +// +//! \internal +//! +//! Copies data from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_writeDataReg(const uint16_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = data[idx]; + + dataReg++; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Copies data (all 16bits) from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** + +static inline void +CAN_writeDataReg_16bit(const uint16_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = (uint32_t)((data[idx / 2UL]) >> ((idx % 2UL) * 8UL)); + + dataReg++; + } +} + + +//***************************************************************************** +// +//! \internal +//! +//! Copies data (all 32bits) from a buffer to the CAN Data registers. +//! +//! \param data is a pointer to the data to be written out to the CAN +//! controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 0, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy into the CAN controller. +//! +//! This function takes the steps necessary to copy data from a contiguous +//! buffer in memory into the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** + +static inline void +CAN_writeDataReg_32bit(const uint32_t *const data, uint32_t address, + uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Check the dataReg. + // + ASSERT(dataReg != 0U); + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Write out the data 8 bits at a time. + // + HWREGB(dataReg) = ((data[idx / 4UL]) >> ((idx % 4UL) * 8UL)); + + dataReg++; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Copies data from the CAN Data registers to a buffer. +//! +//! \param data is a pointer to the location to store the data read from the +//! CAN controller's data registers. +//! \param address is a uint32_t value for the first register of the +//! CAN controller's data registers. For example, in order to use the IF1 +//! register set on CAN controller 1, the value would be: \b CANA_BASE \b + +//! \b CAN_O_IF1DATA. +//! \param size is the number of bytes to copy from the CAN controller. +//! +//! This function takes the steps necessary to copy data to a contiguous buffer +//! in memory from the non-contiguous data registers used by the CAN +//! controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_readDataReg(uint16_t *data, const uint32_t address, uint32_t size) +{ + uint32_t idx; + uint32_t dataReg = address; + + // + // Loop always copies 1 byte per iteration. + // + for(idx = 0U; idx < size; idx++) + { + // + // Read out the data + // + data[idx] = HWREGB(dataReg); + + dataReg++; + } +} + +//***************************************************************************** +// +//! Initializes the CAN controller's RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Performs the initialization of the RAM used for the CAN message objects. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_initRAM(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + HWREGH(base + CAN_O_RAM_INIT) = CAN_RAM_INIT_CAN_RAM_INIT | + CAN_RAM_INIT_KEY; + + while(!((HWREGH(base + CAN_O_RAM_INIT) & CAN_RAM_INIT_MASK) == + (CAN_RAM_INIT_RAM_INIT_DONE | CAN_RAM_INIT_KEY2 | + CAN_RAM_INIT_KEY0))) + { + // + // Wait until RAM Init is complete + // + } +} + +//***************************************************************************** +// +//! Select CAN Clock Source +//! +//! \param base is the base address of the CAN controller. +//! \param source is the clock source to use for the CAN controller. +//! +//! This function selects the specified clock source for the CAN controller. +//! +//! The \e source parameter can be any one of the following: +//! - \b CAN_CLOCK_SOURCE_SYS - Peripheral System Clock +//! - \b CAN_CLOCK_SOURCE_XTAL - External Oscillator +//! - \b CAN_CLOCK_SOURCE_AUX - Auxiliary Clock Input from GPIO +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_selectClockSource(uint32_t base, CAN_ClockSource source) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Determine the CAN controller and set specified clock source + // + EALLOW; + + switch(base) + { + case CANA_BASE: + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~SYSCTL_CLKSRCCTL2_CANABCLKSEL_M) | + ((uint16_t)source << SYSCTL_CLKSRCCTL2_CANABCLKSEL_S); + break; + + case CANB_BASE: + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~SYSCTL_CLKSRCCTL2_CANBBCLKSEL_M) | + ((uint16_t)source << SYSCTL_CLKSRCCTL2_CANBBCLKSEL_S); + break; + + default: + + // + // Do nothing. Not a valid mode value. + // + break; + } + + EDIS; + SYSCTL_CLKSRCCTL_DELAY; +} + +//***************************************************************************** +// +//! Starts the CAN Module's Operations +//! +//! \param base is the base address of the CAN controller. +//! +//! This function starts the CAN module's operations after initialization, +//! which includes the CAN protocol controller state machine of the CAN core +//! and the message handler state machine to begin controlling the CAN's +//! internal data flow. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_startModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear Init and CCE bits + // + HWREGH(base + CAN_O_CTL) &= ~(CAN_CTL_INIT | CAN_CTL_CCE); +} + +//***************************************************************************** +// +//! Enables the CAN controller. +//! +//! \param base is the base address of the CAN controller to enable. +//! +//! Enables the CAN controller for message processing. Once enabled, the +//! controller will automatically transmit any pending frames, and process any +//! received frames. The controller can be stopped by calling +//! CAN_disableController(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableController(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the init bit in the control register. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_INIT; +} + +//***************************************************************************** +// +//! Disables the CAN controller. +//! +//! \param base is the base address of the CAN controller to disable. +//! +//! Disables the CAN controller for message processing. When disabled, the +//! controller will no longer automatically process data on the CAN bus. The +//! controller can be restarted by calling CAN_enableController(). The state +//! of the CAN controller and the message objects in the controller are left as +//! they were before this call was made. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableController(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the init bit in the control register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_INIT; +} + +//***************************************************************************** +// +//! Enables the test modes of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! \param mode are the the test modes to enable. +//! +//! Enables test modes within the controller. The following valid options for +//! \e mode can be OR'ed together: +//! - \b CAN_TEST_SILENT - Silent Mode +//! - \b CAN_TEST_LBACK - Loopback Mode +//! - \b CAN_TEST_EXL - External Loopback Mode +//! +//! \note Loopback mode and external loopback mode \b can \b not be +//! enabled at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableTestMode(uint32_t base, uint16_t mode) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((mode & (CAN_TEST_LBACK | CAN_TEST_EXL)) != + (CAN_TEST_LBACK | CAN_TEST_EXL)); + + // + // Clear the bits in the test register. + // + HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT | + (uint16_t)CAN_TEST_LBACK | + (uint16_t)CAN_TEST_EXL); + + // + // Enable test mode and set the bits in the test register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_TEST; + HWREGH(base + CAN_O_TEST) |= mode; +} + +//***************************************************************************** +// +//! Disables the test modes of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables test modes within the controller and clears the test bits. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableTestMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the bits in the test register. + // + HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT | + (uint16_t)CAN_TEST_LBACK | + (uint16_t)CAN_TEST_EXL); + + // + // Clear the test mode enable bit + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_TEST; +} + +//***************************************************************************** +// +//! Get the current settings for the CAN controller bit timing. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function reads the current configuration of the CAN controller bit +//! clock timing. +//! +//! \return Returns the value of the bit timing register. +// +//***************************************************************************** +static inline uint32_t +CAN_getBitTiming(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read and return BTR register + // + return(HWREG_BP(base + CAN_O_BTR)); +} + +//***************************************************************************** +// +//! Enables direct access to the RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables direct access to the RAM while in Test mode. +//! +//! \note Test Mode must first be enabled to use this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableMemoryAccessMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the RAM direct access bit + // + HWREGH(base + CAN_O_TEST) |= CAN_TEST_RDA; +} + +//***************************************************************************** +// +//! Disables direct access to the RAM. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables direct access to the RAM while in Test mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableMemoryAccessMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the RAM direct access bit + // + HWREGH(base + CAN_O_TEST) &= ~CAN_TEST_RDA; +} + +//***************************************************************************** +// +//! Sets the interruption debug mode of the CAN controller. +//! +//! \param base is the base address of the CAN controller. +//! \param enable is a flag to enable or disable the interruption debug mode. +//! +//! This function sets the interruption debug mode of the CAN controller. When +//! the \e enable parameter is \b true, CAN will be configured to interrupt any +//! transmission or reception and enter debug mode immediately after it is +//! requested. When \b false, CAN will wait for a started transmission or +//! reception to be completed before entering debug mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setInterruptionDebugMode(uint32_t base, bool enable) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + if(enable) + { + // + // Enable interrupt debug support + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_IDS; + } + else + { + // + // Disable interrupt debug support + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_IDS; + } +} + + +//***************************************************************************** +// +//! Disables Auto-Bus-On. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables the Auto-Bus-On feature of the CAN controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableAutoBusOn(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clear the ABO bit in the control register. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_ABO; +} + +//***************************************************************************** +// +//! Enables Auto-Bus-On. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables the Auto-Bus-On feature of the CAN controller. Be sure to also +//! configure the Auto-Bus-On time using the CAN_setAutoBusOnTime function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableAutoBusOn(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the ABO bit in the control register. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_ABO; +} + +//***************************************************************************** +// +//! Sets the time before a Bus-Off recovery sequence is started. +//! +//! \param base is the base address of the CAN controller. +//! \param onTime is number of clock cycles before a Bus-Off recovery sequence +//! is started. +//! +//! This function sets the number of clock cycles before a Bus-Off recovery +//! sequence is started by clearing the Init bit. +//! +//! \note To enable this functionality, use CAN_enableAutoBusOn(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setAutoBusOnTime(uint32_t base, uint32_t onTime) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set bus-off timer value + // + HWREG_BP(base + CAN_O_ABOTR) = onTime; +} + +//***************************************************************************** +// +//! Enables individual CAN controller interrupt sources. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables specific interrupt sources of the CAN controller. Only enabled +//! sources will cause a processor interrupt. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_INT_ERROR - a controller error condition has occurred +//! - \b CAN_INT_STATUS - a message transfer has completed, or a bus error has +//! been detected +//! - \b CAN_INT_IE0 - allow CAN controller to generate interrupts on interrupt +//! line 0 +//! - \b CAN_INT_IE1 - allow CAN controller to generate interrupts on interrupt +//! line 1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 | + CAN_INT_IE1)) == 0U); + + // + // Enable the specified interrupts. + // + HWREG_BP(base + CAN_O_CTL) |= intFlags; +} + +//***************************************************************************** +// +//! Disables individual CAN controller interrupt sources. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the specified CAN controller interrupt sources. Only enabled +//! interrupt sources can cause a processor interrupt. +//! +//! The \e intFlags parameter has the same definition as in the +//! CAN_enableInterrupt() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 | + CAN_INT_IE1)) == 0U); + + // + // Disable the specified interrupts. + // + HWREG_BP(base + CAN_O_CTL) &= ~(intFlags); +} + +//***************************************************************************** +// +//! Get the CAN controller Interrupt Line set for each mailbox +//! +//! \param base is the base address of the CAN controller. +//! +//! Gets which interrupt line each message object should assert when an +//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits +//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that +//! are asserted indicate the message object should generate an interrupt on +//! interrupt line 1, while bits that are not asserted indicate the message +//! object should generate an interrupt on line 0. +//! +//! \return Returns the value of the interrupt muxing register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptMux(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Get the interrupt muxing for the CAN peripheral + // + return(HWREG_BP(base + CAN_O_IP_MUX21)); +} + +//***************************************************************************** +// +//! Set the CAN controller Interrupt Line for each mailbox +//! +//! \param base is the base address of the CAN controller. +//! \param mux bit packed representation of which message objects should +//! generate an interrupt on a given interrupt line. +//! +//! Selects which interrupt line each message object should assert when an +//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits +//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that +//! are asserted indicate the message object should generate an interrupt on +//! interrupt line 1, while bits that are not asserted indicate the message +//! object should generate an interrupt on line 0. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_setInterruptMux(uint32_t base, uint32_t mux) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Set the interrupt muxing for the CAN peripheral + // + HWREG_BP(base + CAN_O_IP_MUX21) = mux; +} + +//***************************************************************************** +// +//! Enables the CAN controller automatic retransmission behavior. +//! +//! \param base is the base address of the CAN controller. +//! +//! Enables the automatic retransmission of messages with detected errors. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableRetry(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Clearing the DAR bit tells the controller to not disable the + // auto-retry of messages which were not transmitted or received + // correctly. + // + HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_DAR; +} + +//***************************************************************************** +// +//! Disables the CAN controller automatic retransmission behavior. +//! +//! \param base is the base address of the CAN controller. +//! +//! Disables the automatic retransmission of messages with detected errors. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableRetry(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Setting the DAR bit tells the controller to disable the auto-retry + // of messages which were not transmitted or received correctly. + // + HWREGH(base + CAN_O_CTL) |= CAN_CTL_DAR; +} + +//***************************************************************************** +// +//! Returns the current setting for automatic retransmission. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the current setting for the automatic retransmission in the CAN +//! controller and returns it to the caller. +//! +//! \return Returns \b true if automatic retransmission is enabled, \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +CAN_isRetryEnabled(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read the disable automatic retry setting from the CAN controller. + // + return((bool)((HWREGH(base + CAN_O_CTL) & CAN_CTL_DAR) != CAN_CTL_DAR)); +} + +//***************************************************************************** +// +//! Reads the CAN controller error counter register. +//! +//! \param base is the base address of the CAN controller. +//! \param rxCount is a pointer to storage for the receive error counter. +//! \param txCount is a pointer to storage for the transmit error counter. +//! +//! Reads the error counter register and returns the transmit and receive error +//! counts to the caller along with a flag indicating if the controller receive +//! counter has reached the error passive limit. The values of the receive and +//! transmit error counters are returned through the pointers provided as +//! parameters. +//! +//! After this call, \e rxCount will hold the current receive error count +//! and \e txCount will hold the current transmit error count. +//! +//! \return Returns \b true if the receive error count has reached the error +//! passive limit, and \b false if the error count is below the error passive +//! limit. +// +//***************************************************************************** +static inline bool +CAN_getErrorCount(uint32_t base, uint32_t *rxCount, uint32_t *txCount) +{ + uint32_t canError = 0U; + + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read the current count of transmit/receive errors. + // + canError = HWREG_BP(base + CAN_O_ERRC); + + // + // Extract the error numbers from the register value. + // + *rxCount = (canError & CAN_ERRC_REC_M) >> CAN_ERRC_REC_S; + *txCount = (canError & CAN_ERRC_TEC_M) >> CAN_ERRC_TEC_S; + + return((bool)((canError & CAN_ERRC_RP) != 0U)); +} + +//***************************************************************************** +// +//! Reads the CAN controller error and status register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the error and status register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint16_t +CAN_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return error and status register value + // + return(HWREGH(base + CAN_O_ES)); +} + +//***************************************************************************** +// +//! Reads the CAN controller TX request register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the TX request register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getTxRequests(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return Tx requests register value + // + return(HWREG_BP(base + CAN_O_TXRQ_21)); +} + +//***************************************************************************** +// +//! Reads the CAN controller new data status register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the new data status register of the CAN controller for all message +//! objects. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getNewDataFlags(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return new data register value + // + return(HWREG_BP(base + CAN_O_NDAT_21)); +} + +//***************************************************************************** +// +//! Reads the CAN controller valid message object register. +//! +//! \param base is the base address of the CAN controller. +//! +//! Reads the valid message object register of the CAN controller. +//! +//! \return Returns the value of the register. +// +//***************************************************************************** +static inline uint32_t +CAN_getValidMessageObjects(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Return the valid message register value + // + return(HWREG_BP(base + CAN_O_MVAL_21)); +} + +//***************************************************************************** +// +//! Get the CAN controller interrupt cause. +//! +//! \param base is the base address of the CAN controller. +//! +//! This function returns the value of the interrupt register that indicates +//! the cause of the interrupt. +//! +//! \return Returns the value of the interrupt register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptCause(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read interrupt identifier status + // + return(HWREG_BP(base + CAN_O_INT)); +} + +//***************************************************************************** +// +//! Get the CAN controller pending interrupt message source. +//! +//! \param base is the base address of the CAN controller. +//! +//! Returns the value of the pending interrupts register that indicates +//! which messages are the source of pending interrupts. +//! +//! \return Returns the value of the pending interrupts register. +// +//***************************************************************************** +static inline uint32_t +CAN_getInterruptMessageSource(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + + // + // Read message object interrupt status + // + return(HWREG_BP(base + CAN_O_IPEN_21)); +} + +//***************************************************************************** +// +//! CAN Global interrupt Enable function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables specific CAN interrupt in the global interrupt enable register +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt Enable bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt Enable bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_enableGlobalInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Enable the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_EN) |= intFlags; +} + +//***************************************************************************** +// +//! CAN Global interrupt Disable function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the specific CAN interrupt in the global interrupt enable register +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_disableGlobalInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Disable the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_EN) &= ~intFlags; +} + +//***************************************************************************** +// +//! CAN Global interrupt Clear function. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be cleared. +//! +//! Clear the specific CAN interrupt bit in the global interrupt flag register. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return None. +// +//***************************************************************************** +static inline void +CAN_clearGlobalInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Clear the requested interrupts + // + HWREGH(base + CAN_O_GLB_INT_CLR) |= intFlags; +} + +//***************************************************************************** +// +//! Get the CAN Global Interrupt status. +//! +//! \param base is the base address of the CAN controller. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Check if any interrupt bit is set in the global interrupt flag register. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0 +//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1 +//! +//! \return True if any of the requested interrupt bits are set. False, if +//! none of the requested bits are set. +// +//***************************************************************************** +static inline bool +CAN_getGlobalInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(CAN_isBaseValid(base)); + ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 | + CAN_GLOBAL_INT_CANINT1)) == 0U); + + // + // Read and return the global interrupt flag register + // + return((bool)((HWREGH(base + CAN_O_GLB_INT_FLG) & intFlags) != 0U)); +} + +//***************************************************************************** +// +//! Initializes the CAN controller +//! +//! \param base is the base address of the CAN controller. +//! +//! This function initializes the message RAM, which also clears all the +//! message objects, and places the CAN controller in an init state. Write +//! access to the configuration registers is available as a result, allowing +//! the bit timing and message objects to be setup. +//! +//! \note To exit the initialization mode and start the CAN module, use the +//! CAN_startModule() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_initModule(uint32_t base); + +//***************************************************************************** +// +//! Sets the CAN Bit Timing based on requested Bit Rate. +//! +//! \param base is the base address of the CAN controller. +//! \param clockFreq is the CAN module clock frequency before the bit rate +//! prescaler (Hertz) +//! \param bitRate is the desired bit rate (bits/sec) +//! \param bitTime is the number of time quanta per bit required for desired +//! bit time (Tq) and must be in the range from 8 to 25 +//! +//! This function sets the CAN bit timing values for the bit rate passed in the +//! \e bitRate and \e bitTime parameters based on the \e clockFreq parameter. The +//! CAN bit clock is calculated to be an average timing value that should work +//! for most systems. If tighter timing requirements are needed, then the +//! CAN_setBitTiming() function is available for full customization of all of +//! the CAN bit timing values. +//! +//! \note Not all bit-rate and bit-time combinations are valid. +//! For combinations that would yield the correct bit-rate, +//! refer to the DCAN_CANBTR_values.xlsx file in the "docs" directory. +//! The CANBTR register values calculated by the function CAN_setBitRate +//! may not be suitable for your network parameters. If this is the case +//! and you have computed the correct values for your network, you could +//! directly write those parameters in CANBTR register using the +//! function CAN_setBitTiming. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate, + uint16_t bitTime); + +//***************************************************************************** +// +//! Manually set the CAN controller bit timing. +//! +//! \param base is the base address of the CAN controller. +//! \param prescaler is the baud rate prescaler +//! \param prescalerExtension is the baud rate prescaler extension +//! \param tSeg1 is the time segment 1 +//! \param tSeg2 is the time segment 2 +//! \param sjw is the synchronization jump width +//! +//! This function sets the various timing parameters for the CAN bus bit +//! timing: baud rate prescaler, prescaler extension, time segment 1, +//! time segment 2, and the Synchronization Jump Width. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setBitTiming(uint32_t base, uint16_t prescaler, + uint16_t prescalerExtension, uint16_t tSeg1, uint16_t tSeg2, + uint16_t sjw); + + +//***************************************************************************** +// +//! Clears a CAN interrupt source. +//! +//! \param base is the base address of the CAN controller. +//! \param intClr is a value indicating which interrupt source to clear. +//! +//! This function can be used to clear a specific interrupt source. The +//! \e intClr parameter should be either a number from 1 to 32 to clear a +//! specific message object interrupt or can be the following: +//! - \b CAN_INT_INT0ID_STATUS - Clears a status interrupt. +//! +//! It is not necessary to use this function to clear an interrupt. This +//! should only be used if the application wants to clear an interrupt source +//! without taking the normal interrupt action. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_clearInterruptStatus(uint32_t base, uint32_t intClr); + +//***************************************************************************** +// +//! Setup a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to configure (1-32). +//! \param msgID is the CAN message identifier used for the 11 or 29 bit +//! identifiers +//! \param frame is the CAN ID frame type +//! \param msgType is the message object type +//! \param msgIDMask is the CAN message identifier mask used when identifier +//! filtering is enabled +//! \param flags is the various flags and settings to be set for the message +//! object +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! +//! This function sets the various values required for a message object. +//! +//! The \e frame parameter can be one of the following values: +//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier +//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier +//! +//! The \e msgType parameter can be one of the following values: +//! - \b CAN_MSG_OBJ_TYPE_TX - Transmit Message +//! - \b CAN_MSG_OBJ_TYPE_TX_REMOTE - Transmit Remote Message +//! - \b CAN_MSG_OBJ_TYPE_RX - Receive Message +//! - \b CAN_MSG_OBJ_TYPE_RXTX_REMOTE - Receive Remote message with +//! auto-transmit +//! +//! The \e flags parameter can be set as \b CAN_MSG_OBJ_NO_FLAGS if no flags +//! are required or the parameter can be a logical OR of any of the following +//! values: +//! - \b CAN_MSG_OBJ_TX_INT_ENABLE - Enable Transmit Interrupts +//! - \b CAN_MSG_OBJ_RX_INT_ENABLE - Enable Receive Interrupts +//! - \b CAN_MSG_OBJ_USE_ID_FILTER - Use filtering based on the Message ID +//! (Standard or Extended) +//! - \b CAN_MSG_OBJ_USE_EXT_FILTER - Use Extended Identifier Bit for filtering +//! (Only among Extended IDs will be accepted) +//! - \b CAN_MSG_OBJ_USE_DIR_FILTER - Use filtering based on the direction of +//! the transfer +//! - \b CAN_MSG_OBJ_FIFO - Message object is part of a FIFO +//! structure and isn't the final message +//! object in FIFO +//! +//! If filtering is based on message identifier (for Standard or Extended IDs) +//! specified by the \e msgIDMask parameter, the value \b CAN_MSG_OBJ_USE_ID_FILTER +//! has to be logically ORed with the \e flag parameter. +//! If \b CAN_MSG_OBJ_USE_EXT_FILTER is ORed with the \e flag parameter, +//! only extended identifier frames are accepted which can further be masked +//! by using the flag above. +//! +//! \note The \b msgLen Parameter for the Receive Message Object is a "don't +//! care" but its value should be between 0-8 due to the assert. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID, + CAN_MsgFrameType frame, CAN_MsgObjType msgType, + uint32_t msgIDMask, uint32_t flags, uint16_t msgLen); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data (all 16 bits are sent) +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_16bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data (all 32 bits are sent) +//! +//! This function is used to transmit a message object and the message data, +//! if applicable. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_32bit(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint32_t *msgData); + +//***************************************************************************** +// +//! Sends a Message Object while dynamically updating data length +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! \param msgLen is the number of bytes of data in the message object (0-8) +//! \param msgData is a pointer to the message object's data +//! +//! This function is used to transmit a message object and the message data, +//! if applicable and can be used to dynamically update the data length +//! for every subsequent call of this function. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return None. +// +//***************************************************************************** + +extern void +CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen, + const uint16_t *msgData); + +//***************************************************************************** +// +//! Sends a Remote Request Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to configure (1-32). +//! +//! This function is used to transmit a remote request message object. +//! +//! \note The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function with CAN_MSG_OBJ_TYPE_TX_REMOTE +//! as msgType flag. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_sendRemoteRequestMessage(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Reads the data in a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to read (1-32). +//! \param msgData is a pointer to the array to store the message data +//! +//! This function is used to read the data contents of the specified message +//! object in the CAN controller. The data returned is stored in the +//! \e msgData parameter. +//! +//! \note +//! -# The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! -# If the DLC of the received message is larger than the \e msgData +//! buffer provided, then it is possible for a buffer overflow to occur. +//! +//! \return Returns \b true if new data was retrieved, else returns +//! \b false to indicate no new data was retrieved. +// +//***************************************************************************** +extern bool +CAN_readMessage(uint32_t base, uint32_t objID, + uint16_t *msgData); + +//***************************************************************************** +// +//! Reads the data and Message ID in a Message Object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the object number to read (1-32). +//! \param frameType is a pointer to the CAN_MsgFrameType to store the message +//! type that has been received in the mailbox +//! The \e frameType parameter shall be filled as of the following values: +//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier +//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier +//! This parameter is filled when return value is true for this function. +//! \param msgID is a pointer to storage for the received Message ID +//! Filled when the return value is true for this function. +//! \param msgData is a pointer to the array to store the message data +//! Filled with read Data when the return value is true for this function. +//! +//! This function is used to read the data contents and the Message ID +//! of the specified message object in the CAN controller.The Message ID returned +//! is stored in the \e msgID parameter and its type in \e frameType parameter. +//! The data returned is stored in the \e msgData parameter. +//! +//! \note +//! -# The message object requested by the \e objID must first be setup +//! using the CAN_setupMessageObject() function. +//! +//! \return Returns \b true if new data was retrieved, else returns +//! \b false to indicate no new data was retrieved. +// +//***************************************************************************** +extern bool CAN_readMessageWithID(uint32_t base, + uint32_t objID, + CAN_MsgFrameType *frameType, + uint32_t *msgID, + uint16_t *msgData); + + + +//***************************************************************************** +// +//! Transfers a CAN message between the IF registers and Message RAM. +//! +//! \param base is the base address of the CAN controller. +//! \param interface is the interface to use for the transfer. Valid value are +//! 1 or 2. +//! \param objID is the object number to transfer (1-32). +//! \param direction is the direction of data transfer. False is Message RAM +//! to IF, True is IF to Message RAM. +//! +//! This function transfers the contents of the interface registers to message +//! RAM or vice versa depending on the value passed to direction. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID, + bool direction); + +//***************************************************************************** +// +//! Clears a message object so that it is no longer used. +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to disable (1-32). +//! +//! This function frees(disables) the specified message object from use. Once +//! a message object has been cleared, it will no longer automatically send or +//! receive messages, or generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_clearMessage(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Disables specific message object +//! +//! \param base is the base address of the CAN controller. +//! \param objID is the message object number to disable (1-32). +//! +//! This function disables the specific message object. Once the message object +//! has been disabled it will be ignored by the message handler until it +//! is configured again. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_disableMessageObject(uint32_t base, uint32_t objID); + +//***************************************************************************** +// +//! Disables all message objects +//! +//! \param base is the base address of the CAN controller. +//! +//! This function disables all message objects. Once a message object +//! has been disabled it will be ignored by the message handler until it +//! is configured again. All message objects are disabled automatically on +//! reset, however this function can be used to restart CAN operations +//! without an external reset. +//! +//! \return None. +// +//***************************************************************************** +extern void +CAN_disableAllMessageObjects(uint32_t base); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // #ifdef __TMS320C28XX__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CAN_H diff --git a/gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib.lib b/gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..62fb82036e184869d2ec9cad6588082d84765bf4 GIT binary patch literal 698 zcma)4%}T>S5T4yuEm6diJqfAwpdOkuX`3FTP{BZ;=%x20+a`1&T1nF4%_1K45qt%o zL3{|G$Jw;2TNLWR?0oZ+nQw;F&ck#x>1l?cuZgL6ORT=S-tNePKpUrg9;FFq{%9J< z4Fp2@Z9FxUTof|Co-@=T*skd~wrM%0jd69FENj}W)zCou00N)AH+~0F7UZ>nWf?$w zhUzN5ga-&JsQpuXh8~b(v|Ifwi*8sFrBJDAJ9~6N=_932l)h7Xhy`^vuFA_Ha3H2_e{bDFj|{ryqGa!hBY literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib_coff.lib b/gpio_driverlib_cpu1/device/driverlib/ccs/Debug/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..04638f4ef8ef77f89abeb07d7c29154772f7d6a5 GIT binary patch literal 575952 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
    F;h|iQXD`FI0;@0` zag^cDGW>Oh|Bhig!{jfuJcPf4d?$H+2yEo}XP3tjzhU_6c^=Qt8K#>@jNelju3~s2 z!`m4iWB35WcQO1J!*rK}iR%T1UuJk-fyYzL@OEI8c1Mgbd@aK_G5j%x?`N0}DEWxa zL&6`{dH4vhk?kukk0YLC_+F@I8lI;Z{u#ps__@E~S;BA?!wn2?WjM+3tqecT@Q;C& z{Eql%hOK!Xy^P`08D7J16T_D>OebC3rSpgIUQ1fS5nz+9gv;ZIafYv$@9~T>d;`OO z39Q0*#6t{!p5ZSuOlKS1t>qznM3)!c^JnDwh0EiJUo!knoc>{We#-Fg87{%EY7NgB z4A(Mz1;Yu3Z)EsG41b#8Z!r7|hUs8B6Yoh3uLD-;#oY!BZ)JFh;RM5U7Qx4KUJ*V; z=hYOjiR*yNgL_;U9&tRL>li-7@cj&bf#L5l{4Wd_mU&@f`&G;4i1QiV#PC}f9%lGP zh7T}IziB_J(@WUg#qxe&liqt>9!EUL@GUrn!|)to_;U<@o8f~Q_&u57Duz3N zm29|&gWJ2lHqa0 ze1=~EHavycP&4>6hSxFN#&9pgZ)f;sh93r2vN_@@hQGz|iwwWa@O)?l8NcNW)6Zoe z)afPsfF&*A#lS}X3tb*ZT*B~5OlS?yB@A~mJjC#RU=^1mKFIJr41b2<&ofNF(|lOV zN%*H)&ZmKm3_oyr9PvEEKVdvyz+~L;e}~~;G917J-SC{ua23O?3=aY;*&MN(;R6hR zgyD}dOuuOSgiaUXdAhzm0BmG<+U0S?F^0dvcs_}vI1K++82)>P|Bc~N{Kn4kpULpW z3}4Rh2*d9LRx&%{5X1K~{0WBX_k5q!X(U{s)A-lGMuu;?JdXG~hCh9p$MbcDf5EU7 z@_0^WxSHWG!y^p84_L|Oh`(g`A%;KC@Ru2W7Wh+wj1?w4Y)MP_YrrO5{{XCb9Pu-T zzr57r`98zHVz_9T=l4{G&ttfTVftOvr=xz4x!mP(#9J6{IGyn@d^N*= z2CTxzJxmNAW%xmc>9<3l(ee-;x1=TfD6o;|J1&nSzR&QNmwP$2>!xu4p8N)jmeh09U#}V&jn10dl7g|ojM$SJ6HZpw7<#EKl z3?Dql4kF^u#(3S=P^tg{U6kF5`MSN&o#hC&K8%)5p4{g zbFRm83By|$9%T4hhHqy02*Zy8D|sA2TI{!L*$7{#W&0ekxnJ#Bmk0M9GJNlOo@|dZ z{2Z_f(-Hr~@UI!h@>+aO#v7IAp8s6q*GsqIPqi;~Z(pV`IZrN&w*c70TLP?Pj>`MB zeg->K$mQJ=Cj25$O!!!?xqcTgI;K=E9Yc`IkFM0EzZLi+_@nS?kIjV7(@t?2*{~#X z!zpLk`pYc%HnY^O>H-0g#bLl)!FpRkLO^m;d(Yt|F-{`Lce~frlU-!q4 zSM^=liT5DO=V_MDcd&d80-N&XZH@BWlrNT9Zu#=Ib}^&ZGJf8^s7{)?F^}=^I(!nN zHvy}Da_+umuDVUKJ&eE9HvW2L2q6R`Gw(xq+vNQQg>UkT`U>Nh(rD<}_PYXcsd7C2 z9ioay-65*l+VSrYRXpkrQPoDQa1Y|5z7HnckB1qv27wiix_*XFgb6p-s z)B@kF`3W2TM#kUb@;G8U@W(ViVZ%?~hK&6EE|0n!^{D2jyHO24tyc{HK48V;h+BZ~ z)%=7FKi&Oe_-U@Kc(BI{e81)=Z1^8x{ExXjSW^Q(sQC#S{;xBB`c|cQFb4)!ZQlwL zHvBI!{(p9PaQ8485ljeuxamvmusHKUAiNF3~bssVVVoVgkNy!j(8Q=v}?lkn#V$3nYK)2 z^btw7!h~xzPlHQ$#6DotehIJBJU6&>M?4B_+ALv}UJ?GZOLs(jz-y<38+ABgm+px7 z1Dm!<*znxq(jD=)z@|MCHay>T>5e!#$7_Rxcj&lIb?J_H2e4^(gx71H>s>n11#H?H z;a1J_X_xMZSzyz?2%G$|G2t+6YAvv7Q-n=i8(g|0hJimN!?(hOSLwJCF5MBg0h_i% z*zkPFrQ@D*VAEa*U#P?Rs!R8`5n8i+Uh=4WolSe8xktYCOW3rRMZl)L5H>s>UES+! z+DnM>5LR?`ud}KrY8*G=tN@Rqt9zZzSXs%!A*|?*yp!6rmko@Eu%cs30XFT0u!+l~ zJE8@2(_RQ09*^!wod?ri!iR+5;75dBdm(J%^5_`vKsW7$u;KCOXyc%pF^jO_@#v1&54veDgbj~Jcf>)^O?x41 zcs#ngL*2BOTNw{w(_ZcbHtmJ53CE*5;t1%by%07$9vx#b=%&38Has5Pkq2^`_VO6x zA*|@Uy_mZp;V5s~qIWKC;q~qgFOd{;FF1_?WiACkETsobp6jayHd--wcZaWmjbimE zYheqy6aYcK$k08(Dt795C>-xz@b$1!>>gzUY-hO?0C{&dz3DDt70&svQ8?Z`+;rnO zg~KRSLacNt0HTi`FokY7RY-h+q?p{Og3u?s6ylzs2TYOY3yG)L)ot1GMs_5ga)VKj z)FM#kVTVKKJd#=p%6yN4q%QDNkT6=cdpvY2`Eox6>AJvAK`JitQ;-T;*|TsUbDN(6 znQ3KN?8;LOnMoc-fy|T}i~^bQ`GHd)Gwo7%Jaj8L_4|whnW^j<1u|3ql(@0iKxT@a zQ6Mwr2BSdcWqt~Rg#erfGB^4ukhubsQZFuep>%naHISL+D2xJ`SNJKA`D{N0GD9Tp z3o?^DEF3V@`YDjP!B2tAEq)4Q-r}bq*eiXMwUBw(Pl3$4{1nLiK|cjD(@5hXYSqGVW z{1nJc@|3yqtb@!X52HY4l7~?sGs(j!keTFR6v#~Sc$D>!ndD&<$lT+nAP|zL+?8iN zWF~nS1u~O7i~^ZS9!7!8BoCuNW|D_dAT!CsD3H0wN7(?GNuCNfrIbUq|Q!o(Hn0vC9 z_UbBG!#SlI`RC`Uk-s$JJZoe)i&;2pWjLI&PKLuN>t#5cvO$J(3Jd3a^boXycS{EY zAu66nY3^*JGNx9ic|fU_ZCO$H4b(RH`0d8hBOd(L>A+k(?563QId~|%>*xWKi@$)i zK;qQLt(uT0d6wZxlKIU;+Dfz6fJJpHo#$(shvr)Wi}n@Ld0x^yw2K?CPSH01%j5~o z9s(Bi1(XYZV{Un-8WXUnj|=)4V51#9GBgJYSTQ{H+?$BnnA@DG?+94^coMhYm>Zm_ z=L%TOc&5i?Zf!1=Jm1HYa?@|jP0bF-0V|0o<$~Xs+nK4J&Ba4IbY!S^n~TTX!c2W@ zzG_C}!9e7er@*8u*GPTTr)qrPu{`Bgqut@SyIO%bj zo0O@K4p``{GlXMqPnNY}4jyx3GSw~>PI~<@wBii89D-B8dKyof;rh)Ios5N8r`R$S%16Ih zt$Ao>rFf{G`Ax0np;@=$Y4$U~woUU;zp8ksJp5)@^Uy41uDEW{JjJfe)W-bg1Dc2W z)w$yOgyx|ctm2_I<~KM)KpN`9=L+X1nuk_xiic`|-@L4OXuhF%sBQR7Id!@)wEj{& zF-2g{(=`u`?~12^xhi;p=AqG3@uZh&hvuQ#sp3g5(;b?J=30t}+PvRfr+EaGg><^f zN1+|XuGXq}byNMNRqf6CcsX`iY5Mu5X%u~)W;$J+-ze$)*n3GZN7%{1@d8C+(K0eW z+EdIy*CNd2ssv%KTpUKuBovO?Yftn~4##=i?ABH0T~YPTl#HJ7EzR}9=yFESc)WJHd;0Ou ztKxl$(ea53R*g?2heii5!HV}z4n&8CMp2Lo4~_0f7#!>EO~$8OTQW8}5Fb~qfu~f~ zQwDNj$C;ZLnH+?W5va_K^KTUTTq!f1cSLN?(; z9(k>>w6jdmju+%QklJkpGHfb}91m-pQfi{#CIFlwa@U1WH2}o4VYu zux~iF3MXH$4rx=hetk`4_4>-nnoy`x()cqJT66w7xRB{7dL^VD*+=v(FhxJCcxjMPlZLO)^I?}&x3NdatbEVpVEPtfd!|WxwGzb8ULNY zQSkpPl^=97OK)WScL2}QBt6A&`6J9N1bjQvdJ;{xVa$xw@Ym52rmIz0%gC{Ad^|qV zOLrsZpH!GP&)#R-*W;8|+kVov??uk32|-RETjxWd`u35O!p>FZ%p^Y`6hSd!#SB4rA{qceLXlTpm(5}!_b@i%stEyJDb#=mFY7X@i=py+pD zm7!&bv~Jwk6p40rGcnQh{$MbjHHa#)ZJx7_Net$ zMsh~07I`W)j8-G^(`ai%K^l!>DNLm{REeTA8uqBtXfxq0$8hHbeSEiBAC-S*z0FggmkC|%qjw>QO3|1`s}fCVv})1pqqS4H)rpOMVnh;K{6ylc7p;CGan_4X zK4MctU08~LX&PBd-HRCvd|g|H{f|yM81Zb ziFc%to}-;x+wn?-@w5+yI=bb1X}E4<6TI68m({g*G&T|1+*H@r)^Rz((^2q}Z+UBT zga~J}Hp%yy-DGPEcQ$Ql?0{JI!S?PB60)l+$M?6>t0C%1EV@V|AoT zzH1`Y^1VJ%Bi|QB*2woIk+t&O5LqYR8zbxGdsC#If?3ho)r?@TZVqp0soO@B4p5>k zmp8U{i@XOg6Qo%NmgrroUUnuXlYMbHbE63}Zr;k|oUJ*XoHbTu?P5$B{N?f{wh3=u zMYFmnv)k5XSd_^|N|UXqvE<|I{_$jAXMC70a5)W4BkEb-nF~_NKQiBv>)$f zQ?qvcfyVPL?A|gv^W?G5H=b92p#FyD;tRWHo;mi_FD_X;MMrxsN06kR`g)E=qj_%81jINAXNgn(ILFz!%L(texhfpM6n`XG(6=ubjGcGvXF==iV#UyLd}Zd&oTTiR9wSD z$FUfE4#NfbenKC%P>x~3cf&tSxDeQ=FrV)7IN~gZOCXFJCc{k(#~8kr;oBHK0<2_E zs*6UR6%a&kV~1&xZRDv0HvE7(7wzyhF5Qy&baF&m_TiCCQrM%b z6}Ks|S7&jAkB}-@_5ZQ3vDq3EZS%>n=2kqqlT1o0gL*CbYr$JP;tN$ z!jnSuo0zszj;U>azubr5jxGHDZB5-9N3n%(c1JS}OaH}P&`d$S_WoS&>)M~Isyu(g zT6cdA`smo7`@wP{E|$qR`*YK(2};^Ic+%-rsm4@MUbzepol=!*LYlxUn&HXBUu*bT zr8E4Q-uoD_oXLL``YsCpCHk-llTa^NNvZOYX;m-zq;H$gl`(>bp<0jD<3XuaQc7(t z#c=*T%xx9$x!@0l6pf6Msk3-G%1b}N4gWY|8+%IhT% z@54v&F&)0{eg)s}%wzmN0>1SmA)Z{OLZk2LWK8`etbdtLP@D<=Df$qeVmLqj^23-g zz#XVNPoJ(Rh)Np6Uw1aFC$!(W12s|QR!%T$GuPh#efypB=|?u+eZ7{&zF!2sU?WpI z@DSFYfz2wwN;%rlh1HTU5W9~CV$+fKO2Lts9L0^ttj1d|tMR5~HC}RA?YPToP}s7%@LbHksj}l6?T(=VUFF*nvHteh zMBkw7#b|V)#r2#_S?#DQvv%YCF!h6%SyQ-aus1dy7t}1G64}=FKGpbf%RF@%$R61j zsC(=uu!YpG*d@Zps^kb|SCt}a4Dy(S)r?#%im`}Ji4UaRUJNM_mdUK=m;TZKVU@8S zjwY=jP!UNTjaKTnB#ItQ=QB%OXqZEc-gRZodb$#_5vRX&CX19*^dsk3D2~wDkE={EFeNTtznRvIjBT#1@bbJrhY0jWzA9!S zXSX2UJ7+eLq7McCgQFvXVPJnN#@>R znNP+-mC<0IL%D3oV%`weag<>x!!czTE$%Z7)mhD~-)1?pY<7jPSEDck+LJMx;IL~d zHaw{(T?%Gs;pxpdZ4hH~pP}(OUOQz`@bQjz7_9R1=!vau+^&Ut-YV&C;`)-}81S0< zl0tfKs4vN-_eJ$-_Y{+_OKkDDfFFC%dh}yA+cE3$!_(=vgZ(>hxD@g()Mj?$=I>qV zvZ-d=Cup;qJe$@fP}c^Aa1UKNqti-@qMlKZz}#qPyD;sc=t}}ofe6O$r-3`{!eDBt`Tb^ntB=_G8(v57zI&bK9vYb~NkC@xg zRCpsYyn31D#sf3ROA(Ma$34|}!{1WQx;EUOD)CQdX5bc@&6T#7VapuyjWT3}CvW3z zykREyi>N8c4ctpdw!ei9xvXtJfem@1Z7(nRQ@l%U7{9UmQ@u+~$=-)XjVn`I|=)Zaj zPQQ~*@-m&0a~^&4n?dUwpKp2N4tDoxPnTQ~2WR+WUcqDT zuSvfPhh4yPyt{DN1w1CK^jmu7r`&~8?E4a3qP|3zn!9iu?~`;HeUf(X!YSt;sM}Ci zXga_@3sQR~Lv5D~wNozoMGD5I!nty_&r*NJ-{aX_qsedGmBxmC&uvH!0>GhKg{qqfK^048N7(K8C6LQ2C?IFkLBSR%b51S!0N%(-oBpCx(ZXV}>UHY{Eg4k|zsc znJj-dZFp!eTge%fXH*zWZ-c467)*Q82GcII!L;vea5Ka04D)oM3vuN^Q+Qo6Q`%K~ zkIL`5ua(9X;8#4yKigFCsIyH?oos|(qlnZ3Z0boHu&Gx)z$)#>KigFCsIyJYc(E6L zP5AqOP53tgn|}3HVAFpRHvD%m{ySYBb+)PL>mFhJk1_tw0-HYS>%gY}A#B3`Hsk-U z%fpqS)LD=wZ+{3LJy!@n4{Y-Dcfck;2^*f@yL3m8=7`Bd!Yb_|Os66!I>s`WZiNYx zvK3626yi)?4Fa3IB3z?+u6F5;xEO`Z@o z;dpd)-k-^n4UC7dsVB9-CQk^Pa6CHClh;1ejruC3C`Zb4RGO4}MFB8*j-Nv9+o#m) zs5B{7?*z9suwls26aaa83BA1&+}6T|p#l`6rne3@(kJmK)Rz&DcNQC^9GyF(oDbV_ zAB9eEyTDJWLP7f}NLaU@f@F})g|0kRNCv4sF$#pH`oSm=nj~cBwLxg2xaYOGXSKLz zsJUmgC<@mZquw}^A|clk3(UpCbi**2%@_{Iu6`G_j=9c8=^;j#Jp2VL%JFowN0X@R z1J)`$DMY`yMO$e!30Sl?p}g^%N3|7`Ch$R$1QfIzU3jO8gxk&q@R-lwI%^J_++p2k}9x9&mJV%YF=Osg@7AhXqhbXFg?$SKoxfPU;enVgF zl|eY-Vc6(2hq1(P)sBWp`u8LKLCLpao$0H9Yz8=$A?4eYkL(MCxukr2U@miLdvFf# z(>bHEZ@`S|eUE&De(R6K&LN?fMe4(-w6pK1((cK_K6byRmh8yb_&C#(eXU=ypI^OZ zLr5C>6?=))lKmnMtD)Xm2%{x?rCTf1Uc*nRD@!rd5~#P3IhyL0-dIIQ^YGr!cq`4o zUu*bTPiXivz4tNVvkX6j?t#KTPd7%>-i-XjdOG8$dH!?cm|{Y;9^oPn%5!`x(d4ht zlP>B-$Z-B`iX@*j>fH(c4;+VoC*vo1N-=bOL-U)g;^BXg@wWi)0RPLHpL%^Vod01( zlFulfuh7t#Vrp3(7-RSm@I8V>4c+BNrb4}ZTCAVfGG&hP@t)4FP3Vj#Zv9GSgM^COSRKtsdic{)lQ2^?X*~_ofa##(_*Q1TCCJg zi>2CWu~a)PR%)lkQth-@tDWMl)lPx5+9{AxI|Wo~rvOsz6mO|^iZ|3w@pRQrfu-7M zu~IuN)@rB4O6{~*tDP1rwbNp)c3P~|PK&kLX|Yl}E!JwM#Y*k8SgV~DE49;Nt#(?h z)J}`F+9~3fYNvQhwNt#M+9}>r?G$gRc8a%DJH=b7o#HLkPVpwSQ@o_wX|bzz3JOy@ z&5vMG+|VBG?9>B&^UyF<7F%%Ag>2E(wL{k_Geeepl1 zgI>HKU6T??rij6|_cdY$%iELj0cZw6twV<4+Ddd$a_uTwsaPd!f<}uNAAzPBRw>P= zERla5W=QGvp$&OJX0G}|?pdxbTeJ2PU|n5y{$F*0s@dzTE?cl{=GCQ*)U!KAan?xZ z6`LDmouTQVzmG{_%5uedN46`@UDlqA{mdYG*{0DL9e%I}LuQoO(Z38Qc5+A0I!EWh ze5Zy+ordRMx_Z_V?-NRCv5hX^qu9dWWg0<$DNB+j>i&|HPFXI$d$V1BKbWKZMq;}t zeduUaH_PlOzy5e%GEPTAx$Zs+#)sYg@!{BR=B#aS+BLRwq;vOZUuUvUh0W|VvP_Q0 zb<~}M{X13lNukYAO_-2!Y+!b(CO#P@gO76Jm4%NeSX=o=6k2Fmr5ouf3ci9ximFb0 zSc04U*duFex^q_R)S!4iyLD<%ykzZ7?-McPm9U52-KtJ0zj;av!OE#A3!_uy^Egilj4_tnO08uoI1KCEh`)?MRt>&>%w%zo&} z*&|)KL!?1@fuV1oy(7?lH0S94>wXaE{%FDBXPOQzn_46_?`DpbJlXWj(f!(XZNvVP z75!RultiZZdQ7+}@x=^1V|)vJ@o5|4JINOxv=!6RccTm!`kK>uv4G-Uj6ME@#*2PG z+sIsSpqcA3`}@UHT2nDC)Q4rL8&8=%P36|drM+c35StfKluzh*>kqtm?C)of?r*ty z_Cta0Bi7+(UOd!_7<05NwU9;QMNiBwo@&?+9ZzUA&RpBLzgVM<`xj{Rr>NyPg4>eD z@o$y9KVUf;I(@->J;#gCltF3X?Hx+h-lHj~a@#fadfdD)_oRhM1Dn?Rvzrkp{pLO( zz5}X-4(yMk^(SYca#fbqzEADsct@r@PkM17DDxHCXIbfLbJcKNAAQI8qFomSt&`H- zzekF9$77f!hPC~Rf(1)A27`6#_2!IW-AAIVjdu5(5-1qZjHg_3Nzl4b#cKtHT^Puh zI&#>c2?{!;B~T)2y5Dj<}oQ_v0(8;W^6iml*yL!@p&C0hW=*?*`zI zj;od74u)yjxlHm{VZ!uN7?^N3unFgCm&XwahA%7fc!n5$H^X!WkqPIE4F8fXFdPR~aynv);Xh;eR)#;!FfGFt>ogKRLzl(fz(ytLGcJ!Ko?!S3z(%&aG5j6bx4CWy@u}QK^yu9RrxC{A^$)84-=lEA!n|`AQ{H9MJY{KscHf1;H@+kGM5bV^4?8VdY?*lgc zHv)(7M<0xC#naS(!iN72V8ef>%cDLp<-m>+CH(hznzR$vU!lS;x^!G=3#`Jl!h}Qk zg9&3gr0I@W0&LPqc&X-D>e3x?32;c#tuW!0ny22SJK`!}lNQ3~YMv37?w23kr(2(? z+)Y{t=WD+n-H{4JCM}B?4`D@DYE>pJA;v>k(Un>i*{O`E&X~9ehww+`Qi-QY3t_|K z(Ro^4TOH~QgyC0*qS!o24Qyz}Daub&>pgWSQgtF8PqB$w0r7Yg+WaLRzpB$hALV@5 z=nJjKL#j@v`zckbY#2|q3YjS_L1_9~$|!4;Jd6UNDc>0dLL+cafzXr^m&a9gQtD9r zGrtYKY%4ZVPLQGc8L)IsmlW@Dk%kz$!LtEROhQu3Hf^W6GZ)WJ&4VFS#}&{N@AW|q zG4z3_1y73AZywfG3~S(_59{gX^O{8UBVf_T@zOM=XElXV6R=2u;fge#?`aCDa|JB= zXr69YA!#c9w(*t$Qb>{?*Z9_#(daq8gHp_4-|KwdxN93ezGQGr*=5hb zA$M=zAXOsv2{9$&44)TC;tXW@S<*+B60&bsuc2JjH#RvjG!jo5^`h6(Em~Vytq$Om zH)PC{x<&V(cB>)L=oWpAmG?Qo-PD_;7-|yKU}Y|+xIs-V&4e^1lWtKa{#wKTU(hXj zhxSXax1$fB@SmdA46|IlT-_70o~dc{qKV$`sh3GHp<0hn??L&ygR{}&B&h|%m~M&l z_bDg&?8TEN_Nk`UZB#-$&m4Pz%h6jM(&1B{lPR@T{u3Ujhc<6QIOE`dMf003(3BUk zy~i-)T?l^qElR54{H9|io)!3`-3h_GG&n^o8l-qO|Dj%zZS+PAdTb+vYErgOogon0N_y5_E?$mXW4 zU5!l*k*4-0914%K>yE?UwXG@Afi0T3m?B#?H%FS9sAl9+IMh8wn?@#wV-rJ(QCv@i zlhH}||E^>2wjp2Gv3I25b7IHdO&gC&)95ba(P$cZ2h)+BlF>9efdlU5Bc%L%lvz$_ zKAv7U|98OM|KJ1eidr%6bt^aykN4Mc>Kkccj?c%Y5v1{CYv0@J^|E)yofpRi-f>IR z=eP&mjZjmk{wFGtdkBli1kyDrTsW7-WEY=7qFMM)7^4x?Dkq&-OU&DYktCxxILiTj z5&UNkINL=qDBhQ~6PHX842o%MuQ_Ybm%Hj5H;+_K3tW_lKB8ux`uJKH3(e-wQy*1J z@wQVws^+|!`bo7~e)^*if3yGEfX{t@iXZL9#H5%ILt;e4Me+~$bVn0L{poH?>gPG? z0Q6_J%gF6y!uBaQ9P+@Bz!TdoYMby z1f3;eaFpRV!#GFE<=F`#4F9_reu!Z@55n*ipqn+gnBfYBpMb!$A%Z3lCVT+#!Gxa# zHhzEP^5Ef9 zGf=g$DThaj;d>aU+L?LSz6Iq?rf?|OGwA_C`4+HDE0-kqQLhoI5_qTwpjiE;Pg^Pf z0#>izQQOA#nXOf$(;x3o$58?-%W;!X?y z#5eZ}`(u4(V=qMJHFx)FD%VR!w!3!=8pKkWhh}&0Q8!1`F9-kBcK1e^{5PO}((c|0 z)rGjHF0tN5r(SuY_7%vm`xdJ80_7X$mxEjd{*dab-8#(qBc50BR^T6J2)~xKk*67d z5AX-kjP|93&v*BDTV8~4{tf)kYkt#yd3yJ-@P7sD=$%hS_U(S|XAUa}BQMvePS;JZ z3ID`*_uc`~R4Cv7QOL%Ee}o3xZtRB~@ZZ-*v@f#p%Z5i`9{YN9mgv&fR}L;6|W5Bd!Dt{ zyZ5`#IZ5jbhxzpXR-3b*{jO(S_F8MNwf4HaOC_}B#YOOM4|W17((mwY^~6QhHe>Wi z9{a+v&3NoY#spj{5mdK#opch9=Vb3QX5C6b&BgpR6*r=lVb<#qU}L|Q?_t105hQbho9&S%pUWD za%1)+pXe~RK8-xtWA+^R?9A#T$6r4&ZQvt0(gW*DH`DjEep5kY-+J&qxO(2zDbFG2Cs#*#@);vRt=?IGf>9 zf04!*S^v2)#<2tkATxLiLj}Gs%~F2WS%ZA-iuiW<@7r)>@n*k_|I_&+i(JCLyk}cO z)7ySL=Z&dg?*A_r)3e@01qj0$*BO5O(6Gp8;}~uX(TxE)-L$NUIfi&1ij;GkHq=ck znB$3p|3P6cq82$%853NB2njx0;a4eqjly>*e7C~yRd@{|?><(7Eb&~}!DQD0OIQOT z2hXK&Ck8o$GpO*J6uwX4e^U6D3eQFF#Kj?PPE&Y=!W{}+q|LPf$NmT}C- zLwVZ#8d&@%UVuNC?CFTyMYd7Zicl~f@ZZ}wob3UnFoZ-&`pJRW>xM%<9c0KSJj(aYx zt6OXbIQ1{aMVBsJ1}hk9Ov{*0;auTwEiz_oZYx*MLd_wplew@n`r z$`vg~uBr0^JtGiu3h*0+uVx2AegSYm$^1;2m2}O<1^y48=m>{BPvXzp6<)>*y-c8%6KxG_8+kM zhH2UJPs>9=WD#tZ!@=PD*C%g3D11 zy=Uv2)~xPYEWz2kFd%yu24U}(n4}BP-YqpH>h2tq3h!DMo6_i}-junUmeoy|7IE={ z4_L*z3rcPh-)5vXqPY1;b+xs0uUp^KB+>Hs%{lfh^7P)mRU+r_+a!AazFi{d?^jA3 z{e6c-)8BWRau;oXf1#;}-LEp0vHR6#TI_y}nI5}ei>*@b*}De%$A(8t;%a8ZgVBR$ z*RSiwv$vt=?p$tI8;N}4bgpe#w|+fXJuDUYICWmOZERb&V_TTducfCyk9=-l-PN|n zx(Ks367fWBiP-kOorA+81D6f&K*o&2gR*PTK$e%_WnDFJ&0-TIPBbjRJtFWn@HTN` zLfOQz^?y3-21q3ghH;F?w$u|4Q-J-42VlvO+rUT2@F`h%Uy8P#2?(OkJpp zan>i9V2{DORNcSEV&PXvXRI#9jMc@MvAP&DRu^N&>SD}TU5pv(V$3*Qj2WkkF=KTx zW}Gg@jMc@MvAP&DP8Vaw>SD}zU5vPTU5r3p7bB49Vgz)$7y+y zMqsOpG2?VGX1p%OjMK%K@wyl@P8Vaw>tf6}U5pv8i!tM7Z8Cm^bjImo%y?al8K;Xe z<8?7+oG!+U*TsnNtu97ftu97ftu97ftu97ftu97ftu97ftu97ftu97fsf!U8tBWxc z>SBaM>0+#UHTKciw_?|hZNvRn@zt!y3u0SN_82j3!)7GMwpfFRuGKD@5=P%E7!AgF z=I?0BnpRc-_oL+Ygm-DENeplDtoCmk+HqBO7%$wwh^wl!0B-l~8{O2*1I2C4BR8T3+s{U(@w8GlXH&nxq?tYOM5v$n;} zvey-DTE!KKPybP8*^C=8$Y9^2tpj8B6>HztH#&%B)pwovy7BwQw%6{Bn}k{1Y#c9g zHh$OcLl|{E6n4sbJjR=FePQu+p(0W0Siv-^S27A0*N(c5Cp$Sk9@mDcXOq}8G;^TJUjShS0FoLyy9lY(?!mV=WJ$Ra|ip$?6z|g2r-iOI-i`j z7W0@XUVyFZDUQ|!Q5GPvY|^8`LegVw07*anb_~<%q;ELpcOjQq+~iLNMNa>h2mhD6 z4bx{}^gEU%u~Lp~vx6!5Z$m?jSKRD4x!BpU!evK+68>L*A2{w(;C)7FATDzA! zykkNa?h6)3X!~V^d6pMi4)Z|y*2AgW#-3?CYrJ&9#pYef+neV%A9CtbTVONt%y?<@ ze8+1&s~Mc+?X<0Yq51x@+v*Oq-~X~i$9$8xaDH=XX>YWWDs`KI%hve~6Rq=Whg(a{ z?f1_$2R2Sr^akK|lrEXbOeFWV&o3Je5=|F(nAXz8U|v|7?CmK1QGa=&ovKvfzA{A9 zLsS)_=F-}}X7EzC)jTskzxm)}Kr=0R5-4NQvp}+Uet7yDS3ywG%*>(7GqC4Ha0xFu0BoVsoPGvkMv4>z5)X(G72<#0=w zV^!;2F8t6wPs<^3mq;|vr@OjmTFx3jL{~?uqMUaACzStJPU?SIZ{5VH0dtyuyAbG7 zLg+0R0?X3QXPWO{u)F!-k$L6=(~wH$ch4D*@sL&@8Zoch7i2dk64!MhT}=3S;M z(HDH?KKoRO7b2JA3(W`U&fGQr_T<}4SB!txjemqI==!l1Z~K2^4IQVF{9fF(x%+fk zReHNMxpo|=lJ#|$!jg+S#7t$!Pj2t$`dmNRJM(sz<=RcA|3)Eszl@$+|GlBzf-HRD^Ce19x8Ejcur zO8w2pKmPGgq$;{_Nd=$C_ux5b0-pWf@?o5d95<#a?%4OvRO+3%4`5^YG%4$orO%}* zKCv&AN|e_Wq`f|IRG&UT%KAk4tf_taJZQ&lNTqh2bH_QUAd#-lfAH^rB`>1gQT6FPVw?+=XXW4^SjdR{GKKozSU0d3#LbV zxl?awoc6}X@;5c6Zf>0Rjz$dH_`TfeU}m6+`Pz@GA|=UFZ6U9YXj27SlcP&H9n+;e z)9F&4b>N1;>T%9Qx|C~Ux|C;YUCNvB7T_g^!2q;3tO03Q+tIN0qLC|W9vWG9AosGa zfHe#aYZGl;2yXdkqqTsJOI%;+@e1_wU+wY53cp6-K83l9Nci7Tn41tp&KgYc7JSzU zzDnVT6#jz3rHHWbrz!k$h0j&^B89I~_%?;#q3}BueviWMSNMp+C*%8D;TS;r$^eZSGh2HjFq3=K+NuR`@A}pI3Me zrh>$61F%~+gCmy}=5&!;UlL@AC2ki0i`z>=PTIUi;bsg23g-%iU#IY$3jd|Tk0|^U zu!}?5{JX-O7jbJ-f-Ldde7gMtSi+r&p%=$Vo7oB<4=kKA4Au*#4rRgTDx6iAI+VrF z{R(r?AFCf=f-Ldte0*LHEPnoZ$bsH!g&$Cycc9u6{(}lrU7pCl3GBj3o1ZKE8-+RM z&CT|V5AoZ5d|m(+f9B(R%5lM2DKMyL*f#9V+KE&7h z_`D5R{QpSENt=%<{Bgy3KPpY(e^TMED*R($7gpK?80{2XrZ7iAm-+Y*U*zLc1uXub z9&*y=Y=xI7&hZ$~6aG?#*C@OZ*oBog8~}6+XoD>AVjpgg;$Itb(&h$*->5iyFzzMc z-VE&gOdF1eo#LO1m~}c#_BO?TU&u+D4=Vhi;=BcojrjjTg+Hh8zbO1~z%Jah;TY3G z9|z(gABP_U%Tn`FtY3GWw5e3M3RuGZt-|Tqk^FRp8x>v+EPis-b%l*Xk5y;U?eS!C zw$09Mk8PpFEvj21Zc(-PXY8?Ux$sLN7k;_oGc1=TPK}7<3*GrPJx|}aq+u&K&i|?P zeLGIt^n!mn{`kK4;#d6N3@m9r2<$jc-}jlgCx1VFg?|88_%{JNj??$;>b)R)r{dqO z`1b-kPTKqp@M8SYe`4|fK7U=rEy;aBpS z*e}k^J`u{Desjs+7a%_#e=t_Rx#TIeQ%Rl@H+jy>Lb+2RB>BkgKh2(V1+e7Z-N2G} z#3y>rdqO#M_XE4UfEpm+Q$6SNp*(G#29`V`7Jq&e%G0I-FOuX7vG_ARltV{3u;c}? z__HLGr!kBYr9ZK7s2s!POFYd>5nrh{YJesEiOc=7L~^%1MACn*;t)&v*8xlV6N^8Q z-05VO^rt)F5KHk!DJTI^tK?BhutJ9q~3b5NUFh1d%>2E`NpAwn9vWxcRZaosR2d{>WwtbpOHO z2tvL;vO%KCa^~YV-^iv2rp#m;#AG7`Q#cu1nePcCvYCM;CK+%$gKS}l=(52EpUdEI zi_PK4(j(dAFw1hd%^}~s-%FXo$zTw_b$KNJZEN4Dymv zcr^b5Is99}Up58*p&b5SgMZl+{BJ8hJ2Kw@|GFvozg2v846E?--YNLARC=NxWHy5T z51!Ai1dV>)(-r@fu=@w_=bdk9;Vx*+Z&mzu&|Z!2n;lc|`6(#o9)L%{|GeiHO8=dT ze+c}Ng~mMX`RoqR==i)@@jnT>g{N6c?59z2HYOsg%OQU^zN_BK2ZwQ=N$8}5!}o>e zoyzU^Apbr3;_r6fccLl4e?U0?Un%}ufdAEfZ#hfxk;CpRqH4 zLR%fvJ;;v9wmNpBTbq1}{omksc$KhuZB0{8_xjG2D{+2C*ShxZOPbcVahsbGH?_7j z+3jgLGP?&cM`m{-=E&@R#2i`M#ogTY7ne5IbL(G@tbyDAa%4-m1u#dpl-mGvWDEtH z0prq^dTt2Jku`8rV2*5wnUN=3YO3;N45d0(+FEaF@?;GrohMsjX6DJ3;!vEN*t9Z~ zOia45b8UCMd3m0!!OYK-EitdilPxuMd9riN2{Bn)_L4RAUF%w!%t;01&F17hd4uJj zQc&J(PR)}qvHXPv<;~`_Jo!?~KfR#5*_@FlKgaUVEGTa_XXVM4S^n7t<;`YMp8Q

    2T-rX$~`*}3T~ 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 z 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

    =&ne@o{Y zd!!2*)j8gGkOf-vb0R8-L20j!zCxMeZ7-$T3s<>s;_COcd;qVc;gA+DisQBS(St^) zR5DeXN~OwD<*AC)nAEAM(^GR&^UO;~+E3V#t17p@U)AIHJ@|{Oi?H`RHES^T_|==I zB6pdNCxJ!4xT`{ ze5a>k!|e{gFkJDb`BY2++>j1liR?`P(w=3U(s7s7h-Q3C0~6Dj)O^B z{=C3nM3R}t&dU%UY#f}SwRw2msqZ@uzKtO8Pk~wIV=%zzG3zC;&WVW8-o?sUYnJ(B z72CfPn9n6_XKFLMoSdHK3ix!rYy-8>e6DD%^_md5aq+vAvOh&$j`|5fvWzyeJnot6 z)&jAkCs=4hP5_5`Fu6SLbD6v7)a&A&7M*D}?$=N*h6bQoZfYq#Xp^<2>jD8iH^m#_2i}0+!esms zf5UsnI)q+pG&~ zzXktC4MxbNUHbD2g8vlo6nao7Ym@vZMOYnh47>N+qHSu!AiduFXk#N>hYB29Nj##) zR2RRsI*$KCLk;h9NMo;b#q9dUt&5f|%`8LrTFJv26_ba!tuGJJft82jz z=iIw@Kiad~-nNvswA%s|%V)ZuZNVSiFM4aX?aG!~1#(%zLbYXyZAmG$DWrZtVkD>q zBZ>IKZ7NFqp_ups6D3h80b__JCH^K+3Ghq*NPXU!cjlcrbLMWvEVt?2_ssLo$1`)z zoadZ--Z?|6)88Cci~P+kD)%?H;>rIuQ}MB*4<9><8!W0quQSSigUMgo)ZBIF{>_`4 zW4orNr~8^?d+*peg_btFW+ptEd+umX#s!UxkBv<115Y8w1x$>MO!ZMWsA{|I5e=c* zuy!2fm7>ee-RM2a)`yF>A~-fVs!JYJl?X$F#&mKKk3loq0nD~II zL=X`lFvJVkP_YFdz9?+LkPshGSpUvIw-qG2#)%#0OQi0BtqZqT7Y|(y-dtg^5RgsAbd~ z;Sof{hYaxowyoF#5MLIyV4DyhQdtCoxZau2;Sq)=jhkaUg!*`5!>9`J6+yKnE=)Y~ zW8yf*BZ!C(8{!3wCpT#Uh_4J=&?m%)RThDkI7U3em^hB{0>m>H_BSEEDy%kkVd9Y= z6UQ-LfOrCvT0m}1Sj#{Yxu^Gxji@X_z)T+|7}5x1W;loo5YJxNUxnG)u+G?pnMHog z3=N2&iT!)0Keu~KpRWoaPhZjm(C!VJFvPS+RTd$ZHU>1pm^KdK0yNy59`Cz-axeC$ zJ-cudPi+V*EZ{_#9C3y&IBp3FLd&lS3);#!b`Mk0#+JBOQNeLrP!KA*E-0vfGvnBa zOhubo;$B4s$G)H-RCGgFP(S0?Elfo>wZy%O3XTIoL8$1Ku%JQU{r(tjZi#yp6�x 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

  • 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

    j+Pt)H#+%vbfaY+H(Jru+8m?R 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

    %iex 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 literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib.lib b/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib.lib new file mode 100644 index 0000000000000000000000000000000000000000..62fb82036e184869d2ec9cad6588082d84765bf4 GIT binary patch literal 698 zcma)4%}T>S5T4yuEm6diJqfAwpdOkuX`3FTP{BZ;=%x20+a`1&T1nF4%_1K45qt%o zL3{|G$Jw;2TNLWR?0oZ+nQw;F&ck#x>1l?cuZgL6ORT=S-tNePKpUrg9;FFq{%9J< z4Fp2@Z9FxUTof|Co-@=T*skd~wrM%0jd69FENj}W)zCou00N)AH+~0F7UZ>nWf?$w zhUzN5ga-&JsQpuXh8~b(v|Ifwi*8sFrBJDAJ9~6N=_932l)h7Xhy`^vuFA_Ha3H2_e{bDFj|{ryqGa!hBY literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_coff.lib b/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_coff.lib new file mode 100644 index 0000000000000000000000000000000000000000..861e1b2354ecd85666e1aa5d5fdeb02b1d4ba299 GIT binary patch literal 375766 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

    _hR*a&I}t&p;XvRsfuc`>6r3I?N(2Ib z% zZ4VUPjtI8nWzI(gg;h%eMav{Xfv1B${Nfk0Z}E`;B6|)A7r7Fi?h97_?WZpYl-wBz z3`k)%7Wk0Hzii(Xm~m^M>ZgICI|5aBzd+FiO98G%mp)MBf55*h5ctQSFXT$&TLnnt zXP%dvE@OP@Iy=TsQ;fb6M05e6c%W#b6ZID@6?L&I>Rm^R`o~#Oqugc0=AI?|<2h4! z+7IC$m_qp9IVt4Ij$3t%?(Fy~m34|@JOL%M6=e;3B2cnBWPbd5dps~Bfvmo6G2N>^ z&2k!E=&8)WQZej4Fr&jkwm zQK7az87TA>&O$j}5ID&{yf{#}lJ4>BIDZRyj~3@ERHt?aDxRkLIx|r5Bk0+tUFxl; zvUd`Y) zsFWR*%{GlvuGnn*EEO(ODbv(xy09^oQt6mVsdAZ0na)h5hN!Eignf5q?%48O@R z8D}%`yv;Bjbush+!^I3&Fnj{Tvlu>w;WmcXF?*vPQk<_U{?86F8bJUbYE2w24#7LPDY8`xNpkn`+3hA(8eli^JaPcVEh z!}}S29$39sSo}4^v!($A8h~dvM{56Ju#4y>EF)~z?IGC(et<+^l+o?C`_a%IV)}_-JKiR-iJYmty z@Y&clYvNzda2Lb<437buc(yT2+izR741^EqJih_h#Q$NNCoJ|dd{ddj^C5;m#_;nD ze~;l`FK5jp54~zKY>p3_r^7=NbM6!~ekWB*QbXY1YUy7g*&_SkPwL zZk<-=J0GoF|#pVf%(-;oHfR5ognc*6SS2Dbw;W379V)y}uKg#eChQH77 zzcBne;FuIYENHV~RAMVi*u0k?*vR~DnMfz*vLH3<_U{)7@mpA2E%g>!^;_t zF?q#B3iKoNn35(SX_b{IGvAM|buVQ#3!`Cr< zAH#$S{;TeZHO!uS{3Jg~vX@JwtI zFmay4@N$M@3||4P(t@4?U#8O~++*~d@$ayC!s2Fzha*n9I~cx?;e!l+5?G}b7M}yY zLXfkfgxhqwp9eO!JYn%8hF>|=N%swgf64Iw0XEN`BTSzvE^Y0pdJz}+{EFN0 zhn*SH7MszTd7wZg$a!q-new80t7NgFgqKPz@QVVD{M42xp0L;ston5r7XU}_2N#{d z#k}uMVAJ>eF!06rqx>O!vcw{~7k9(I4_NVp#b7C)Cui;|&zXxpE;eVq*{E<9_7fLLmzr)?|W180f9-RZMzPVPEu;H%;Hv9{1 zp0Kpy)Ggz*qU%AA==l2>|0ZC?6UO3-Y2U0UVUs^Q8UHSuCoDb;yiUhYc&UzmFXN{% zwc-hj*MKk8{DdQ#|9ikj{?~1uu=q9bWtyMxOwIpqjQ@8wPgu|odl>yEY~m-I7AF4b zHV@ix;PpCw!Y2M|#=p?!!B_xzgXSk}@@FNmiND?ELH_}+Kwf>(AK*?pO=V5^bcsdu zN4P6G`cZfnqyL1j*E|869u_wM8=WV-O!H6~89o0Tu+dw>=V+d%ZF*R|32f>D;SSC7 zk2XCl>hLZ`p9%MAp2apjEItTqbeQn_G|z)JJuH3+Z1k4!2F*ir8m14~?KgU8MF}gq zh_1EiSg8g!{RhHv9Z$xlheZGxuJp}{5G9XC9L6+JBFGI|wZJcNy2%>y=iML2{%xTr%9%lSW} zSJenKJcLcVx)j*x6=B2U(8Ho0bfZ^<4Ua<)OSz0*tz;s=y&`OQ96H)+ z(AVRSuWtS=_^MqLYUSujCuXvRN_>n0p{e)bSZl4RRW@-M z1wvEmi~^zOxG4~tQfE9!`a(AaLX$Q#9td-#n*yOzE=nz;9d}b8^9)ePLa5GX$c*6@ zr)ZfO4`hzGc_1^rd$AJ_WS#~}i9>> zO@YjmW94?t3nBAqZVF_c@1{UzB*&kE%t($?APkjGg%dMmrXGMpS%gT=byE-tgycN% zLI6&I%n?wg*)cDI%xAbMcmxy8sF_B`7C~lwT9A)61u_?dQsqz}Gx1D!D3F<2fD>%W zV#qw*O@YiO+7xax&8sy@TI6tZ^{Y;kJk)}C-@QST!jk8NoIJ*! z9@S^RH3L_#GdA?95Hw{T>a<7~r;5ke$|Fhq)=A!kKr#02NQ37Yop@v){TcX4}D=3 zkGHOVO7l=VHkHg@*F4nvDIU@Qw|hhL(ARS+dH#>)acp^e->ZxoFgR+BRXkKT+-|Ps zp?-_vsdqELw@mZU_e=43>vL4|(6?Lhc-xLEHIE?u5f8ve_GdQ@)eTi|wJm_>I^`rA z?(>adqHG%_?oh{Uk%umATDhpheL2sVX7T9LBys0J@)Qi}%=#38HH%^O#@IQhw;WA6 zwk+5){0vxbvOed>0+|&vM$LKB#T)KDufcd+XOFV!ZNqL;J%5;)^{kVQ>ZmHu99i%= z4gWYH=H!%C5<6$LodKgej&?}OlqXgUf3~jir`(5(WC$w<9m5nFX5xoDQY)pOmAo!u zNzOjiXUA;xQfZcl?5L~T>f4m2ot62R-oZp}+s@UwZ96ZjUV;#EWRbpDTBLslpIOze z8QadL??H{r+4%cSj;|1Xzp0NS)eLv;BD%eE(X@y6*-UsY{(8gD`fr9m*L{K!(fzdD zKcaI)@&AT8C2;2JW#lIsVdLm)Qbe7cEElPF2p@2uAaVov=TK(_j{2D7xGh}Xl2f1U z2JpwS`9Y`rB-gBN^7=VkPu8+CvXt5I$5=oF_&ea=q2s5%208P-$8QVw?~rrqBapXW z)h6}rmE!$b*}^^UU)BBwDwb8))ZP&9Zs@usUW1{9?V(?&wmtOY)V2q|OYL|Ti2}#7 zSOgr;5)pJfOKG}6#(*QP=EtlzAo)^~AxN{h))N@l=rm((D^|3`;$5As-D?|SEk-U) z#&2yj)MT*|t=34%`09+XjJD9o%xEn=-9~ta+E`=WfzfJ3p?WVys}ms)ZJ{Xg&?uGS zY-&@DDDlv0MX85YC(1mug`(U;qf{!gsm(QFnuk^^!X8?ksPxbliYgC{Qkm|euEUR6 z*NAs}XtiRthgK&}@z55Eh=;aFoa&;rMAvrIARRH+L#`$A=^k<&k9{Yh2{6=2oS3aSvHWvff2r6ICf*>7sT;+q%~^ zAg{zwHa({3!`bxib&bTI%BIH@eI%RSy{?J)uga#!6g};tH?=p)61qN{D&J@#n<{hV zhHR=Vo*lYrPY?9>!_KMiEo#@PH4i?6ONq2W9?&+(18y7SfovP(0mlY;z}O&nn2Zhb z04y!w2VR^2=`Rdu+u#me+XgRC=Es#W@C(pyDIoLX%G(aFe9&0@c0X+_eg}-j?|^Ob zTRml4{4SGbz00Io?=orDyG)w(E|X@x%cNQFGBWF3rp$VmDYM>X(yVuxGV5I?&3czf zv)*OOtaq6->s_YJdgHFmdIM>*-ay8zH=r`>4Is^W<1Wp5;|{alxY}mDfu&jRGG*4g zOq=yCQ)a!(v{~;mW!Ae)oAoYJX1&X_S?@As*1Jrb^)6Fpz00&&?=of9yG)z)E>mW` z%d}Za+6{O$PF(isf%=OU5s`pSo-`-P@HMB%6+xqdvtQZ!zo| zZ5r4(){_|2LB?19F3NoT&hx}U{0_B$H-6dLf9d3bJ$@Wq7kAx!wLc~9+I97u&4*gRp8WVi#un|L-cd?Ujj zVfZr)e~aOt04o{P?|~Y5=0OmelZW%{K{NamX!7=2VDl{D*%XLpCveHdPwP%bej2Nr zXU(`BB)Lb!`)u~wJH_IxY}3jBm9e7m*&5Q4T&rPxhK9!fIeFNu483tK9+2&s6}75H zy6JUhb_9xmcxZma(OkoAW^~lb3C-!4c^t#x%$iUR`7N3^@j5e80>uGO1XnXZ0;pX= z-?A@@su^qp~HkRBvh6(Rn->^S$k~LRU$D9e=kb5R@ieGtKytsCW zoCuUNfo1Yn-rBHiGgrR7nF;)r&I`JojlY{!)556E%o5iv!|?GO{1F|<_3UW;^@gA6 zoZ-)PpI}723rg6WqM|;Uh}aUX6q{j(W>EJmue<qqac^v0o%|hP`+;|Lr+U;lD0|37Ue~Xrf-jf`knH*Ild8OT! zw_|29pclDJQapcdWBlI$t~QY}I_Lioqf;HGAK!gM$8RQC4S&N~VCZfW)*Rde4WpyU zAy@}Xi_nS1g{8g;pKk|j#`%2D`h3$-l6q#cAaA|I4S$X^lST1(GBG%q+Jb}KaT^mA zt1Fr&(XCJhD}*6xys0}@jj3r3G3{p{X8S}yl2hZuSX&xZKh0G}j}|_ROQ{@q2KB%* z=pJ|mvj?6*XW$t$15by^3_R&qt}yU)0`$O>|GX8Bt&4#3^Hy}CBB%$Z&U1QT8sG!d z^UZ^5U`j^#{gKOXExQtz!m9|8x9}QV{E-Rr-$ee~aFI!vA*?$cGlUJAA#Bhd!m6k2 zA#AxE!j{V+Y`Gl5mdhb*xg5fl%OPwz4PndG5Vl+mVaw$Zwpp2wSd)u;pq9Tds$& zp2wSd)u;pq9Tds$&#hr$*xXB@Gxjlphg$-egd(eL&P47(&Zye}vQu^MW zO2A;`Snnp;#!>4`1KBB=^4d^U=grXTAhm<59jkhz|LXUtVA8c$+)Ng zeU4pEr!>78K8-pk$QJoqW64CANlP%QUQQ5)*@|rDI<~LievFsm^a3xQ05syIs5$s$p={hk7s8G}{&X8~0|)#oLp@C+;Y>?js9{Pd#xka~oNL+jkgz{v*M=VH?rse@)&C{6CfVp#Rsn zOB-%CQf&9Z%A(JAWH#Lke6PuS(Dzf^e~maZH^SQFo{L{t`B>{Mb2iUUSg{!iU+j|g zb2ex8`ktx3!)M_si>x?4{Cwut`wj=6v3xX*_VDw?&zzAWE-MFDz~(A?rb=>&99#u9 zSLm6{UTG=v*84Ile&c`m`TM@4D6=-t+Dvan<2;&E@e9j$ypwm-5|VweF5LN;n3@9H zPFauF-WaJeg~zgylN2oLc5(xSwI#G;8?N3~yn0JHt0Hd<(<3GkiD0BX~je?)U*q zVA?7I7rhGDq`TYZfdL(c$>5IRxrgDy3_r{8cNzXU!_a*@o|70pm*FOcqrgh$u%N!X zn#HlAgiqA+uVwu2w|T;1nBj}jBQ)|~#&AEdiZhJGWIC=v4nHgboY3(PGyWTFp0K!y z;RNP9P5fIJzJuY%7=9jDrKJq<7))I>H4~!@@tDKgWQfO1od4M735&mD_*u-C8X3OB z@INu^Ll4F9gn?CBVL1t-@1Y^S6rXxq=GnkTX2OQ&RGS_a?*TS)67JXW)Z29G-8iyAJ?*lfxQ(2IQLN?u!w+e=mhJcPY@n7t?grO#TFpuBL7rPaY#>!MJb z-0Y$(g0IJ>@abkWSD4PnCCl+C=0EOIhWR?U6FftE>23WM<*-+%3pEervENcTr%Cp0 zwMM9d;K}~tsK8OpgS8Ow(B!R|u+;&$U9TaUQj!NXw_a16o0-xjeeql0Z~_?mkj9jP z-&%^R(kR9v4r-5c$iXZ35zXTq%%D7SyVtZgXdhhh=JiiCPY5-Z>YLF(O~%i%t0kJ| zmVu2uwJB$b2D3BHAk1F4agA*m)fsp(;uLd0f9Oijl=DS$=*NcE*+a;zq2V!>hl+cL zMn*^33Q^6HC3V%cOR8(9S|3`rtU7yr=sFBoPnUUY)`#@RRMO7I_5Zi^p}UR7;658Q zfYyi3&~gX)(XvNrj-A|*dc$E(xhwxkxGg>gzy4Ur z2Z(>uG5F77?a^NFKM4M9dOb#c0PrC|9#G>%?k07U*HS!tKA6r|JpsG9;ra70-O^Gy?%!+B$71)Cdrm-8^ab4Z864zLia2Ko;mBVQX>As;Mwgk6ccyZS&Jh;mh9^B;$5AJe>2Y0!`gS%Ye z!CkKK;4W8qaHka>+~f*RiM_%D3R~eRJOkb8rjBS=mtNy(9T>!t=1No`S;eVs#bkGG zhI~yM=_V$BTNQNzQER(pMdfk}RRgu$Vp*4sCWb}^lhJf?v^O!B6jaONSv1SKLQ&QZ z4EJGGnek|f<=c79*e1lWDK*%q!X0nOS}&7bVkaB&BumDdvXc#ECChkpvLP$xBqM_z zZ>j2-7tX|2$XlfCcnxw>6*-0Hxy0AyZF8zF@h$&NOZsp2r*m5K2V-;t9)N*VY;en1971mRQSF>ly zt{0ChWJR5aWuW6Nr8!ee6uuk%H(pFJG(@s+sLSmx92u17A~~GzB6)p^>Nu3xO7BNI zw`If1{3w#XWN$i2T{t`3MWKebFFBaFngwegg0_up8S1)vxVJ0atKw#U1YbQqn$$^m zZR*>iG$M8(P+B_l;JK)$m+5s)}dPBkhPi#D8rZ^jeVAEQn9jVrL+YX z9~1heua*TX&TPGB&gM5?`7wS8Zt`J&&q3?Jm*2eqFn%|$An_)C8P1=2b5^~WwYm7! z@^9R~{e)LPa_#+VY29q!uFS2E@7a%Mt*(N^>oea5=j-@wD|+trnUimmPZZGhc$v#0y;^shXcPv&w_=^1@`D-7TWcI9)`JFYg0%wgZpw`HOuBEZUulm&$?zbG_MwYx=#{`qHduuOR#Qz@l<)y9=Shrzsm&7>^h*?q z9}5ZSgqb+&8NQt1F@|qvIK%K~flZv$u~XCER+R7+D0?bjTHG>=J>Rx@!s7c3e;(7~ zMxJjm{40hlG0Sdv7BC!Rc$ndv8Q#zE5r%)nun#>R6aR_8>Rr^Li+Qhkc%cZr72fL{ zT+Dk_0~`L8z@}UX>*;mOGC2HEn+H~YfsMWqj^Gb2+J}pYe-p4N_X%KAj|fNb2N&Im zi{ak|Z1kA|QI+6)(d%(F??QM!k@4&fT#WpOfKB{__4g(EQJWqXF9Mr)BzzYB;G!?% zV)Wq`z~;ROzZ-vW(O=?X-h~K8HdG@!|7pI_$VoVaKRCIlX5^%NHF6R*JPutgsu?*W zjEAt1a~`mfldy@$p{r0OXZE5Rb(h^IeQ4^`q13?#C1#c;X;BU8#VCv5qcj|Al#Ah` zcT<%A++{ZN-GMmFQSOjKLxtri^DUAj`*N{Hl%rGGZ0pxNXbh(0xk>Y&vVw=^z?BYY zvb^1`J!s&;L+c1Dc(BA~W}I^0Zyof66XCF?QVLTovzc>E&JvpU{lBB*ahAu-cUuSG z_RktR%XMBJbDG3C3FR)2#mEgh33YLQMZ&Tw4XIfXj@>QdPgH4$qW zJp%j)-gS|VpV|>}hX43izWxr6>Xk2lzGg*?`u-U%epzJY9tWJFYr5MyVE?G4V@-QQ zcU$MGj?U(mcvp94w4t@TCAO+%U3YU!Q>>+<1=c=bv*{@O-Iun+I-xRCF~!!bYK^tD zkRlaOJk&D8TZYC56JrCZ;SMbC3Ey%^RZ5}->6cUfg!VkN*^ZjU@i9n&8Y#_oC~qgc z$7k;BnjGpo}+mIOx;pmp>d}Sz_LwW|Gdy93+m01h0&%<*zOa6rQiP!cVo! z+%s`@95y(RYiyUfWli&k!d9iVymab)<$pZ$8*;{71YSf2g2ez z4F4^|KVq0pD;a(|L}T!M4DVw&!|=x#z5{~MkO~SGCHy|50T;a!*bMHUuzAAb;|xE7 z95(5Gg5eh!rrq6!=O@4_Ej7tu(w&C{&7{RSz$V>lV8ah+58QXybW2Vo=)q9*CY#O& z&}x^yk%78bCSB9j0!a?^y=j@j_kZqyI9rz>FP!PDQlHarQFj$ZljTeY8yOEC>SCL2 zwZmvSv80K9i@LF1XF9IbclKKmTq#Dk+o-+Hz|k%DUWC)YaowejOWr?vr9Hx%@;mSc z4)Ugq?-)b0;=V+$8J@|J*D=Rvif=nZZ|nl{(jE@_*0tSC^R3VQ63uiVSvwq|1YxnL8od#u2J3O_0zbnQ7tZ` zI{8n;C<}=Im*8E$uH!dKZ{GL#$7p|#NA(yjUpog$eg6!HXa5EECSoHYHYKVN(5Iop ze%nX=IA`Bqj-8A2`DQy8Y5D8;_A6GQnz8+gbKxysgiC;acj5QhujrQ>7u6_?j9CGp$%znXo`=G4<|b}Zd9ffhh%d_4XqW=5tyg3lxk~g z^R-7tMSrQa&1_mC&DUELu{SiG+?Y%!hkKJfsll;Ce^QW2<0O3+HDs-myOi4OheNp@ zzH5qy5qTfWX8PU8xSLek+BJ7>b6byG*|Eybqe7sqCQl#A-2BT|CdK6LiMKMLiOI}+ z=WPBuj!^pkL0EJI-MZkBJ(-&_Pva-dx2S&~coScxE#mL-(b{tRn}`SW{a>uC_~k2N za{oPg?aWqt2`vKpTRoA`TAa`>-fH2!0W7(f%9O!(g zoFO3XzwnnWoae7x^)6o|9Q0vxjrCuB^8}42Z>>j1Qdp}o)M35z(x%h6PsIIm!s&ITL$LkvI9@DG8_NbIK!S0I1X@`pNiYGj)S zI{m?UmdH&!6bSL)e9>!hHO~^(%UjV2oBroDdX(P=yqnvZZZvh1{T6kkRsL`;)AdIo zfQLH&ro-=WHEKwj>$j+b?RBP0O{0dXMvrm*m@|5G*BR5)Dz=FUpV$M4@npKUZ$skJ z)UX*(=J*KyVFSq=5gl^`**iMKhmgk_LDtkPs;-qoNLu9!OM8qDoS}Z@&>2C7Q7Mh1 zVrx|c2}6>1Ga|_~f*i@gAJI?e8bRjbuQ&XEzzA{{8ZG0JIA=%k|4wi6*ro%F{NyEU z+%kY~dl$Q1=k4YjX55K?#SBK!FjDW(S{*3Y^*?(I{(i`zj`J^M{OiEC54yAdboGE~kPQFvkH{0yL{%{g0{QACQ*+QO z1zxO}mxL`@n9Z4(K068N!>`w<1f>tZTf=;dM8NhnSBs$IsS$1k6uORNOhF5^pj|CZ-JP*`gArBx8?(ZjOpfUAW+Slnw-}MNztsq>{VR;z+P~6> zuKjHyq+Uh)FBU~E|0SZ><;QVGm%l@ly8Nrq%&Pq8O7@PW@M9IU92}+>FS-F2g>IvK z_>Pkq(O73U@}s5MS~`aZZGE_pB0U-X8~s#k zdsj<`e8N@(heQ@mjj%(Bkxi*|61@u);4es0ilt}~F2RrC67r*lUy{7K8uqkK6Q4o{ zDQ*Zl1PS;~^RbW`p+oRfPrlO%SV*l2siTk}3#mhgRjN5EQZz9-x+RtFL#kMvhYVp7 zr0B14DTsWP{NE%${Sy2%d0IE5PwR%sG4Mx|RC0ZlyY{Td7a$R;tswmHM=9r8=!!sZZ-xs_Cyv zeOk9toz|_?r*$jUY28YFS{La{d#t$2)4I6J)4I6J)4I6J)4I6J)4I6J)4I6J)4I6R zXb{l$VW+Hgz;pg{P_=w|x~XjwvhuZ*TpygQ42tZ=C=T@$=ej9DuAc|3l%`wnV4#l z1<;=ylj`3(m>AuJkDc!LP*tG5z5I%*+AsxYehcMDo(tuNa%;_~>Pt{B0zWe(`xO<| zdX09wsH@Y-ew>ILPYRlh!c4LDRantc)n}xBM_l778YEd&G|IC?*(S`-xiTGny5q`n z7hire{LMUP_}enWu`7vsvebvAy-S3V;Tqk@sICkweFHXKcm~!Ux7KEJ<~I}lR-SY5 z-PW=7_U1p9-j>e6kl2;&E`5Ydh!bGslLi}Xy zz!0^#T}eG8p!|~?J**<^a#3w<4zB!WUt_+r@4YJfw$b>9Mm}+g&}z#2`8K7B=H)F> z+J`w6nPF*V!N{9swAjJ2EGJ)nGcA$tOxui1tHPIBtp&E+RsYrtM^5$~n7!hz$d3KN z+R6R11F8MN8{Vh}IuI=F+aDCW56%=5>n8vA`UAnb$?21)ZOz;mdiB0w={JgTEr0dl z;C;c&!EoY8u;s4kTQAIRxhwY8YeBkqzx7kxe;o|m)$`U7X}J37r&{h3PKp!9m!khD zDNd6qR_YX|+bPb_DbCp(xNGFCBlE=Lvo?zdkKE(GTXa3yld)hRdspDDvA6IGbJmf^ zGBf7%TsnCep}wx7^?|$AzqS9|Blq-9T6Z5T4+VD@|u}AG+#V(WRHJ$=F9`Z!xc~V z?6>xVcPFRtgZMO3vDad^cn{R)3RfG-@E{yjAbOt0J(y>;9rgPpy?A9wBXB;# zxEzEjy>8t93N5H#d>aURiEsGRtRbuJIg-q0Yq1IO! z&k9WU`N{)tMFfcr@G#STcBvSub^E0&$97- z5liF5Jf-3Pu@B4bRrf-GdxO40mx=MmePz;6_}k)6SpUBLdS9`8nHm18eIYB`;K7ZW z`Lh-=f9*Qt2&|7kWg!Qo|4!sXaE8wp_HVy)kAK`(;ECZ)OC|R?8N*kvJ8E)AH1oen z=DT!q|EiO_>$+nn_q=}bUhl(rZYU|)C%mZW_FZm7Xu2BYM)B}nz0tkGWhG*ovJw$CRw61LD-l(EYXenw)O9#~`n975i=4Sr14Yg(GEH^o zjS2Cq7}b`DGl_up(D&ndn#O&YKR;b#+Er)pj~E_-aE3n4FzpXA^y?Yk$?yjlz81Z3 z!@q;!TNu8b;ky~WpW&Y~{1(GCcv%zwVumkZxSnCMOkwy38NQj}y$l~=_+^H_#_($l zf1lwWGJI*kNq2zZ8yLQeVX}g8x-KI!@ow1;#yI{H=xYmqE7-Fo|kPNtb;TB zN$gNCJY@3R;GZ*Gh^awCpUv=mV3lrI(Db3&K4L`)8yRXD|HU>>Sgc}r5oW$j{GALB zGQ5l7zhL+YV3lrI&`gD|AygmbU_Wz zyMR@?VR0(MG@VgW)}lX980ThW~zsKgRHj41Wt)r3-5y4AT_FNje`0H)(l( z1Z?7e$L0wOANC?C{;((nHax##xCrBKL!SX`_)lh-#^|T&bP3n!bWZ~|&n~xl!lH@c zm5iqv169M{$Z!X+ia#u9Fss^PD@r)5)9MB`+qu#Fn8~%1+BSX~Y35!j@MrOjgQyU#*{3A9`SWEz$awM!bnRqOf zn6jX4Peu<38~(k(MxK2(Pgr~g*wh!ohW`tU|5=+SEM5aP^_{Tc{~oZ3|8<)uEZzcE z=Sw#vmFrY#nLTMFt>2oipK#yIzA}7N!9zRCRNdiRW^Z9Y^3d)= zv!l@AGW*Razx@{NIP*HQ$BgvdZ>_`C>@0J5sl_DcY*F==**eWbnyG%I!pk$Hc}Ncx zkGDK_X&%zdsdygOJfz`M@jS129E(5Rw0@v@%ItW&YM3+VrA_yGMJ|S{^`;ywHLf*}TntBvBgeG=AGqN- zM`q>BCil{=OLliqmej7m?8P;AV2((0yr+65XGtAnt90K`f^U?L9CN31?ZU;?5puLs zxnxVa?}b?ODRh^JB*t2EEmy!-trrkX*u}o4L|z| z82()M2}b-V!|9p$LLmOeIf{6T4m0wT*L*<;Q(t9=?)Z@3xJbQ0_>~g}${+JNcnp5_ zD1Hu8h$F|~@5ze)hq}Yd$gZ8wSFr&4>iows_{|rJ9$SOIa&!yspGQ9DKstZlHM(V^ z@VD^y8SsBo^CNqu<2#uj(KNcvg6+_*pdl}> zmss#h;Qu%kzkEW93TN6}!+-ocnTPQzN)hw7lNr^uSBm-Hb0hQb(Eq~b(T;|AcdTv2 z3RsEi>TK;^+YoD^&8dvs(A?A@HL~9O}tsO zTH45)MXRIDyjiq`w4pbPMyX(1ubbM0pZoC8YH53K7GIqx^UxNGau1DCsmP`_*NABz zTCE6sXmz5}Lt7}SJTyvWx{JE5ZB=)Tc(;dED`tCWb>b8cZJ~&GXp6+DE?NtIQlO@* zv#CMM%}H+*r+etNlK+gH^hR-}hh8W7=jEg~inBcQg_8g5ob*Q6ap2`h@-LG7=j5a} zigP{m#ghNLob*Pqz(Zdm`Kxo%8%2$WzEtwp=A<`@IuCuBQvc0o~BlYSHYW)rb}ktyZ+UXdO+BUD1Y)b)^3* za)rbwWTiKxQ9aX^D?~nXu`8sjxwWIFwH-Aoo|9fH*5{_>O!LKz_|cwi1C|W{n+R0+kieun7&m-<>;bVE9fF01arKhJKor` zqHWcxwpA9N?3J(8hm8_9x}fj@aqRa}rxIWf0E}@T(tR>>AjXlt(7$hu-uLHc6T- znG~6hPDlBNX( zDVHpq=#d?0CU+qGY1v9WtfStqZzKM>f+$<_eJUxhRP8Bs)r12*oO2T*o-e#Ap+pywNQ0 zvSYG&l!7*;hBprMM-%D95Kel?<8j>{CG)`UrGiq67C9f6UL6|loRMEIYBGks!!OI}wp9ig4|cc9C(olVjzlm^BR4x+~qE_%a!?~^Z}tttok@RO35?v)-KZL;H$0k&^Ct%;z7$}z*^l#uy=$wJDmC3aw5GxGiUEvM^q zRucS5*qG@6P=U!JbWu=`pxjRJ7!L~6&QtsAt@GYnk2bjClr_vnK}|CeXO*LqN>(}Q znpS}oJ*OP0`yk7Z=I?k*Cj;_YemCd0{2rdF{E%<5(_|MPCrnv-zMWgC_}ovrD8FX` z^HgQ|a>CTb8*`;8A9PVr!O8E`aN9Q>tAD7-Wjk?l%TWN?|0fNg32d$aG9a%CurI#~ zFh`xv@V2yLdOWCyXL@kx+qqr!092jU7}@Fl#+eAJ(7nd^PDOwgR6ipNMdRtW%SpP0)({XcbrV9sC=dwY zCJ0olTJ1%{rM_tWQ^ml7y=d!bUx87R&_U5%-^8KEfdCqyx?ncnB zOTYj7O|oZx=b7is%z0+coH;YkGgEy<^d(}xj}4{Fz9dWBa|74(&T&n0F@25G=e%Atydr0hO?4$?knT&6f`cu|^`?DS z>LGy;)h3>i$*&$1Qn#>s*V9q&ra1Y~)Vl{`r^LM-@h3k0Z1)}8HpIHNtt;!o&W6|c zI~z_uGAgeyS$h!2xpVeDyyubhzHNwQqv9(7 z-^TK>t&|oxPuYW*e4Ylyi5L99lg4??daci=k9I0wM45ob`Bi8awlZ@t8Fh{^FJFj|Gqu@ z?kaeH=k>k2b{^{WM8~G>H_;-4>1+Ew8-1cr*Fzmu+tPP!zpUd^M2#Wdj>z#{69@XV z{!f&4bwtWR>xc~Ksu3YYp#S~he?Id3!+(5)uK3Ai6vyC|KkaYX{a5~?qqOni4(y4E zT`+&zulqfx74(n_-B{2Hzh5_Uc-{N^ul;aK7s^RMdTV>;G8bl>%TUkE3$NATJd=hX z)#y`r2(7=2_ej^#vqaaO4}UC0WE{;pdg-a96ss!M-Rx9VTpgNTu?~bss=TEY`(Osq zv7W>gwr$lN8?zXmr^{pGdW9AR8^t&`&@P*yf(n!{TL93br%0v#H>|aJYGXxcIxyIx+?dJ1?%kuOZ}|)^NYJ z_WA#k)d|~(9Kq&<**uFA&om`37AM})n!Tm{Ne!wV9x6D}tJ98J2y*m9lVhK{d*tXz zCPz=MbUFrYZ!%Z~xK;~%+AtVHWmXg3a|wf^c=IwY6S%j)vnf6@JXnMTF1mr68?;BkxM3kIi3j~4|Yox_(Y7@G0zx*YXxo;c$L7n2z)27 z&Vy^wD4^D9w3CGIGWoej@PFUqajks*yy~u z77Z662+mFtwspglECc2|4EA`i%dfy8M8Z5L2s}aHIRdu}e3QU;3;ck}WI(>@N_=Z3|(J zeC35LS{_Gu3q08UoBRB&_=YR`N8DjNBQ2VO*J~|Nz%^d zHtmPNe7}TKCZ7Es9gP^A?2{xE#Z@|DoSp?>B)! z<{`}Wgk;J0OPG0ly0%Z@`yDBG2=o0;0OtE8%<=eidB2%w+tjU(A_1l?E6X&k;|lQwSly?xd2XzLHsn5Oa!I@Zyp zyT<;?c;d3%LxzMd4|u4&^%EgEe`QXh*2aw?6-)NLy<~WN%MQA?p!=seE%f5aE)TYR zDgFSSlg*t(Jf3X%j4?b#9#61bNnePpHkQ>dyz1<+zSV{|9jpcfRgH$hhDY@V5VJzm zP+=C;pK{I$(nFM4WF8~_h=vqiPIdGm>m0Eld3PgdevSoE2}7K#n>~V^LvvH(QfcUL zBs+&OW5$hzkprB+@ADaWOmx}uo?_IFu{#}rt#g=0KD{64Syr+of^Z3Hm@-_#oXfU} zS#t4LGQVi2m_L`lQ4pzBWw#3tFU7x(8WlKn&6MN((+OdA)Mh+H4OxauRQiOQeP|K+ z8Svj?9#{R2MVv^JF@Wf_IifiRR$HCHK*!lrqq_s zS(nf@&M9zMA*(=N7u?19T%=P%iA8qf5LGKOhs}!2;oyqQ{yxY}dL81hzan#(S7i2? zctz&0QXdQZ0a~3bu#0mXbzSV@d?HSdZWm|TKSo`smB{Acv}7R;k(C?;ufFW3FO|r` zy!vw3TYXt2?61BYQ;RLf)MCpqwb*h@Ew&s}i!I00V#_gFY&oVETaM|)mSbwM<(OV< zIi?m{j;Y0#V|uaWm|AQ(W)@q9Zx&kyGK(z(@nXw>da-2ywb(Lzwb(NJQ|DMXdW$Us ztHqXMda>o0S!_9`b;e?5vE`UvY&m8YTaM|)mSbkI<(OVBW{~X0c_YuNGT|uNGT|uNGT|uNGT|uNGT|uNGT|uNGT|uNGT|Pm3+XQ;RLf zyv3G55sNJsb)s!i^*L*IW@^f)4YpIc!}B!rU|OQQDUO-=&-Im;sGbLRZKmf~Prw$N zS@X3XPqEpx`KumJoEmtXr8o8N+IqPAy!4H|yD&*u+WGL-!2Zo8N4W&IVY*D!S8jP+AoEG?N z0-uh`!u;n5+$3Ubfr>|MgC-sc@TJ9y$ zwLU%9XoBqbLU{PD!y&`TzV5&FJ6z{IBRQ|1N!>-qrkK${B*yoyL zp#Bc09%#1XJ}0$8j-9}fVhp-@=G0%&Aeisl5KiBRHI2(g*PgS2t@?8}{2%RGEq7c; z`l?#ovf#sfRgD@oc8vO{QeRaOWj+2MC~*BG^H-Ig`O_jf9p3mHHHPb-tX)QkRznW{ zgb9>2?SuF$ng1hvRgL6`$w!r^{LuC)=2ZEde>x$|ZV*6&;bj{6%zxBhB@XSAsUs@L z*LvE`RQyf(TKTi--?62VqrMD6=F1=y{4xl6rXuFcAmo1;g!s$AXW}n|kp4381N4_c zNL!19eYz$TssQfK2SeE?B*gvskk_BrS9!asST?=x2Na!BbaN#dlaT*@cl4`S)h>Q5 zP&1$1{PTdYe8`S{6Hbpr(0v@I)Ew52oY#Co%lVdR@fzpNYinL<_1I>$ELqTMMVptd z`cQiVPM9!el;38Rs5Yw@6B&9em)oqpB8Svwol0`baQqBQaWYFX2YQGD8+xGo<>kh98=Vsf5s*`)q3Bnr$Csb{6wXHDo1vxJ=_oe?_(7Ra{NA& z{QGo}IuqJ|8vQR+fcf8bk@bQs_Sc0WLjTc zdqE1DMW--Zl#7i0z^uYqYnE5HFJktZmX$5@$*#AF;yMl0%Z^e^sp^@tXVha6is>_J zCZ%R45n(pDX68jRdf-o~uuzVRX4TJ3rf5v-l1Zo_g(}wimc`8zu~krY>xw1DEcjcL zpCZ&C&QI;kYISqdYLF|sL7krf88?`VOrLK#xF=vwyBy?Ea6O(ZFqN=8Q|StW`K8xnE~VZ9y0?b@J(h0 zVDi!2W>&~(zR|3ZvEH2`C~&U{y3JL18FR^)dR0AhdJ=1!sEr7<@G=4>dWDt|P|f+{ zD#}sSc$rZ3sJX4Wb@9^1wq{JCsO=GBl#4W)WG^ezld0O7RW+%ZGg8$v>g)6XEY~b# zFc_MgR5xuV%-Bs~XNA-7ZOSllh4YxW#^<aJQ%|8Uk<8xmWma`zYUb?vEE9k*iI|+Pi|at=EVw~L>W+P80aGLuZO(rr%j(Uv1-<&K#j=F5iIcBJhPLj zYE*ZAcX6k>zI7aZSXMJL<8?&BSp{#Ckh9*hcB*o!a%RGN8NXaMg&LMlzVt zXg>y16?2EH7`PS8SrU_0Hp4hQbPpBB4)ixnh9*s)U0YQ@jp{zVFsdfg%V@@=x%H{~ ziCjB!@~FLAt1qrb4aka0Or_{*KPfnsG8XBVQznYPk3;15_;@dM7PK`lo3>=?)wJq? z6~zZf%A+{*SG2Feu3uFY7E)mzg~KLNSb+?iXkq<|mCbEf3}WGu#zl%DGKL}!lAYyv zRWG`V(=JkR2%1A3ATZ#)LTN;)JCG7Ir+r>^dz*TW5nMtq_moefQ199py=f^>QxHb& zIL92PcNIcCnt94~{&}H^^B$8yq*E{@<(_HWuL^eUt+mN{69)1zD5 z;BLN9&r5v^r{#xmD1M5g;P2SrA_@E*>+K3!s6J?QEH+B{=ywTq)x?#nCazpHapkIs zD_2cixoYCdrHLz7Ph7cr;>uMMSFWD8a@E9@t0t~oJ#po#i7VGkT){UJS3qXs3Wz7J z0QJNbfSS01uO_bGW8w-&Z{iAAOtA>SFWD8a?Qk*t0%5pGjZkWi7VGkT)BGU z$~6;LuAaDZ&BT?fC$3yGapmfXE7we1A$>J*1z$~E!B-Pk@YTc>d^K?eUrk)WR})w8 z)x;Hinz(|eCazp>;tCWoaTT8iZ5q|6=A5`ft*41A>O*IR=WF7MzWbZ3{7qcx_&?!K zT+xHzO`<4^NddxdSUWb4m>v}xR~agk|ssd>d(2ZB;+&sEl+Qr4FQI7)I{ zb7A|uWZQha$*j*&sCQNhgWSbStGoa{DYY8_CrY|HDYY-0Z@wti+lWtkO`bJm2)<0M zaa5+>+4+GpQm^#GXlTSgyMxXuQdHVB-FZk&cIv6lLzwE^cRyJuhTh+KZL}+W{pQWI zVc4m^IC%Ko?%fX`+&1YAYgPZ1u_xk~9KGF%J+b-WpFFzZx$C=2x^_SOlWm(jqFq(n zegfVqoZa5Bc}sePy?sGT|tX8 z=U&@sW$r$To36O|#bU)-)iJ%%t~;&q>(BqxE`Mp7qJ7~-+zWWp5A-Ta-`Hu=uvUHj z`6oj+BP_kS;J^RdwO*>S5-(kgU#0cMm)!$jeAzni1;jeFmExjYeEntXIcpWi)`{5c z?VX!FGnA3iAt#grGv2LO?ApIlygpNfTtC-?n za%`sf^~(gg%~J!79&%IrqBE}`dE_Yx)kdoXFvJTH;%I*&9KJ3RDv~Cj7h`<-S&M)#wqwsSoc*n2t@C>u*tu&xp;v(JYg>zu$K%9z zUmGF{^};@9uWSex|HYVnhDv*fqnpCT{|LoOv6WlYUiYeV%`5(|eQhX?fVJyFrDe|g zSN?<@(i~foRN^on{apDg≧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%0AB zSC++bh16VGsF0g`Z8AAW)SO5wf{Qw&=1L_|<7iggk6Lj^&i#(5?AvGOc?60&nVx%Q zUViQgc?o(RL6yZBx@YF4=t9WN(entZEKbrrGcQZ`guFC8kD$upJl!+%5_M0=%hdA- zsw_^`Ju@#?_k_G;J&Ν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 KVmQi6u>LRp$|r>Y literal 0 HcmV?d00001 diff --git a/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_eabi.lib b/gpio_driverlib_cpu1/device/driverlib/ccs/Release/driverlib_eabi.lib new file mode 100644 index 0000000000000000000000000000000000000000..1464424a687bd967a299d6872969a911df13f136 GIT binary patch literal 654036 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_driverlib_cpu1/device/driverlib/cla.c b/gpio_driverlib_cpu1/device/driverlib/cla.c new file mode 100644 index 0000000..d933af4 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cla.c @@ -0,0 +1,89 @@ +//########################################################################### +// +// FILE: cla.c +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cla.h" + +//***************************************************************************** +// +// CLA_setTriggerSource() +// +//***************************************************************************** +void +CLA_setTriggerSource(CLA_TaskNumber taskNumber, CLA_Trigger trigger) +{ + uint32_t srcSelReg; + uint32_t shiftVal; + + // + // Calculate the shift value for the specified task. + // + shiftVal = ((uint32_t)taskNumber * SYSCTL_CLA1TASKSRCSEL1_TASK2_S) % 32U; + + // + // Calculate the register address for the specified task. + // + if(taskNumber <= CLA_TASK_4) + { + // + // Tasks 1-4 + // + srcSelReg = (uint32_t)DMACLASRCSEL_BASE + SYSCTL_O_CLA1TASKSRCSEL1; + } + else + { + // + // Tasks 5-8 + // + srcSelReg = (uint32_t)DMACLASRCSEL_BASE + SYSCTL_O_CLA1TASKSRCSEL2; + } + + EALLOW; + + // + // Write trigger selection to the appropriate register. + // + HWREG(srcSelReg) &= ~((uint32_t)SYSCTL_CLA1TASKSRCSEL1_TASK1_M + << shiftVal); + HWREG(srcSelReg) = HWREG(srcSelReg) | ((uint32_t)trigger << shiftVal); + + EDIS; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/cla.h b/gpio_driverlib_cpu1/device/driverlib/cla.h new file mode 100644 index 0000000..fee905c --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cla.h @@ -0,0 +1,984 @@ +//########################################################################### +// +// FILE: cla.h +// +// TITLE: CLA Driver Implementation File +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CLA_H +#define CLA_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup cla_api CLA +//! \brief This module is used for configurating CLA. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "cpu.h" +#include "debug.h" +#include "inc/hw_cla.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define CLA_NUM_EOT_INTERRUPTS (8U) + + +//***************************************************************************** +// +// Values that can be passed to CLA_clearTaskFlags(), CLA_forceTasks(), +// and CLA_enableTasks(), CLA_disableTasks(), and CLA_enableSoftwareInterrupt() +// as the taskFlags parameter. +// +//***************************************************************************** +#define CLA_TASKFLAG_1 (0x01U) //!< CLA Task 1 Flag +#define CLA_TASKFLAG_2 (0x02U) //!< CLA Task 2 Flag +#define CLA_TASKFLAG_3 (0x04U) //!< CLA Task 3 Flag +#define CLA_TASKFLAG_4 (0x08U) //!< CLA Task 4 Flag +#define CLA_TASKFLAG_5 (0x10U) //!< CLA Task 5 Flag +#define CLA_TASKFLAG_6 (0x20U) //!< CLA Task 6 Flag +#define CLA_TASKFLAG_7 (0x40U) //!< CLA Task 7 Flag +#define CLA_TASKFLAG_8 (0x80U) //!< CLA Task 8 Flag +#define CLA_TASKFLAG_ALL (0xFFU) //!< CLA All Task Flag + +//***************************************************************************** +// +//! Values that can be passed to CLA_getPendingTaskFlag(), +//! CLA_getTaskOverflowFlag(), CLA_getTaskRunStatus(), CLA_setTriggerSource(), +//! CLA_registerEndOfTaskInterrupt(), and CLA_unregisterEndOfTaskInterrupt() +//! as the taskNumber parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_TASK_1, //!< CLA Task 1 + CLA_TASK_2, //!< CLA Task 2 + CLA_TASK_3, //!< CLA Task 3 + CLA_TASK_4, //!< CLA Task 4 + CLA_TASK_5, //!< CLA Task 5 + CLA_TASK_6, //!< CLA Task 6 + CLA_TASK_7, //!< CLA Task 7 + CLA_TASK_8 //!< CLA Task 8 +} CLA_TaskNumber; + +#ifdef __TMS320C28XX__ // These enums are only accessible by C28x +//***************************************************************************** +// +//! Values that can be passed to CLA_mapTaskVector() as the \e claIntVect +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_MVECT_1 = CLA_O_MVECT1, //!< Task Interrupt Vector 1 + CLA_MVECT_2 = CLA_O_MVECT2, //!< Task Interrupt Vector 2 + CLA_MVECT_3 = CLA_O_MVECT3, //!< Task Interrupt Vector 3 + CLA_MVECT_4 = CLA_O_MVECT4, //!< Task Interrupt Vector 4 + CLA_MVECT_5 = CLA_O_MVECT5, //!< Task Interrupt Vector 5 + CLA_MVECT_6 = CLA_O_MVECT6, //!< Task Interrupt Vector 6 + CLA_MVECT_7 = CLA_O_MVECT7, //!< Task Interrupt Vector 7 + CLA_MVECT_8 = CLA_O_MVECT8 //!< Task Interrupt Vector 8 +} CLA_MVECTNumber; + +//***************************************************************************** +// +//! Values that can be passed to CLA_setTriggerSource() as the \e trigger +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLA_TRIGGER_SOFTWARE = 0U, //!< CLA Task Trigger Source is Software + + CLA_TRIGGER_ADCA1 = 1U, //!< CLA Task Trigger Source is ADCA1 + CLA_TRIGGER_ADCA2 = 2U, //!< CLA Task Trigger Source is ADCA2 + CLA_TRIGGER_ADCA3 = 3U, //!< CLA Task Trigger Source is ADCA3 + CLA_TRIGGER_ADCA4 = 4U, //!< CLA Task Trigger Source is ADCA4 + CLA_TRIGGER_ADCAEVT = 5U, //!< CLA Task Trigger Source is ADCAEVT + CLA_TRIGGER_ADCB1 = 6U, //!< CLA Task Trigger Source is ADCB1 + CLA_TRIGGER_ADCB2 = 7U, //!< CLA Task Trigger Source is ADCB2 + CLA_TRIGGER_ADCB3 = 8U, //!< CLA Task Trigger Source is ADCB3 + CLA_TRIGGER_ADCB4 = 9U, //!< CLA Task Trigger Source is ADCB4 + CLA_TRIGGER_ADCBEVT = 10U, //!< CLA Task Trigger Source is ADCBEVT + CLA_TRIGGER_ADCC1 = 11U, //!< CLA Task Trigger Source is ADCC1 + CLA_TRIGGER_ADCC2 = 12U, //!< CLA Task Trigger Source is ADCC2 + CLA_TRIGGER_ADCC3 = 13U, //!< CLA Task Trigger Source is ADCC3 + CLA_TRIGGER_ADCC4 = 14U, //!< CLA Task Trigger Source is ADCC4 + CLA_TRIGGER_ADCCEVT = 15U, //!< CLA Task Trigger Source is ADCCEVT + CLA_TRIGGER_ADCD1 = 16U, //!< CLA Task Trigger Source is ADCD1 + CLA_TRIGGER_ADCD2 = 17U, //!< CLA Task Trigger Source is ADCD2 + CLA_TRIGGER_ADCD3 = 18U, //!< CLA Task Trigger Source is ADCD3 + CLA_TRIGGER_ADCD4 = 19U, //!< CLA Task Trigger Source is ADCD4 + CLA_TRIGGER_ADCDEVT = 20U, //!< CLA Task Trigger Source is ADCDEVT + + CLA_TRIGGER_XINT1 = 29U, //!< CLA Task Trigger Source is XINT1 + CLA_TRIGGER_XINT2 = 30U, //!< CLA Task Trigger Source is XINT2 + CLA_TRIGGER_XINT3 = 31U, //!< CLA Task Trigger Source is XINT3 + CLA_TRIGGER_XINT4 = 32U, //!< CLA Task Trigger Source is XINT4 + CLA_TRIGGER_XINT5 = 33U, //!< CLA Task Trigger Source is XINT5 + + CLA_TRIGGER_EPWM1INT = 36U, //!< CLA Task Trigger Source is EPWM1INT + CLA_TRIGGER_EPWM2INT = 37U, //!< CLA Task Trigger Source is EPWM2INT + CLA_TRIGGER_EPWM3INT = 38U, //!< CLA Task Trigger Source is EPWM3INT + CLA_TRIGGER_EPWM4INT = 39U, //!< CLA Task Trigger Source is EPWM4INT + CLA_TRIGGER_EPWM5INT = 40U, //!< CLA Task Trigger Source is EPWM5INT + CLA_TRIGGER_EPWM6INT = 41U, //!< CLA Task Trigger Source is EPWM6INT + CLA_TRIGGER_EPWM7INT = 42U, //!< CLA Task Trigger Source is EPWM7INT + CLA_TRIGGER_EPWM8INT = 43U, //!< CLA Task Trigger Source is EPWM8INT + CLA_TRIGGER_EPWM9INT = 44U, //!< CLA Task Trigger Source is EPWM9INT + CLA_TRIGGER_EPWM10INT = 45U, //!< CLA Task Trigger Source is EPWM10INT + CLA_TRIGGER_EPWM11INT = 46U, //!< CLA Task Trigger Source is EPWM11INT + CLA_TRIGGER_EPWM12INT = 47U, //!< CLA Task Trigger Source is EPWM12INT + + + CLA_TRIGGER_TINT0 = 68U, //!< CLA Task Trigger Source is TINT0 + CLA_TRIGGER_TINT1 = 69U, //!< CLA Task Trigger Source is TINT1 + CLA_TRIGGER_TINT2 = 70U, //!< CLA Task Trigger Source is TINT2 + + CLA_TRIGGER_MXINTA = 71U, //!< CLA Task Trigger Source is MXINTA + CLA_TRIGGER_MRINTA = 72U, //!< CLA Task Trigger Source is MRINTA + CLA_TRIGGER_MXINTB = 73U, //!< CLA Task Trigger Source is MXINTB + CLA_TRIGGER_MRINTB = 74U, //!< CLA Task Trigger Source is MRINTB + + CLA_TRIGGER_ECAP1INT = 75U, //!< CLA Task Trigger Source is ECAP1INT + CLA_TRIGGER_ECAP2INT = 76U, //!< CLA Task Trigger Source is ECAP2INT + CLA_TRIGGER_ECAP3INT = 77U, //!< CLA Task Trigger Source is ECAP3INT + CLA_TRIGGER_ECAP4INT = 78U, //!< CLA Task Trigger Source is ECAP4INT + CLA_TRIGGER_ECAP5INT = 79U, //!< CLA Task Trigger Source is ECAP5INT + CLA_TRIGGER_ECAP6INT = 80U, //!< CLA Task Trigger Source is ECAP6INT + + CLA_TRIGGER_EQEP1INT = 83U, //!< CLA Task Trigger Source is EQEP1INT + CLA_TRIGGER_EQEP2INT = 84U, //!< CLA Task Trigger Source is EQEP2INT + CLA_TRIGGER_EQEP3INT = 85U, //!< CLA Task Trigger Source is EQEP3INT + + + CLA_TRIGGER_SDFM1INT = 95U, //!< CLA Task Trigger Source is SDFM1INT + CLA_TRIGGER_SDFM2INT = 96U, //!< CLA Task Trigger Source is SDFM2INT + + + + CLA_TRIGGER_UPP1INT = 107U, //!< CLA Task Trigger Source is UPP1INT + + CLA_TRIGGER_SPITXAINT = 109U, //!< CLA Task Trigger Source is SPITXAINT + CLA_TRIGGER_SPIRXAINT = 110U, //!< CLA Task Trigger Source is SPIRXAINT + CLA_TRIGGER_SPITXBINT = 111U, //!< CLA Task Trigger Source is SPITXBINT + CLA_TRIGGER_SPIRXBINT = 112U, //!< CLA Task Trigger Source is SPIRXBINT + CLA_TRIGGER_SPITXCINT = 113U, //!< CLA Task Trigger Source is SPITXCINT + CLA_TRIGGER_SPIRXCINT = 114U, //!< CLA Task Trigger Source is SPIRXCINT + + + + + + CLA_TRIGGER_CLB1INT = 127, //!< CLA Task Trigger Source is CLB1INT + CLA_TRIGGER_CLB2INT = 128, //!< CLA Task Trigger Source is CLB2INT + CLA_TRIGGER_CLB3INT = 129, //!< CLA Task Trigger Source is CLB3INT + CLA_TRIGGER_CLB4INT = 130, //!< CLA Task Trigger Source is CLB4INT + +} CLA_Trigger; +#endif // __TMS320C28XX__ + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a CLA base address. +//! +//! \param base is the base address of the CLA controller. +//! +//! This function determines if a CLA controller base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CLA_isBaseValid(uint32_t base) +{ + return(base == CLA1_BASE); +} +#endif + +#ifdef __TMS320C28XX__ // These functions are only accessible from the C28x +//***************************************************************************** +// +//! Map CLA Task Interrupt Vector +//! +//! \param base is the base address of the CLA controller. +//! \param claIntVect is CLA interrupt vector (MVECT1 to MVECT8) +//! the value of claIntVect can be any of the following: +//! - \b CLA_MVECT_1 - Task Interrupt Vector 1 +//! - \b CLA_MVECT_2 - Task Interrupt Vector 2 +//! - \b CLA_MVECT_3 - Task Interrupt Vector 3 +//! - \b CLA_MVECT_4 - Task Interrupt Vector 4 +//! - \b CLA_MVECT_5 - Task Interrupt Vector 5 +//! - \b CLA_MVECT_6 - Task Interrupt Vector 6 +//! - \b CLA_MVECT_7 - Task Interrupt Vector 7 +//! - \b CLA_MVECT_8 - Task Interrupt Vector 8 +//! \param claTaskAddr is the start address of the code for task +//! +//! Each CLA Task (1 to 8) has its own MVECTx register. When a task is +//! triggered, the CLA loads the MVECTx register of the task in question +//! to the MPC (CLA program counter) and begins execution from that point. +//! The CLA has a 16-bit address bus, and can therefore, access the lower +//! 64 KW space. The MVECTx registers take an address anywhere in this space. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_mapTaskVector(uint32_t base, CLA_MVECTNumber claIntVect, + uint16_t claTaskAddr) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + HWREGH(base + (uint16_t)claIntVect) = claTaskAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Hard Reset +//! +//! \param base is the base address of the CLA controller. +//! +//! This function will cause a hard reset of the CLA and set all CLA registers +//! to their default state. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_performHardReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Hard reset of the CLA + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_HARDRESET; + + EDIS; + + // + // Wait for few cycles till the reset is complete + // + NOP; + NOP; + NOP; +} + +//***************************************************************************** +// +//! Soft Reset +//! +//! \param base is the base address of the CLA controller. +//! +//! This function will cause a soft reset of the CLA. This will stop the +//! current task, clear the MIRUN flag and clear all bits in the MIER register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_performSoftReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Soft reset of the CLA + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_SOFTRESET; + + EDIS; + + // + // Wait for few cycles till the reset is complete + // + NOP; + NOP; + NOP; +} + +//***************************************************************************** +// +//! IACK enable +//! +//! \param base is the base address of the CLA controller. +//! +//! This function enables the main CPU to use the IACK #16bit instruction to +//! set MIFR bits in the same manner as writing to the MIFRC register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableIACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable the main CPU to use the IACK #16bit instruction + // + HWREGH(base + CLA_O_MCTL) |= CLA_MCTL_IACKE; + + EDIS; +} + +//***************************************************************************** +// +//! IACK disable +//! +//! \param base is the base address of the CLA controller. +//! +//! This function disables the main CPU to use the IACK #16bit instruction to +//! set MIFR bits in the same manner as writing to the MIFRC register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableIACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable the main CPU to use the IACK #16bit instruction + // + HWREGH(base + CLA_O_MCTL) &= ~CLA_MCTL_IACKE; + + EDIS; +} + +//***************************************************************************** +// +//! Query task N to see if it is flagged and pending execution +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the interrupt flag register +//! corresponds to a CLA task. The corresponding bit is automatically set +//! when the task is triggered (either from a peripheral, through software, or +//! through the MIFRC register). The bit gets cleared when the CLA starts to +//! execute the flagged task. +//! +//! \return \b True if the queried task has been triggered but pending +//! execution. +// +//***************************************************************************** +static inline bool +CLA_getPendingTaskFlag(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIFR) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get status of All Task Interrupt Flag +//! +//! \param base is the base address of the CLA controller. +//! +//! This function gets the value of the interrupt flag register (MIFR) +//! +//! \return the value of Interrupt Flag Register (MIFR) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllPendingTaskFlags(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return the Interrupt Flag Register (MIFR) since that is what was + // requested. + // + status = HWREGH(base + CLA_O_MIFR); + + // + // Return the Interrupt Flag Register value + // + return(status); +} + +//***************************************************************************** +// +//! Get status of Task n Interrupt Overflow Flag +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the overflow flag register +//! corresponds to a CLA task, This bit is set when an interrupt overflow event +//! has occurred for the specific task. +//! +//! \return True if any of task interrupt overflow has occurred. +// +//***************************************************************************** +static inline bool +CLA_getTaskOverflowFlag(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIOVF) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get status of All Task Interrupt Overflow Flag +//! +//! \param base is the base address of the CLA controller. +//! +//! This function gets the value of the Interrupt Overflow Flag Register +//! +//! \return the value of Interrupt Overflow Flag Register(MIOVF) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllTaskOverflowFlags(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return Interrupt Overflow Flag Register(MIOVF) since that is what + // was requested. + // + status = HWREGH(base + CLA_O_MIOVF); + + // + // Return the Interrupt Overflow Flag Register + // + return(status); +} + +//***************************************************************************** +// +//! Clear the task interrupt flag +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be cleared +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to clear all flags. +//! +//! This function is used to manually clear bits in the interrupt +//! flag (MIFR) register +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_clearTaskFlags(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + //Modify protected register + // + EALLOW; + + // + // Clear the task interrupt flag + // + HWREGH(base + CLA_O_MICLR) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Force a CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be forced +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to force all tasks. +//! +//! This function forces a task through software. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_forceTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Force the task interrupt. + // + HWREGH(base + CLA_O_MIFRC) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Enable CLA task(s) +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be enabled +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to enable all tasks +//! +//! This function allows an incoming interrupt or main CPU software to +//! start the corresponding CLA task. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Enable CLA task + // + HWREGH(base + CLA_O_MIER) |= taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Disable CLA task interrupt +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks' flags to be disabled +//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL +//! to disable all tasks +//! +//! This function disables CLA task interrupt by setting the MIER register bit +//! to 0, while the corresponding task is executing this will have no effect +//! on the task. The task will continue to run until it hits the MSTOP +//! instruction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableTasks(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + EALLOW; + + // + // Disable CLA task interrupt + // + HWREGH(base + CLA_O_MIER) &= ~taskFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Get the value of a task run status +//! +//! \param base is the base address of the CLA controller. +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. Do not use CLA_TASKFLAG_ALL. +//! +//! This function gets the status of each bit in the Interrupt Run Status +//! Register which indicates whether the task is currently executing +//! +//! \return True if the task is executing. +// +//***************************************************************************** +static inline bool +CLA_getTaskRunStatus(uint32_t base, CLA_TaskNumber taskNumber) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Read the run status register and return the appropriate value. + // + return(((HWREGH(base + CLA_O_MIRUN) >> (uint16_t)taskNumber) & 1U) != 0U); +} + +//***************************************************************************** +// +//! Get the value of all task run status +//! +//! \param base is the base address of the CLA controller. +//! +//! This function indicates which task is currently executing. +//! +//! \return the value of Interrupt Run Status Register (MIRUN) +// +//***************************************************************************** +static inline uint16_t +CLA_getAllTaskRunStatus(uint32_t base) +{ + uint16_t status; + + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Just return the Interrupt Run Status Register since that is what was + // requested. + // + status = HWREGH(base + CLA_O_MIRUN); + + // + // Return the Interrupt Run Status Register (MIRUN) + // + return(status); +} +#endif // #ifdef __TMS320C28XX__ + +// +// These functions are accessible only from the CLA (Type - 1/2) +// +#if defined(__TMS320C28XX_CLA1__) || defined(__TMS320C28XX_CLA2__) +//***************************************************************************** +// +//! Enable the Software Interrupt for a given CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks for which software +//! interrupts are to be enabled, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to enable software interrupts of all tasks +//! +//! This function enables the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 1 to the task's bit in the +//! CLA1SOFTINTEN register. By setting a task's SOFTINT bit, you disable its +//! ability to generate an end-of-task interrupt +//! For example, if we enable Task 2's SOFTINT bit, we disable its ability to +//! generate an end-of-task interrupt, but now any running CLA task has the +//! ability to force task 2's interrupt (through the CLA1INTFRC register) to +//! the main CPU. This interrupt will be handled by the End-of-Task 2 interrupt +//! handler even though the interrupt was not caused by Task 2 running to +//! completion. This allows programmers to generate interrupts while a control +//! task is running. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Enabling a given task's software interrupt enable bit disables that +//! task's ability to generate an End-of-Task interrupt to the main CPU, +//! however, should another task force its interrupt (through the CLA1INTFRC +//! register), it will be handled by that task's End-of-Task Interrupt Handler. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_enableSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Enable Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTEN) |= taskFlags; + + __medis(); +} + +//***************************************************************************** +// +//! Disable the Software Interrupt for a given CLA Task +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the tasks for which software +//! interrupts are to be disabled, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to disable software interrupts of all +//! tasks +//! +//! This function disables the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 0 to the task's bit in the +//! CLA1SOFTINTEN register. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Disabling a given task's software interrupt ability allows that +//! task to generate an End-of-Task interrupt to the main CPU. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_disableSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Enable Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTEN) &= ~taskFlags; + + __medis(); +} +//***************************************************************************** +// +//! Force a particular Task's Software Interrupt +//! +//! \param base is the base address of the CLA controller. +//! \param taskFlags is the bitwise OR of the task's whose software +//! interrupts are to be forced, CLA_TASKFLAG_N where N is the task number +//! from 1 to 8, or CLA_TASKFLAG_ALL to force software interrupts for all tasks +//! +//! This function forces the Software Interrupt for a single, or set of, CLA +//! task(s). It does this by writing a 1 to the task's bit in the +//! CLA1INTFRC register. +//! For example, if we enable Task 2's SOFTINT bit, we disable its ability to +//! generate an end-of-task interrupt, but now any running CLA task has the +//! ability to force task 2's interrupt (through the CLA1INTFRC register) to +//! the main CPU. This interrupt will be handled by the End-of-Task 2 interrupt +//! handler even though the interrupt was not caused by Task 2 running to +//! completion. This allows programmers to generate interrupts while a control +//! task is running. +//! +//! \note +//! -# The CLA1SOFTINTEN and CLA1INTFRC are only writable from the CLA. +//! -# Enabling a given task's software interrupt enable bit disables that +//! task's ability to generate an End-of-Task interrupt to the main CPU, +//! however, should another task force its interrupt (through the CLA1INTFRC +//! register), it will be handled by that task's End-of-Task Interrupt Handler. +//! -# This function will set the INTFRC bit for a task, but does not check +//! that its SOFTINT bit is set. It falls to the user to ensure that software +//! interrupt for a given task is enabled before it can be forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CLA_forceSoftwareInterrupt(uint32_t base, uint16_t taskFlags) +{ + // + // Check the arguments. + // + ASSERT(CLA_isBaseValid(base)); + + // + // Modify protected register + // + __meallow(); + + // + // Force Software Interrupt + // + HWREGH(base + CLA_O_SOFTINTFRC) |= taskFlags; + + __medis(); +} + +#endif // #if defined(__TMS320C28XX_CLA1__) || defined(__TMS320C28XX_CLA2__) + +// +// These functions can only be called from the C28x +// +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! Configures CLA task triggers. +//! +//! \param taskNumber is the number of the task CLA_TASK_N where N is a number +//! from 1 to 8. +//! \param trigger is the trigger source to be assigned to the selected task. +//! +//! This function configures the trigger source of a CLA task. The +//! \e taskNumber parameter indicates which task is being configured, and the +//! \e trigger parameter is the interrupt source from a specific peripheral +//! interrupt (or software) that will trigger the task. +//! +//! \return None. +// +//***************************************************************************** +extern void +CLA_setTriggerSource(CLA_TaskNumber taskNumber, CLA_Trigger trigger); + +#endif //#ifdef __TMS320C28XX__ +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CLA_H diff --git a/gpio_driverlib_cpu1/device/driverlib/clb.c b/gpio_driverlib_cpu1/device/driverlib/clb.c new file mode 100644 index 0000000..2e79cb4 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/clb.c @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: clb.c +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "clb.h" + +//***************************************************************************** +// +// CLB_configCounterLoadMatch +// +//***************************************************************************** +void CLB_configCounterLoadMatch(uint32_t base, CLB_Counters counterID, + uint32_t load, uint32_t match1, uint32_t match2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + switch(counterID) + { + case CLB_CTR0: + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_0_MATCH2, match2); + break; + + case CLB_CTR1: + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_1_MATCH2, match2); + break; + + case CLB_CTR2: + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_LOAD, load); + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_MATCH1, match1); + CLB_writeInterface(base, CLB_ADDR_COUNTER_2_MATCH2, match2); + break; + + default: + // + // Invalid counterID value + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// CLB_clearFIFOs +// +//***************************************************************************** +void CLB_clearFIFOs(uint32_t base) +{ + uint16_t i; + + ASSERT(CLB_isBaseValid(base)); + + for(i = 0U; i < CLB_FIFO_SIZE; i++) + { + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(i)) = 0U; + } + + HWREG(base + CLB_LOGICCTL + CLB_O_BUF_PTR) = 0U; +} + +//***************************************************************************** +// +// CLB_writeFIFOs +// +//***************************************************************************** +void CLB_writeFIFOs(uint32_t base , const uint32_t pullData[]) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Clear the FIFO and pointer + // + CLB_clearFIFOs(base); + + // + // Write data into the FIFO. + // + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(0U)) = pullData[0U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(1U)) = pullData[1U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(2U)) = pullData[2U]; + HWREG(base + CLB_DATAEXCH + CLB_O_PULL(3U)) = pullData[3U]; +} + +//***************************************************************************** +// +// CLB_readFIFOs +// +//***************************************************************************** +void CLB_readFIFOs(uint32_t base , uint32_t pushData[]) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Read data from the FIFO. + // + pushData[0U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(0U)) ; + pushData[1U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(1U)) ; + pushData[2U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(2U)) ; + pushData[3U] = HWREG(base + CLB_DATAEXCH + CLB_O_PUSH(3U)) ; +} + + diff --git a/gpio_driverlib_cpu1/device/driverlib/clb.h b/gpio_driverlib_cpu1/device/driverlib/clb.h new file mode 100644 index 0000000..37cb68f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/clb.h @@ -0,0 +1,1290 @@ +//########################################################################### +// +// FILE: clb.h +// +// TITLE: C28x CLB driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CLB_H +#define CLB_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup clb_api CLB +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_clb.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Address offsets from LOGICCFG to LOGICCTL and DATAEXCH register memory maps +// +//***************************************************************************** +#define CLB_LOGICCTL 0x0100U +#define CLB_DATAEXCH 0x0200U + +//***************************************************************************** +// +// Address offsets for CLB-internal memory space +// +//***************************************************************************** +#define CLB_ADDR_COUNTER_0_LOAD 0x0U +#define CLB_ADDR_COUNTER_1_LOAD 0x1U +#define CLB_ADDR_COUNTER_2_LOAD 0x2U + +#define CLB_ADDR_COUNTER_0_MATCH1 0x4U +#define CLB_ADDR_COUNTER_1_MATCH1 0x5U +#define CLB_ADDR_COUNTER_2_MATCH1 0x6U + +#define CLB_ADDR_COUNTER_0_MATCH2 0x8U +#define CLB_ADDR_COUNTER_1_MATCH2 0x9U +#define CLB_ADDR_COUNTER_2_MATCH2 0xAU + +#define CLB_ADDR_HLC_R0 0xCU +#define CLB_ADDR_HLC_R1 0xDU +#define CLB_ADDR_HLC_R2 0xEU +#define CLB_ADDR_HLC_R3 0xFU + +#define CLB_ADDR_HLC_BASE 0x20U +#define CLB_NUM_HLC_INSTR 31U + +//***************************************************************************** +// +// PUSH/PULL FIFO size (32-bit registers) +// +//***************************************************************************** +#define CLB_FIFO_SIZE 4U + +//***************************************************************************** +// +// Key to enable writes to the CLB registers +// +//***************************************************************************** +#define CLB_LOCK_KEY 0x5A5AU + +//***************************************************************************** +// +// Shift and masks needed by the API for Input selection +// +//***************************************************************************** +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_M 0x20U +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_S 28U +#define CLB_LCL_MUX_SEL_MISC_INPUT_SEL_BITM (uint32_t)1U + +//***************************************************************************** +// +//! Values that can be passed to control the CLB output enable signal. It can +//! be passed to CLB_setOutputMask() as the \e outputMask parameter. +// +//***************************************************************************** +#define CLB_OUTPUT_00 0x00000001U //!< Mask for CLB OUTPUT ENABLE/DISABLE 0 +#define CLB_OUTPUT_01 0x00000002U //!< Mask for CLB OUTPUT ENABLE/DISABLE 1 +#define CLB_OUTPUT_02 0x00000004U //!< Mask for CLB OUTPUT ENABLE/DISABLE 2 +#define CLB_OUTPUT_03 0x00000008U //!< Mask for CLB OUTPUT ENABLE/DISABLE 3 +#define CLB_OUTPUT_04 0x00000010U //!< Mask for CLB OUTPUT ENABLE/DISABLE 4 +#define CLB_OUTPUT_05 0x00000020U //!< Mask for CLB OUTPUT ENABLE/DISABLE 5 +#define CLB_OUTPUT_06 0x00000040U //!< Mask for CLB OUTPUT ENABLE/DISABLE 6 +#define CLB_OUTPUT_07 0x00000080U //!< Mask for CLB OUTPUT ENABLE/DISABLE 7 +#define CLB_OUTPUT_08 0x00000100U //!< Mask for CLB OUTPUT ENABLE/DISABLE 8 +#define CLB_OUTPUT_09 0x00000200U //!< Mask for CLB OUTPUT ENABLE/DISABLE 9 +#define CLB_OUTPUT_10 0x00000400U //!< Mask for CLB OUTPUT ENABLE/DISABLE 10 +#define CLB_OUTPUT_11 0x00000800U //!< Mask for CLB OUTPUT ENABLE/DISABLE 11 +#define CLB_OUTPUT_12 0x00001000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 12 +#define CLB_OUTPUT_13 0x00002000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 13 +#define CLB_OUTPUT_14 0x00004000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 14 +#define CLB_OUTPUT_15 0x00008000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 15 +#define CLB_OUTPUT_16 0x00010000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 16 +#define CLB_OUTPUT_17 0x00020000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 17 +#define CLB_OUTPUT_18 0x00040000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 18 +#define CLB_OUTPUT_19 0x00080000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 19 +#define CLB_OUTPUT_20 0x00100000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 20 +#define CLB_OUTPUT_21 0x00200000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 21 +#define CLB_OUTPUT_22 0x00400000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 22 +#define CLB_OUTPUT_23 0x00800000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 23 +#define CLB_OUTPUT_24 0x01000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 24 +#define CLB_OUTPUT_25 0x02000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 25 +#define CLB_OUTPUT_26 0x04000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 26 +#define CLB_OUTPUT_27 0x08000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 27 +#define CLB_OUTPUT_28 0x10000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 28 +#define CLB_OUTPUT_29 0x20000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 29 +#define CLB_OUTPUT_30 0x40000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 30 +#define CLB_OUTPUT_31 0x80000000U //!< Mask for CLB OUTPUT ENABLE/DISABLE 31 + +//***************************************************************************** +// +//! Values that can be passed to select CLB input signal +// +//***************************************************************************** +typedef enum +{ + CLB_IN0 = 0, //!< Input 0 + CLB_IN1 = 1, //!< Input 1 + CLB_IN2 = 2, //!< Input 2 + CLB_IN3 = 3, //!< Input 3 + CLB_IN4 = 4, //!< Input 4 + CLB_IN5 = 5, //!< Input 5 + CLB_IN6 = 6, //!< Input 6 + CLB_IN7 = 7 //!< Input 7 +} CLB_Inputs; + +//***************************************************************************** +// +//! Values that can be passed to select CLB output signal. It can be passed to +//! CLB_configOutputLUT() as the \e outID parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_OUT0 = 0, //!< Output 0 + CLB_OUT1 = 1, //!< Output 1 + CLB_OUT2 = 2, //!< Output 2 + CLB_OUT3 = 3, //!< Output 3 + CLB_OUT4 = 4, //!< Output 4 + CLB_OUT5 = 5, //!< Output 5 + CLB_OUT6 = 6, //!< Output 6 + CLB_OUT7 = 7 //!< Output 7 +} CLB_Outputs; + +//***************************************************************************** +// +//! Values that can be passed to select CLB counter. It can be passed to +//! CLB_configCounterLoadMatch() as the \e counterID parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_CTR0 = 0, //!< Counter 0 + CLB_CTR1 = 1, //!< Counter 1 + CLB_CTR2 = 2 //!< Counter 2 +} CLB_Counters; + +//***************************************************************************** +// +//! Values that can be passed to CLB_getRegister() as the \e registerID +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_REG_HLC_R0 = CLB_O_DBG_R0, //!< HLC R0 register + CLB_REG_HLC_R1 = CLB_O_DBG_R1, //!< HLC R1 register + CLB_REG_HLC_R2 = CLB_O_DBG_R2, //!< HLC R2 register + CLB_REG_HLC_R3 = CLB_O_DBG_R3, //!< HLC R3 register + CLB_REG_CTR_C0 = CLB_O_DBG_C0, //!< Counter 0 register + CLB_REG_CTR_C1 = CLB_O_DBG_C1, //!< Counter 1 register + CLB_REG_CTR_C2 = CLB_O_DBG_C2 //!< Counter 2 register +} CLB_Register; + +//***************************************************************************** +// +//! Values that can be passed to CLB_selectInputFilter() as the \e filterType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_FILTER_NONE = 0, //!< No filtering + CLB_FILTER_RISING_EDGE = 1, //!< Rising edge detect + CLB_FILTER_FALLING_EDGE = 2, //!< Falling edge detect + CLB_FILTER_ANY_EDGE = 3 //!< Any edge detect +} CLB_FilterType; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configGPInputMux() as the \e gpMuxCfg +//! parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_GP_IN_MUX_EXTERNAL = 0, //!< Use external input path + CLB_GP_IN_MUX_GP_REG = 1 //!< Use CLB_GP_REG bit value as input +} CLB_GPInputMux; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configLocalInputMux() as the +//! \e localMuxCfg parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_LOCAL_IN_MUX_GLOBAL_IN = 0, //!< Global input mux selection + CLB_LOCAL_IN_MUX_EPWM_DCAEVT1 = 1, //!< EPWMx DCAEVT1 + CLB_LOCAL_IN_MUX_EPWM_DCAEVT2 = 2, //!< EPWMx DCAEVT2 + CLB_LOCAL_IN_MUX_EPWM_DCBEVT1 = 3, //!< EPWMx DCBEVT1 + CLB_LOCAL_IN_MUX_EPWM_DCBEVT2 = 4, //!< EPWMx DCBEVT2 + CLB_LOCAL_IN_MUX_EPWM_DCAH = 5, //!< EPWMx DCAH + CLB_LOCAL_IN_MUX_EPWM_DCAL = 6, //!< EPWMx DCAL + CLB_LOCAL_IN_MUX_EPWM_DCBH = 7, //!< EPWMx DCBH + CLB_LOCAL_IN_MUX_EPWM_DCBL = 8, //!< EPWMx DCBL + CLB_LOCAL_IN_MUX_EPWM_OST = 9, //!< EPWMx OST + CLB_LOCAL_IN_MUX_EPWM_CBC = 10, //!< EPWMx CBC + CLB_LOCAL_IN_MUX_ECAP_ECAPIN = 11, //!< ECAPx ECAPIN + CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT = 12, //!< ECAPx ECAP_OUT + CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT_EN = 13, //!< ECAPx ECAP_OUT_EN + CLB_LOCAL_IN_MUX_ECAP_CEVT1 = 14, //!< ECAPx CEVT1 + CLB_LOCAL_IN_MUX_ECAP_CEVT2 = 15, //!< ECAPx CEVT2 + CLB_LOCAL_IN_MUX_ECAP_CEVT3 = 16, //!< ECAPx CEVT3 + CLB_LOCAL_IN_MUX_ECAP_CEVT4 = 17, //!< ECAPx CEVT4 + CLB_LOCAL_IN_MUX_EQEP_EQEPA = 18, //!< EQEPx EQEPA + CLB_LOCAL_IN_MUX_EQEP_EQEPB = 19, //!< EQEPx EQEPB + CLB_LOCAL_IN_MUX_EQEP_EQEPI = 20, //!< EQEPx EQEPI + CLB_LOCAL_IN_MUX_EQEP_EQEPS = 21, //!< EQEPx EQEPS + CLB_LOCAL_IN_MUX_CPU1_TBCLKSYNC = 22, //!< CPU1.TBCLKSYNC + CLB_LOCAL_IN_MUX_CPU2_TBCLKSYNC = 23, //!< CPU2.TBCLKSYNC + CLB_LOCAL_IN_MUX_CPU1_HALT = 24, //!< CPU1.HALT + CLB_LOCAL_IN_MUX_CPU2_HALT = 25, //!< CPU2.HALT +} CLB_LocalInputMux; + +//***************************************************************************** +// +//! Values that can be passed to CLB_configGlobalInputMux() as the +//! \e globalMuxCfg parameter. +// +//***************************************************************************** +typedef enum +{ + CLB_GLOBAL_IN_MUX_EPWM1A = 0, //!< EPWM1A + CLB_GLOBAL_IN_MUX_EPWM1A_OE = 1, //!< EPWM1A trip output + CLB_GLOBAL_IN_MUX_EPWM1B = 2, //!< EPWM1B + CLB_GLOBAL_IN_MUX_EPWM1B_OE = 3, //!< EPWM1B trip output + CLB_GLOBAL_IN_MUX_EPWM1_CTR_ZERO = 4, //!< EPWM1 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM1_CTR_PRD = 5, //!< EPWM1 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM1_CTRDIR = 6, //!< EPWM1 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM1_TBCLK = 7, //!< EPWM1 TBCLK + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPA = 8, //!< EPWM1 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPB = 9, //!< EPWM1 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPC = 10, //!< EPWM1 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPD = 11, //!< EPWM1 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM1A_AQ = 12, //!< EPWM1A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM1B_AQ = 13, //!< EPWM1B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM1A_DB = 14, //!< EPWM1A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM1B_DB = 15, //!< EPWM1B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM2A = 16, //!< EPWM2A + CLB_GLOBAL_IN_MUX_EPWM2A_OE = 17, //!< EPWM2A trip output + CLB_GLOBAL_IN_MUX_EPWM2B = 18, //!< EPWM2B + CLB_GLOBAL_IN_MUX_EPWM2B_OE = 19, //!< EPWM2B trip output + CLB_GLOBAL_IN_MUX_EPWM2_CTR_ZERO = 20, //!< EPWM2 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM2_CTR_PRD = 21, //!< EPWM2 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM2_CTRDIR = 22, //!< EPWM2 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM2_TBCLK = 23, //!< EPWM2 TBCLK + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPA = 24, //!< EPWM2 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPB = 25, //!< EPWM2 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPC = 26, //!< EPWM2 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPD = 27, //!< EPWM2 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM2A_AQ = 28, //!< EPWM2A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM2B_AQ = 29, //!< EPWM2B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM2A_DB = 30, //!< EPWM2A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM2B_DB = 31, //!< EPWM2B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM3A = 32, //!< EPWM3A + CLB_GLOBAL_IN_MUX_EPWM3A_OE = 33, //!< EPWM3A trip output + CLB_GLOBAL_IN_MUX_EPWM3B = 34, //!< EPWM3B + CLB_GLOBAL_IN_MUX_EPWM3B_OE = 35, //!< EPWM3B trip output + CLB_GLOBAL_IN_MUX_EPWM3_CTR_ZERO = 36, //!< EPWM3 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM3_CTR_PRD = 37, //!< EPWM3 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM3_CTRDIR = 38, //!< EPWM3 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM3_TBCLK = 39, //!< EPWM3 TBCLK + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPA = 40, //!< EPWM3 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPB = 41, //!< EPWM3 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPC = 42, //!< EPWM3 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPD = 43, //!< EPWM3 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM3A_AQ = 44, //!< EPWM3A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM3B_AQ = 45, //!< EPWM3B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM3A_DB = 46, //!< EPWM3A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM3B_DB = 47, //!< EPWM3B DB submodule output + + CLB_GLOBAL_IN_MUX_EPWM4A = 48, //!< EPWM4A + CLB_GLOBAL_IN_MUX_EPWM4A_OE = 49, //!< EPWM4A trip output + CLB_GLOBAL_IN_MUX_EPWM4B = 50, //!< EPWM4B + CLB_GLOBAL_IN_MUX_EPWM4B_OE = 51, //!< EPWM4B trip output + CLB_GLOBAL_IN_MUX_EPWM4_CTR_ZERO = 52, //!< EPWM4 TBCTR = Zero + CLB_GLOBAL_IN_MUX_EPWM4_CTR_PRD = 53, //!< EPWM4 TBCTR = TBPRD + CLB_GLOBAL_IN_MUX_EPWM4_CTRDIR = 54, //!< EPWM4 CTRDIR + CLB_GLOBAL_IN_MUX_EPWM4_TBCLK = 55, //!< EPWM4 TBCLK + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPA = 56, //!< EPWM4 TBCTR = CMPA + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPB = 57, //!< EPWM4 TBCTR = CMPB + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPC = 58, //!< EPWM4 TBCTR = CMPC + CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPD = 59, //!< EPWM4 TBCTR = CMPD + CLB_GLOBAL_IN_MUX_EPWM4A_AQ = 60, //!< EPWM4A AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM4B_AQ = 61, //!< EPWM4B AQ submodule output + CLB_GLOBAL_IN_MUX_EPWM4A_DB = 62, //!< EPWM4A DB submodule output + CLB_GLOBAL_IN_MUX_EPWM4B_DB = 63, //!< EPWM4B DB submodule output + + CLB_GLOBAL_IN_MUX_CLB_AUXSIG0 = 64, //!< CLB X-BAR AUXSIG0 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG1 = 65, //!< CLB X-BAR AUXSIG1 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG2 = 66, //!< CLB X-BAR AUXSIG2 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG3 = 67, //!< CLB X-BAR AUXSIG3 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG4 = 68, //!< CLB X-BAR AUXSIG4 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG5 = 69, //!< CLB X-BAR AUXSIG5 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG6 = 70, //!< CLB X-BAR AUXSIG6 + CLB_GLOBAL_IN_MUX_CLB_AUXSIG7 = 71, //!< CLB X-BAR AUXSIG7 + +} CLB_GlobalInputMux; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +// +//! +//! Checks the CLB base address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function determines if a CLB base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool CLB_isBaseValid(uint32_t base) +{ + return( + (base == CLB1_BASE) || + (base == CLB2_BASE) || + (base == CLB3_BASE) || + (base == CLB4_BASE) + ); +} + +//***************************************************************************** +// +//! +//! Checks the CLB internal memory address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function determines if a CLB base address is valid. +//! +//! \return Returns \b true if the address is valid and \b false otherwise. +// +//***************************************************************************** +static inline bool CLB_isAddressValid(uint32_t address) +{ + return(address <= (CLB_ADDR_HLC_BASE + CLB_NUM_HLC_INSTR)); +} +#endif + +//***************************************************************************** +// +//! Set global enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function enables the CLB via global enable register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableCLB(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREGH(base + CLB_LOGICCTL + CLB_O_LOAD_EN) |= CLB_LOAD_EN_GLOBAL_EN; + EDIS; +} + +//***************************************************************************** +// +//! Clear global enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function disables the CLB via global enable register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_disableCLB(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREGH(base + CLB_LOGICCTL + CLB_O_LOAD_EN) &= ~CLB_LOAD_EN_GLOBAL_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enable CLB lock. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function enables the lock bit of the lock register. The lock can only +//! be set once and can only be cleared by a device reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableLock(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + // + // Setting the lock bit requires key 0x5A5A to be written at the same time + // + EALLOW; + HWREG(base + CLB_LOGICCTL + CLB_O_LOCK) = + (uint32_t)CLB_LOCK_LOCK | ((uint32_t)CLB_LOCK_KEY << CLB_LOCK_KEY_S); + EDIS; +} + +//***************************************************************************** +// +//! Write value to address. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param address is the address of CLB internal memory. +//! \param value is the value to write to specified address. +//! +//! This function writes the specified value to CLB internal memory. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_writeInterface(uint32_t base, uint32_t address, + uint32_t value) +{ + ASSERT(CLB_isBaseValid(base)); + ASSERT(CLB_isAddressValid(address)); + + EALLOW; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_ADDR) = address; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_DATA) = value; + HWREG(base + CLB_LOGICCTL + CLB_O_LOAD_EN) |= CLB_LOAD_EN_LOAD_EN; + EDIS; +} + +//***************************************************************************** +// +//! Select input filter type. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param filterType is the selected type of filter applied to the input. +//! +//! This function configures the filter selection for the specified input. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e filterType parameter can have one enumeration value from +//! CLB_FilterType. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectInputFilter(uint32_t base, CLB_Inputs inID, + CLB_FilterType filterType) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each input has a 2-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID << 1; + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER) = + (HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER) & + ~(CLB_INPUT_FILTER_FIN0_M << shiftVal)) | + ((uint16_t)filterType << shiftVal); +} + +//***************************************************************************** +// +//! Enables synchronization of an input signal. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! +//! This function enables synchronization on the specified input signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_enableSynchronization(uint32_t base, CLB_Inputs inID) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER + 1U) |= + (1U << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Disables synchronization of an input signal. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! +//! This function disables synchronization on the specified input signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_disableSynchronization(uint32_t base, CLB_Inputs inID) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INPUT_FILTER + 1U) &= + ~(1U << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Configures the general purpose input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param gpMuxCfg is the mux selection for the general purpose input mux. +//! +//! This function configures the general purpose input mux. The \e gpMuxCfg +//! parameter can select either the use of an external input signal +//! (\b CLB_GP_IN_MUX_EXTERNAL) or the use of the corresponding CLB_GP_REG bit +//! as an input (\b CLB_GP_IN_MUX_GP_REG). +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! +//! \sa CLB_setGPREG() to write to the CLB_GP_REG. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configGPInputMux(uint32_t base, CLB_Inputs inID, + CLB_GPInputMux gpMuxCfg) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_IN_MUX_SEL_0) = + (HWREGH(base + CLB_LOGICCTL + CLB_O_IN_MUX_SEL_0) & + ~(CLB_IN_MUX_SEL_0_SEL_GP_IN_0 << (uint16_t)inID)) | + ((uint16_t)gpMuxCfg << (uint16_t)inID); +} + +//***************************************************************************** +// +//! Sets the CLB_GP_REG register value. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param gpRegVal is the value to be written to CLB_GP_REG. +//! +//! This function writes to the CLB_GP_REG register. When the general purpose +//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal +//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and +//! so on). +//! +//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for +//! an input signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setGPREG(uint32_t base, uint32_t gpRegVal) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREG(base + CLB_LOGICCTL + CLB_O_GP_REG) = gpRegVal; +} + +//***************************************************************************** +// +//! Gets the CLB_GP_REG register value. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function writes to the CLB_GP_REG register. When the general purpose +//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal +//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and +//! so on). +//! +//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for +//! an input signal. +//! +//! \return CLB_GP_REG value. +// +//***************************************************************************** +static inline uint32_t CLB_getGPREG(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + CLB_O_GP_REG)); +} + +//***************************************************************************** +// +//! Configures the local input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param localMuxCfg is the mux selection for the local input mux. +//! +//! This function configures the local input mux for the specified input +//! signal. +//! +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e localMuxCfg parameter can have one enumeration value from +//! CLB_LocalInputMux. +//! +//! \note The local input mux options' peripheral sources depend on which +//! instance of the CLB (\e base) you are using. For example, for CLB1 the +//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2. +//! See your technical reference manual for details. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configLocalInputMux(uint32_t base, CLB_Inputs inID, + CLB_LocalInputMux localMuxCfg) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each local input has a 5-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID * CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S; + + if(inID < CLB_IN4) + { + HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_1) = + (HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_1) & + ~((uint32_t)CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)localMuxCfg << shiftVal); + } + else + { + // + // Calculating shift amount for inputs > input3 + // + shiftVal -= 4U * CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S; + HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_2) = + (HWREG(base + CLB_LOGICCTL + CLB_O_LCL_MUX_SEL_2) & + ~((uint32_t)CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)localMuxCfg << shiftVal); + } +} + +//***************************************************************************** +// +//! Configures the global input mux. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param inID is the specified CLB tile input signal. +//! \param globalMuxCfg is the mux selection for the global input mux. +//! +//! This function configures the global input mux for the specified input +//! signal. +//! The \e inID parameter can have one enumeration value from CLB_Inputs. +//! The \e globalMuxCfg parameter can have one enumeration value from +//! CLB_GlobalInputMux. +//! +//! \note The global input mux options' peripheral sources depend on which +//! instance of the CLB (\e base) you are using. For example, for CLB1 the +//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2. +//! See your technical reference manual for details. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configGlobalInputMux(uint32_t base, CLB_Inputs inID, + CLB_GlobalInputMux globalMuxCfg) +{ + uint16_t shiftVal; + + ASSERT(CLB_isBaseValid(base)); + + // + // Each input has a 5-bit field in this register so need to calculate + // shift amount accordingly. + // + shiftVal = (uint16_t)inID * CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S; + + if(inID < CLB_IN4) + { + HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_1) = + (HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_1) & + ~((uint32_t)CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)globalMuxCfg << shiftVal); + } + else + { + shiftVal -= 4U * CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S; + HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_2) = + (HWREG(base + CLB_LOGICCTL + CLB_O_GLBL_MUX_SEL_2) & + ~((uint32_t)CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M << shiftVal)) | + ((uint32_t)globalMuxCfg << shiftVal); + } +} + +//***************************************************************************** +// +//! Controls the output enable. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param outputMask is a mask of the outputs to be enabled. +//! \param enable is a switch to decide if the CLB outputs need to be enabled +//! or not. +//! +//! This function is used to enable and disable CLB outputs by writing a mask +//! to CLB_OUT_EN. Each bit corresponds to a CLB output. When a bit is 1, the +//! corresponding output is enabled; when a bit is 0, the output is disabled. +//! +//! The \e outputMask parameter takes a logical OR of any of the CLB_OUTPUT_0x +//! values that correspond to the CLB OUTPUT ENABLE for the respective outputs. +//! The \e enable parameter can have one of the values from: +//! false: Disable the respective CLB outputs +//! true: Enable the respective CLB outputs +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setOutputMask(uint32_t base, uint32_t outputMask , + bool enable) +{ + ASSERT(CLB_isBaseValid(base)); + + if(enable == true) + { + HWREG(base + CLB_LOGICCTL + CLB_O_OUT_EN) |= outputMask; + } + else + { + HWREG(base + CLB_LOGICCTL + CLB_O_OUT_EN) &= ~outputMask; + } +} + +//***************************************************************************** +// +//! Reads the interrupt tag register. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! \return Returns the value in the interrupt tag register which is a 6-bit +//! constant set by the HLC. +// +//***************************************************************************** +static inline uint16_t CLB_getInterruptTag(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREGH(base + CLB_LOGICCTL + CLB_O_INTR_TAG_REG)); +} + +//***************************************************************************** +// +//! Clears the interrupt tag register. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function clears the interrupt tag register, setting it to 0. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_clearInterruptTag(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + HWREGH(base + CLB_LOGICCTL + CLB_O_INTR_TAG_REG) = 0U; +} + +//***************************************************************************** +// +//! Selects LUT4 inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param lut4In0 is the value for LUT4 input signal 0. Generated by tool as +//! \b TILEx_CFG_LUT4_IN0. +//! \param lut4In1 is the value for LUT4 input signal 1. Generated by tool as +//! \b TILEx_CFG_LUT4_IN1. +//! \param lut4In2 is the value for LUT4 input signal 2. Generated by tool as +//! \b TILEx_CFG_LUT4_IN2. +//! \param lut4In3 is the value for LUT4 input signal 3. Generated by tool as +//! \b TILEx_CFG_LUT4_IN3. +//! +//! This function configures the LUT4 block's input signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectLUT4Inputs(uint32_t base, uint32_t lut4In0, + uint32_t lut4In1, uint32_t lut4In2, + uint32_t lut4In3) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_LUT4_IN0) = lut4In0; + HWREG(base + CLB_O_LUT4_IN1) = lut4In1; + HWREG(base + CLB_O_LUT4_IN2) = lut4In2; + HWREG(base + CLB_O_LUT4_IN3) = lut4In3; + EDIS; +} + +//***************************************************************************** +// +//! Configures LUT4 functions. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param lut4Fn10 is the equation value for LUT4 blocks 0 and 1. Generated by +//! tool as \b TILEx_CFG_LUT4_FN10. +//! \param lut4Fn2 is the equation value for LUT4 block2. Generated by tool as +//! \b TILEx_CFG_LUT4_FN2. +//! +//! This function configures the LUT4 block's equations. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configLUT4Function(uint32_t base, uint32_t lut4Fn10, + uint32_t lut4Fn2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_LUT4_FN1_0) = lut4Fn10; + HWREG(base + CLB_O_LUT4_FN2) = lut4Fn2; + EDIS; +} + +//***************************************************************************** +// +//! Selects FSM inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param external0 is the value for FSM external 0 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXT_IN0. +//! \param external1 is the value for FSM external 1 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXT_IN1. +//! \param extra0 is the value for FSM extra 0 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXTRA_IN0. +//! \param extra1 is the value for FSM extra 1 input. Generated by tool +//! as \b TILEx_CFG_FSM_EXTRA_IN1. +//! +//! This function configures the FSM block's external inputs and extra external +//! inputs. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectFSMInputs(uint32_t base, uint32_t external0, + uint32_t external1, uint32_t extra0, + uint32_t extra1) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_EXTERNAL_IN0) = external0; + HWREG(base + CLB_O_FSM_EXTERNAL_IN1) = external1; + HWREG(base + CLB_O_FSM_EXTRA_IN0) = extra0; + HWREG(base + CLB_O_FSM_EXTRA_IN1) = extra1; + EDIS; +} + +//***************************************************************************** +// +//! Configures FSM LUT function. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param fsmLutFn10 is the value for FSM 0 & FSM 1 LUT function. Generated +//! by tool as \b TILEx_CFG_FSM_LUT_FN10. +//! \param fsmLutFn2 is the value for FSM 2 LUT function. Generated by tool as +//! \b TILEx_CFG_FSM_LUT_FN2. +//! +//! This function configures the FSM block's LUT equations. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configFSMLUTFunction(uint32_t base, uint32_t fsmLutFn10, + uint32_t fsmLutFn2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_LUT_FN1_0) = fsmLutFn10; + HWREG(base + CLB_O_FSM_LUT_FN2) = fsmLutFn2; + EDIS; +} + +//***************************************************************************** +// +//! Configures FSM next state. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param nextState0 is the value for FSM 0's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_0. +//! \param nextState1 is the value for FSM 1's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_1. +//! \param nextState2 is the value for FSM 2's next state. Generated by tool as +//! \b TILEx_CFG_FSM_NEXT_STATE_2. +//! +//! This function configures the FSM's next state equation. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configFSMNextState(uint32_t base, uint32_t nextState0, + uint32_t nextState1, + uint32_t nextState2) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_FSM_NEXT_STATE_0) = nextState0; + HWREG(base + CLB_O_FSM_NEXT_STATE_1) = nextState1; + HWREG(base + CLB_O_FSM_NEXT_STATE_2) = nextState2; + EDIS; +} + +//***************************************************************************** +// +//! Selects Counter inputs. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param reset is the value for counter's reset inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_RESET. +//! \param event is the value for counter's event inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_EVENT. +//! \param mode0 is the value for counter's mode 0 inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_MODE_0. +//! \param mode1 is the value for counter's mode 1 inputs. Generated by tool as +//! \b TILEx_CFG_COUNTER_MODE_1. +//! +//! This function selects the input signals to the counter block. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_selectCounterInputs(uint32_t base, uint32_t reset, + uint32_t event, uint32_t mode0, + uint32_t mode1) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_COUNT_RESET) = reset; + HWREG(base + CLB_O_COUNT_EVENT) = event; + HWREG(base + CLB_O_COUNT_MODE_0) = mode0; + HWREG(base + CLB_O_COUNT_MODE_1) = mode1; + EDIS; +} + +//***************************************************************************** +// +//! Configures Counter and FSM modes. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param miscCtrl is the value to represent counter and FSM modes. +//! Generated by tool as \b TILEx_CFG_MISC_CONTROL. +//! +//! This function configures the counter mode, particularly add/shift, load +//! modes. The function also configures whether the FSM should use state inputs +//! or an extra external input. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configMiscCtrlModes(uint32_t base, uint32_t miscCtrl) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_MISC_CONTROL) = miscCtrl; + EDIS; +} + +//***************************************************************************** +// +//! Configures Output LUT functions. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param outID is the specified CLB tile output signal. +//! \param outputCfg is the value for the output LUT signal function and input +//! signal selections. Generated by tool as \b TILEx_CFG_OUTLUT_n where +//! n is the output number. +//! +//! This function configures the input signals and equations of the output LUT +//! corresponding to the /e outID parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configOutputLUT(uint32_t base, CLB_Outputs outID, + uint32_t outputCfg) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_OUTPUT_LUT_0 + (sizeof(uint32_t) * outID)) = outputCfg; + EDIS; +} + +//***************************************************************************** +// +//! Configures HLC event selection. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param eventSel is the value for HLC event selection. Generated by tool as +//! \b TILEx_HLC_EVENT_SEL. +//! +//! This function configures the event selection for the High Level Controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_configHLCEventSelect(uint32_t base, uint32_t eventSel) +{ + ASSERT(CLB_isBaseValid(base)); + + EALLOW; + HWREG(base + CLB_O_HLC_EVENT_SEL) = eventSel; + EDIS; +} + +//***************************************************************************** +// +//! Program HLC instruction. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param instructionNum is the index into the HLC instruction memory. For +//! example, a value of 0 corresponds to instruction 0 of event 0, +//! a value of 1 corresponds to instruction 1 of event 0, and so on up +//! to a value of 31 which corresponds to instruction 7 of event 3. +//! \param instruction is the instruction to be programmed. Generated by tool +//! as \b TILEx_HLCINSTR_n where n is the instruction number. +//! +//! This function configures the CLB internal memory corresponding to the +//! specified HLC instruction number with the given instruction. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_programHLCInstruction(uint32_t base, + uint32_t instructionNum, + uint32_t instruction) +{ + ASSERT(CLB_isBaseValid(base)); + ASSERT(instructionNum < 32U); + + CLB_writeInterface(base, CLB_ADDR_HLC_BASE + instructionNum, instruction); +} + +//***************************************************************************** +// +//! Set HLC registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param r0Init is the value to write to HLC register R0. Generated by tool +//! as \b TILEx_HLC_R0_INIT. +//! \param r1Init is the value to write to HLC register R1. Generated by tool +//! as \b TILEx_HLC_R1_INIT. +//! \param r2Init is the value to write to HLC register R2. Generated by tool +//! as \b TILEx_HLC_R2_INIT. +//! \param r3Init is the value to write to HLC register R3. Generated by tool +//! as \b TILEx_HLC_R3_INIT. +//! +//! This function configures the CLB internal memory corresponding to the HLC +//! registers R0-R3 with the specified values. +//! +//! \return None. +// +//***************************************************************************** +static inline void CLB_setHLCRegisters(uint32_t base, uint32_t r0Init, + uint32_t r1Init, uint32_t r2Init, + uint32_t r3Init) +{ + ASSERT(CLB_isBaseValid(base)); + + CLB_writeInterface(base, CLB_ADDR_HLC_R0, r0Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R1, r1Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R2, r2Init); + CLB_writeInterface(base, CLB_ADDR_HLC_R3, r3Init); +} + +//***************************************************************************** +// +//! Get HLC or counter register values. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param registerID is the internal register from which to read. Can be +//! either an HLC register (\b CLB_REG_HLC_Rn) or a counter value +//! (\b CLB_REG_CTR_Cn). +//! +//! \return Returns the value in the specified HLC register or counter. +// +//***************************************************************************** +static inline uint32_t CLB_getRegister(uint32_t base, CLB_Register registerID) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + (uint32_t)registerID)); +} + +//***************************************************************************** +// +//! Get output status. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! \return Returns the output status of various components within the CLB tile +//! such as a counter match or LUT output. Use the \b CLB_DBG_OUT_* +//! masks from hw_clb.h to decode the bits. +// +//***************************************************************************** +static inline uint32_t CLB_getOutputStatus(uint32_t base) +{ + ASSERT(CLB_isBaseValid(base)); + + return(HWREG(base + CLB_LOGICCTL + CLB_O_DBG_OUT)); +} + +//***************************************************************************** +// +//! Configures Counter load and match. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param counterID is the specified counter unit. +//! \param load is the value for counter's load mode. Generated by tool as +//! \b TILEx_COUNTER_n_LOAD_VAL where n is the counter number. +//! \param match1 is the value for counter's match 1. Generated by tool as +//! \b TILEx_COUNTER_n_MATCH1_VAL where n is the counter number. +//! \param match2 is the value for counter's match 2. Generated by tool as +//! \b TILEx_COUNTER_n_MATCH2_VAL where n is the counter number. +//! +//! This function configures the CLB internal memory corresponding to the +//! counter block's load and match values. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_configCounterLoadMatch(uint32_t base, CLB_Counters counterID, + uint32_t load, uint32_t match1, + uint32_t match2); + +//***************************************************************************** +// +//! Clear FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! +//! This function clears the PUSH/PULL FIFOs as well as its pointers. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_clearFIFOs(uint32_t base); + +//***************************************************************************** +// +//! Configure the FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param pullData[] is a pointer to an array of bytes which needs to be +//! written into the FIFO. The 0th FIFO data is in the 0th index. +//! +//! This function writes to the PULL FIFO. This also clears the FIFOs and +//! its pointer using the CLB_clearFIFOs() API prior to writing to +//! the FIFO. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_writeFIFOs(uint32_t base, const uint32_t pullData[]); + +//***************************************************************************** +// +//! Read FIFO registers. +//! +//! \param base is the base address of a CLB tile's logic config register. +//! \param pushData[] is a pointer to an array of bytes which needs to be +//! read from the FIFO. +//! +//! This function reads from the PUSH FIFO. The 0th FIFO data would be in +//! the 0th index. +//! +//! \return None. +// +//***************************************************************************** +extern void CLB_readFIFOs(uint32_t base , uint32_t pushData[]); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CLB_H diff --git a/gpio_driverlib_cpu1/device/driverlib/cmpss.c b/gpio_driverlib_cpu1/device/driverlib/cmpss.c new file mode 100644 index 0000000..88f9e5f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cmpss.c @@ -0,0 +1,223 @@ +//########################################################################### +// +// FILE: cmpss.c +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cmpss.h" + +//***************************************************************************** +// +// CMPSS_configFilterHigh +// +//***************************************************************************** +void +CMPSS_configFilterHigh(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT((threshold - 1U) >= ((sampleWindow - 1U) / 2U)); + + // + // Shift the sample window and threshold values into the correct positions + // and write them to the appropriate register. + // + regValue = ((sampleWindow - 1U) << CMPSS_CTRIPHFILCTL_SAMPWIN_S) | + ((threshold - 1U) << CMPSS_CTRIPHFILCTL_THRESH_S); + + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPHFILCTL) = + (HWREGH(base + CMPSS_O_CTRIPHFILCTL) & + ~(CMPSS_CTRIPHFILCTL_SAMPWIN_M | CMPSS_CTRIPHFILCTL_THRESH_M)) | + regValue; + + // + // Set the filter sample clock prescale for the high comparator. + // + HWREGH(base + CMPSS_O_CTRIPHFILCLKCTL) = samplePrescale; + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configFilterLow +// +//***************************************************************************** +void +CMPSS_configFilterLow(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT((threshold - 1U) >= ((sampleWindow - 1U) / 2U)); + + // + // Shift the sample window and threshold values into the correct positions + // and write them to the appropriate register. + // + regValue = ((sampleWindow - 1U) << CMPSS_CTRIPLFILCTL_SAMPWIN_S) | + ((threshold - 1U) << CMPSS_CTRIPLFILCTL_THRESH_S); + + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPLFILCTL) = + (HWREGH(base + CMPSS_O_CTRIPLFILCTL) & + ~(CMPSS_CTRIPLFILCTL_SAMPWIN_M | CMPSS_CTRIPLFILCTL_THRESH_M)) | + regValue; + + // + // Set the filter sample clock prescale for the low comparator. + // + HWREGH(base + CMPSS_O_CTRIPLFILCLKCTL) = samplePrescale; + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configLatchOnPWMSYNC +// +//***************************************************************************** +void +CMPSS_configLatchOnPWMSYNC(uint32_t base, bool highEnable, bool lowEnable) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // If the highEnable is true, set the bit that will enable PWMSYNC to reset + // the high comparator digital filter latch. If not, clear the bit. + // + EALLOW; + + if(highEnable) + { + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HSYNCCLREN; + } + else + { + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_HSYNCCLREN; + } + + // + // If the lowEnable is true, set the bit that will enable PWMSYNC to reset + // the low comparator digital filter latch. If not, clear the bit. + // + if(lowEnable) + { + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LSYNCCLREN; + } + else + { + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_LSYNCCLREN; + } + + EDIS; +} + +//***************************************************************************** +// +// CMPSS_configRamp +// +//***************************************************************************** +void +CMPSS_configRamp(uint32_t base, uint16_t maxRampVal, uint16_t decrementVal, + uint16_t delayVal, uint16_t pwmSyncSrc, bool useRampValShdw) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(delayVal <= CMPSS_RAMPDLYS_DELAY_M); + ASSERT((pwmSyncSrc >= 1U) && (pwmSyncSrc <= 12U)); + + EALLOW; + + // + // Write the ramp generator source to the register + // + HWREGH(base + CMPSS_O_COMPDACCTL) = + (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~CMPSS_COMPDACCTL_RAMPSOURCE_M) | + ((uint16_t)(pwmSyncSrc - 1U) << CMPSS_COMPDACCTL_RAMPSOURCE_S); + + // + // Set or clear the bit that determines from where the max ramp value + // should be loaded. + // + if(useRampValShdw) + { + HWREGH(base + CMPSS_O_COMPDACCTL) |= CMPSS_COMPDACCTL_RAMPLOADSEL; + } + else + { + HWREGH(base + CMPSS_O_COMPDACCTL) &= ~CMPSS_COMPDACCTL_RAMPLOADSEL; + } + + EDIS; + + // + // Write the maximum ramp value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPMAXREFS) = maxRampVal; + + // + // Write the ramp decrement value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDECVALS) = decrementVal; + + // + // Write the ramp delay value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDLYS) = delayVal; +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/cmpss.h b/gpio_driverlib_cpu1/device/driverlib/cmpss.h new file mode 100644 index 0000000..25625c3 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cmpss.h @@ -0,0 +1,1325 @@ +//########################################################################### +// +// FILE: cmpss.h +// +// TITLE: C28x CMPSS driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CMPSS_H +#define CMPSS_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup cmpss_api CMPSS +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_cmpss.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +#define CMPSS_HICMP_CTL_M (CMPSS_COMPCTL_COMPHSOURCE | \ + CMPSS_COMPCTL_COMPHINV | \ + CMPSS_COMPCTL_ASYNCHEN) + +#define CMPSS_LOCMP_CTL_M (CMPSS_COMPCTL_COMPLSOURCE | \ + CMPSS_COMPCTL_COMPLINV | \ + CMPSS_COMPCTL_ASYNCLEN) + +#ifndef DOXYGEN_PDF_IGNORE + + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configLowComparator() and +// CMPSS_configHighComparator() as the config parameter. +// +//***************************************************************************** +// +// Comparator negative input source +// +//! Input driven by internal DAC +#define CMPSS_INSRC_DAC 0x0000U +//! Input driven by external pin +#define CMPSS_INSRC_PIN 0x0001U + +// +// Extra options +// +//! Comparator output is inverted +#define CMPSS_INV_INVERTED 0x0002U +//! Asynch comparator output feeds into OR with latched digital filter output +#define CMPSS_OR_ASYNC_OUT_W_FILT 0x0040U + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configOutputsLow() and +// CMPSS_configOutputsHigh() as the config parameter. +// +//***************************************************************************** +// +// Signal driving CTRIPOUT +// +//! Asynchronous comparator output drives CTRIPOUT +#define CMPSS_TRIPOUT_ASYNC_COMP 0x0000U +//! Synchronous comparator output drives CTRIPOUT +#define CMPSS_TRIPOUT_SYNC_COMP 0x0010U +//! Filter output drives CTRIPOUT +#define CMPSS_TRIPOUT_FILTER 0x0020U +//! Latched filter output drives CTRIPOUT +#define CMPSS_TRIPOUT_LATCH 0x0030U + +// +// Signal driving CTRIP +// +//! Asynchronous comparator output drives CTRIP +#define CMPSS_TRIP_ASYNC_COMP 0x0000U +//! Synchronous comparator output drives CTRIP +#define CMPSS_TRIP_SYNC_COMP 0x0004U +//! Filter output drives CTRIP +#define CMPSS_TRIP_FILTER 0x0008U +//! Latched filter output drives CTRIP +#define CMPSS_TRIP_LATCH 0x000CU + +//***************************************************************************** +// +// Values that can be returned by CMPSS_getStatus(). +// +//***************************************************************************** +//! High digital filter output +#define CMPSS_STS_HI_FILTOUT 0x0001U +//! Latched value of high digital filter output +#define CMPSS_STS_HI_LATCHFILTOUT 0x0002U +//! Low digital filter output +#define CMPSS_STS_LO_FILTOUT 0x0100U +//! Latched value of low digital filter output +#define CMPSS_STS_LO_LATCHFILTOUT 0x0200U + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configDAC() the config parameter. +// +//***************************************************************************** +// +// When is DAC value loaded from shadow register +// +//! DAC value updated from SYSCLK +#define CMPSS_DACVAL_SYSCLK 0x0000U +//! DAC value updated from PWMSYNC +#define CMPSS_DACVAL_PWMSYNC 0x0080U + +// +// DAC reference voltage +// +//! VDDA is the voltage reference +#define CMPSS_DACREF_VDDA 0x0000U +//! VDAC is the voltage reference +#define CMPSS_DACREF_VDAC 0x0020U + +// +// DAC value source +// +//! DAC value updated from shadow register +#define CMPSS_DACSRC_SHDW 0x0000U +//! DAC value is updated from the ramp register +#define CMPSS_DACSRC_RAMP 0x0001U +#endif + +//***************************************************************************** +// +// Values that can be passed to CMPSS_configRamp() +// as the pwmSyncSrc parameter. +// +//***************************************************************************** +#define CMPSS_PWMSYNC1 1U //!< PWMSYNC1 +#define CMPSS_PWMSYNC2 2U //!< PWMSYNC2 +#define CMPSS_PWMSYNC3 3U //!< PWMSYNC3 +#define CMPSS_PWMSYNC4 4U //!< PWMSYNC4 +#define CMPSS_PWMSYNC5 5U //!< PWMSYNC5 +#define CMPSS_PWMSYNC6 6U //!< PWMSYNC6 +#define CMPSS_PWMSYNC7 7U //!< PWMSYNC7 +#define CMPSS_PWMSYNC8 8U //!< PWMSYNC8 +#define CMPSS_PWMSYNC9 9U //!< PWMSYNC9 +#define CMPSS_PWMSYNC10 10U //!< PWMSYNC10 +#define CMPSS_PWMSYNC11 11U //!< PWMSYNC11 +#define CMPSS_PWMSYNC12 12U //!< PWMSYNC12 + + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks the CMPSS base address. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function determines if a CMPSS base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +CMPSS_isBaseValid(uint32_t base) +{ + return( + (base == CMPSS1_BASE) || + (base == CMPSS2_BASE) || + (base == CMPSS3_BASE) || + (base == CMPSS4_BASE) || + (base == CMPSS5_BASE) || + (base == CMPSS6_BASE) || + (base == CMPSS7_BASE) || + (base == CMPSS8_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the CMPSS module. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function enables the CMPSS module passed into the \e base parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that enables the CMPSS module. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) |= CMPSS_COMPCTL_COMPDACE; + + EDIS; +} + +//***************************************************************************** +// +//! Disables the CMPSS module. +//! +//! \param base is the base address of the CMPSS module. +//! +//! This function disables the CMPSS module passed into the \e base parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Clear the bit that enables the CMPSS module. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) &= ~CMPSS_COMPCTL_COMPDACE; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the configuration for the high comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the high comparator. +//! +//! This function configures a comparator. The \e config parameter is the +//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if +//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values. +//! +//! The \b CMPSS_INSRC_xxx term can take on the following values to specify +//! the high comparator negative input source: +//! - \b CMPSS_INSRC_DAC - The internal DAC. +//! - \b CMPSS_INSRC_PIN - An external pin. +//! +//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output +//! should be inverted. +//! +//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the +//! asynchronous comparator output should be fed into an OR gate with the +//! latched digital filter output before it is made available for CTRIPH or +//! CTRIPOUTH. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configHighComparator(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the high comparator configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = + (HWREGH(base + CMPSS_O_COMPCTL) & ~CMPSS_HICMP_CTL_M) | config; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the configuration for the low comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the low comparator. +//! +//! This function configures a comparator. The \e config parameter is the +//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if +//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values. +//! +//! The \b CMPSS_INSRC_xxx term can take on the following values to specify +//! the low comparator negative input source: +//! - \b CMPSS_INSRC_DAC - The internal DAC. +//! - \b CMPSS_INSRC_PIN - An external pin. +//! +//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output +//! should be inverted. +//! +//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the +//! asynchronous comparator output should be fed into an OR gate with the +//! latched digital filter output before it is made available for CTRIPL or +//! CTRIPOUTL. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configLowComparator(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the low comparator configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = + (HWREGH(base + CMPSS_O_COMPCTL) & ~CMPSS_LOCMP_CTL_M) | (config << 8U); + + EDIS; +} + +//***************************************************************************** +// +//! Sets the output signal configuration for the high comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the high comparator output signals. +//! +//! This function configures a comparator's output signals CTRIP and CTRIPOUT. +//! The \e config parameter is the result of a logical OR operation between the +//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values. +//! +//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify +//! which signal drives CTRIPOUTH: +//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter. +//! +//! The \b CMPSS_TRIP_xxx term can take on the following values to specify +//! which signal drives CTRIPH: +//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIP_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configOutputsHigh(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the high comparator output settings to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = (HWREGH(base + CMPSS_O_COMPCTL) & + ~(CMPSS_COMPCTL_CTRIPOUTHSEL_M | + CMPSS_COMPCTL_CTRIPHSEL_M)) | + config; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the output signal configuration for the low comparator. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the low comparator output signals. +//! +//! This function configures a comparator's output signals CTRIP and CTRIPOUT. +//! The \e config parameter is the result of a logical OR operation between the +//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values. +//! +//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify +//! which signal drives CTRIPOUTL: +//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter. +//! +//! The \b CMPSS_TRIP_xxx term can take on the following values to specify +//! which signal drives CTRIPL: +//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output. +//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output. +//! - \b CMPSS_TRIP_FILTER - The output of the digital filter. +//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configOutputsLow(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the low comparator output settings to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPCTL) = (HWREGH(base + CMPSS_O_COMPCTL) & + ~(CMPSS_COMPCTL_CTRIPOUTLSEL_M | + CMPSS_COMPCTL_CTRIPLSEL_M)) | + (config << 8U); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current comparator status. +//! +//! \param base is the base address of the comparator module. +//! +//! This function returns the current status for the comparator, specifically +//! the digital filter output and latched digital filter output. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! the following values: +//! - \b CMPSS_STS_HI_FILTOUT - High digital filter output +//! - \b CMPSS_STS_HI_LATCHFILTOUT - Latched value of high digital filter +//! output +//! - \b CMPSS_STS_LO_FILTOUT - Low digital filter output +//! - \b CMPSS_STS_LO_LATCHFILTOUT - Latched value of low digital filter output +// +//***************************************************************************** +static inline uint16_t +CMPSS_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Return contents of the status register. + // + return(HWREGH(base + CMPSS_O_COMPSTS)); +} + +//***************************************************************************** +// +//! Sets the configuration for the internal comparator DACs. +//! +//! \param base is the base address of the CMPSS module. +//! \param config is the configuration of the internal DAC. +//! +//! This function configures the comparator's internal DAC. The \e config +//! parameter is the result of a logical OR operation between the +//! \b CMPSS_DACVAL_xxx, \b CMPSS_DACREF_xxx, and \b CMPSS_DACSRC_xxx. +//! +//! The \b CMPSS_DACVAL_xxx term can take on the following values to specify +//! when the DAC value is loaded from its shadow register: +//! - \b CMPSS_DACVAL_SYSCLK - Value register updated on system clock. +//! - \b CMPSS_DACVAL_PWMSYNC - Value register updated on PWM sync. +//! +//! The \b CMPSS_DACREF_xxx term can take on the following values to specify +//! which voltage supply is used as reference for the DACs: +//! - \b CMPSS_DACREF_VDDA - VDDA is the voltage reference for the DAC. +//! - \b CMPSS_DACREF_VDAC - VDAC is the voltage reference for the DAC. +//! +//! The \b CMPSS_DACSRC_xxx term can take on the following values to specify +//! the DAC value source for the high comparator's internal DAC: +//! - \b CMPSS_DACSRC_SHDW - The user-programmed DACVALS register. +//! - \b CMPSS_DACSRC_RAMP - The ramp generator RAMPSTS register +//! +//! \note The \b CMPSS_DACVAL_xxx and \b CMPSS_DACREF_xxx terms apply to +//! both the high and low comparators. \b CMPSS_DACSRC_xxx will only affect +//! the high comparator's internal DAC. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configDAC(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC configuration to the appropriate register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPDACCTL) = + (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~(CMPSS_COMPDACCTL_SWLOADSEL | CMPSS_COMPDACCTL_SELREF | + CMPSS_COMPDACCTL_DACSOURCE)) | config; + EDIS; +} + +//***************************************************************************** +// +//! Sets the value of the internal DAC of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! \param value is the value actively driven by the DAC. +//! +//! This function sets the 12-bit value driven by the internal DAC of the high +//! comparator. This function will load the value into the shadow register from +//! which the actual DAC value register will be loaded. To configure which +//! event causes this shadow load to take place, use CMPSS_configDAC(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setDACValueHigh(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 4096U); + + // + // Write the DAC value to the DAC value shadow register. + // + HWREGH(base + CMPSS_O_DACHVALS) = value; +} + +//***************************************************************************** +// +//! Sets the value of the internal DAC of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! \param value is the value actively driven by the DAC. +//! +//! This function sets the 12-bit value driven by the internal DAC of the low +//! comparator. This function will load the value into the shadow register from +//! which the actual DAC value register will be loaded. To configure which +//! event causes this shadow load to take place, use CMPSS_configDAC(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setDACValueLow(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 4096U); + + // + // Write the DAC value to the DAC value shadow register. + // + HWREGH(base + CMPSS_O_DACLVALS) = value; +} + +//***************************************************************************** +// +//! Initializes the digital filter of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function initializes all the samples in the high comparator digital +//! filter to the filter input value. +//! +//! \note See CMPSS_configFilterHigh() for the proper initialization sequence +//! to avoid glitches. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_initFilterHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the high comparator filter initialization bit. + // + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPHFILCTL) |= CMPSS_CTRIPHFILCTL_FILINIT; + + EDIS; +} + +//***************************************************************************** +// +//! Initializes the digital filter of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function initializes all the samples in the low comparator digital +//! filter to the filter input value. +//! +//! \note See CMPSS_configFilterLow() for the proper initialization sequence +//! to avoid glitches. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_initFilterLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the low comparator filter initialization bit. + // + EALLOW; + + HWREGH(base + CMPSS_O_CTRIPLFILCTL) |= CMPSS_CTRIPLFILCTL_FILINIT; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the value of the internal DAC of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function gets the value of the internal DAC of the high comparator. +//! The value is read from the \e active register--not the shadow register to +//! which CMPSS_setDACValueHigh() writes. +//! +//! \return Returns the value driven by the internal DAC of the high comparator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getDACValueHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC value to the DAC value shadow register. + // + return(HWREGH(base + CMPSS_O_DACHVALA)); +} + +//***************************************************************************** +// +//! Gets the value of the internal DAC of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! +//! This function gets the value of the internal DAC of the low comparator. +//! The value is read from the \e active register--not the shadow register to +//! which CMPSS_setDACValueLow() writes. +//! +//! \return Returns the value driven by the internal DAC of the low comparator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getDACValueLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the DAC value to the DAC value shadow register. + // + return(HWREGH(base + CMPSS_O_DACLVALA)); +} + +//***************************************************************************** +// +//! Causes a software reset of the high comparator digital filter output latch. +//! +//! \param base is the base address of the comparator module. +//! +//! This function causes a software reset of the high comparator digital filter +//! output latch. It will generate a single pulse of the latch reset signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_clearFilterLatchHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that generates a reset pulse to the digital filter latch. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HLATCHCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Causes a software reset of the low comparator digital filter output latch. +//! +//! \param base is the base address of the comparator module. +//! +//! This function causes a software reset of the low comparator digital filter +//! output latch. It will generate a single pulse of the latch reset signal. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_clearFilterLatchLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Set the bit that generates a reset pulse to the digital filter latch. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LLATCHCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the ramp generator maximum reference value. +//! +//! \param base is the base address of the comparator module. +//! \param value the ramp maximum reference value. +//! +//! This function sets the ramp maximum reference value that will be loaded +//! into the ramp generator. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setMaxRampValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the maximum ramp value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPMAXREFS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator maximum reference value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp maximum reference value that will be +//! loaded into the ramp generator. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getMaxRampValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the maximum ramp value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPMAXREFA)); +} + +//***************************************************************************** +// +//! Sets the ramp generator decrement value. +//! +//! \param base is the base address of the comparator module. +//! \param value is the ramp decrement value. +//! +//! This function sets the value that is subtracted from the ramp value on +//! every system clock cycle. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setRampDecValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the ramp decrement value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDECVALS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator decrement value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp decrement value that is subtracted from +//! the ramp value on every system clock cycle. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getRampDecValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the ramp decrement value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPDECVALA)); +} + +//***************************************************************************** +// +//! Sets the ramp generator delay value. +//! +//! \param base is the base address of the comparator module. +//! \param value is the 13-bit ramp delay value. +//! +//! This function sets the value that configures the number of system clock +//! cycles to delay the start of the ramp generator decrementer after a PWMSYNC +//! event is received. Delay value can be no greater than 8191. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setRampDelayValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value < 8192U); + + // + // Write the ramp delay value to the shadow register. + // + HWREGH(base + CMPSS_O_RAMPDLYS) = value; +} + +//***************************************************************************** +// +//! Gets the ramp generator delay value. +//! +//! \param base is the base address of the comparator module. +//! +//! \return Returns the latched ramp delay value that is subtracted from +//! the ramp value on every system clock cycle. +// +//***************************************************************************** +static inline uint16_t +CMPSS_getRampDelayValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Read the ramp delay value from the register. + // + return(HWREGH(base + CMPSS_O_RAMPDLYA)); +} + +//***************************************************************************** +// +//! Configures sync source for comparator +//! +//! \param base is the base address of the comparator module. +//! \param syncSource is the desired EPWMxSYNCPER source +//! +//! This function configures desired EPWMxSYNCPER source for comparator +//! blocks. Configured EPWMxSYNCPER signal can be used to synchronize loading +//! of DAC input value from shadow to active register. It can also be used to +//! synchronize Ramp generator, if applicable. Refer to device manual to check +//! if Ramp generator is available in the desired CMPSS instance. +//! +//! Valid values for \e syncSource parameter can be 1 to n, where n represents +//! the maximum number of EPWMSYNCPER signals available on the device. For +//! instance, passing 2 into \e syncSource will select EPWM2SYNCPER. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_configureSyncSource(uint32_t base, uint16_t syncSource) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + // + // Write the ramp delay value to the shadow register. + // + EALLOW; + HWREGH(base + CMPSS_O_COMPDACCTL) = (HWREGH(base + CMPSS_O_COMPDACCTL) & + ~CMPSS_COMPDACCTL_RAMPSOURCE_M) | + ((uint16_t)(syncSource - 1U) << + CMPSS_COMPDACCTL_RAMPSOURCE_S); + EDIS; +} + +//***************************************************************************** +// +//! Sets the comparator hysteresis settings. +//! +//! \param base is the base address of the comparator module. +//! \param value is the amount of hysteresis on the comparator inputs. +//! +//! This function sets the amount of hysteresis on the comparator inputs. The +//! \e value parameter indicates the amount of hysteresis desired. Passing in 0 +//! results in none, passing in 1 results in typical hysteresis, passing in 2 +//! results in 2x of typical hysteresis, and so on where \e value x of typical +//! hysteresis is the amount configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_setHysteresis(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + ASSERT(value <= 4U); + + // + // Read the ramp delay value from the register. + // + EALLOW; + + HWREGH(base + CMPSS_O_COMPHYSCTL) = value; + + EDIS; +} + +//***************************************************************************** +// +//! Enables reset of HIGH comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function enables EPWMSYNCPER reset of High comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableLatchResetOnPWMSYNCHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_HSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Disables reset of HIGH comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function disables EPWMSYNCPER reset of High comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableLatchResetOnPWMSYNCHigh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_HSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Enables reset of LOW comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function enables EPWMSYNCPER reset of Low comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_enableLatchResetOnPWMSYNCLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) |= CMPSS_COMPSTSCLR_LSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Disables reset of LOW comparator digital filter output latch on PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! +//! This function disables EPWMSYNCPER reset of Low comparator digital filter +//! output latch +//! +//! \return None. +// +//***************************************************************************** +static inline void +CMPSS_disableLatchResetOnPWMSYNCLow(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(CMPSS_isBaseValid(base)); + + EALLOW; + + HWREGH(base + CMPSS_O_COMPSTSCLR) &= ~CMPSS_COMPSTSCLR_LSYNCCLREN; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the digital filter of the high comparator. +//! +//! \param base is the base address of the comparator module. +//! \param samplePrescale is the number of system clock cycles between samples. +//! \param sampleWindow is the number of FIFO samples to monitor. +//! \param threshold is the majority threshold of samples to change state. +//! +//! This function configures the operation of the digital filter of the high +//! comparator. +//! +//! The \e samplePrescale parameter specifies the number of system clock cycles +//! not be passed as this parameter. The prescaler used by digital filter is 1 +//! more than \e samplePrescale value. So, the input provided should be 1 less +//! than the expected prescaler. +//! +//! The \e sampleWindow parameter configures the size of the window of FIFO +//! samples taken from the input that will be monitored to determine when to +//! change the filter output. This sample window may be no larger than 32 +//! samples. +//! +//! The \e threshold parameter configures the threshold value to be used by +//! the digital filter. +//! +//! The filter output resolves to the majority value of the sample window where +//! majority is defined by the value passed into the \e threshold parameter. +//! For proper operation, the value of \e threshold must be greater than +//! sampleWindow / 2. +//! +//! To ensure proper operation of the filter, the following is the recommended +//! function call sequence for initialization: +//! +//! -# Configure and enable the comparator using CMPSS_configHighComparator() +//! and CMPSS_enableModule() +//! -# Configure the digital filter using CMPSS_configFilterHigh() +//! -# Initialize the sample values using CMPSS_initFilterHigh() +//! -# Configure the module output signals CTRIP and CTRIPOUT using +//! CMPSS_configOutputsHigh() +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configFilterHigh(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold); + +//***************************************************************************** +// +//! Configures the digital filter of the low comparator. +//! +//! \param base is the base address of the comparator module. +//! \param samplePrescale is the number of system clock cycles between samples. +//! \param sampleWindow is the number of FIFO samples to monitor. +//! \param threshold is the majority threshold of samples to change state. +//! +//! This function configures the operation of the digital filter of the low +//! comparator. +//! +//! The \e samplePrescale parameter specifies the number of system clock cycles +//! not be passed as this parameter. The prescaler used by digital filter is 1 +//! more than \e samplePrescale value. So, the input provided should be 1 less +//! than the expected prescaler. +//! +//! The \e sampleWindow parameter configures the size of the window of FIFO +//! samples taken from the input that will be monitored to determine when to +//! change the filter output. This sample window may be no larger than 32 +//! samples. +//! +//! The \e threshold parameter configures the threshold value to be used by +//! the digital filter. +//! +//! The filter output resolves to the majority value of the sample window where +//! majority is defined by the value passed into the \e threshold parameter. +//! For proper operation, the value of \e threshold must be greater than +//! sampleWindow / 2. +//! +//! To ensure proper operation of the filter, the following is the recommended +//! function call sequence for initialization: +//! +//! -# Configure and enable the comparator using CMPSS_configLowComparator() +//! and CMPSS_enableModule() +//! -# Configure the digital filter using CMPSS_configFilterLow() +//! -# Initialize the sample values using CMPSS_initFilterLow() +//! -# Configure the module output signals CTRIP and CTRIPOUT using +//! CMPSS_configOutputsLow() +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configFilterLow(uint32_t base, uint16_t samplePrescale, + uint16_t sampleWindow, uint16_t threshold); + +//***************************************************************************** +// +//! Configures whether or not the digital filter latches are reset by PWMSYNC +//! +//! \param base is the base address of the comparator module. +//! \param highEnable indicates filter latch settings in the high comparator. +//! \param lowEnable indicates filter latch settings in the low comparator. +//! +//! This function configures whether or not the digital filter latches in both +//! the high and low comparators should be reset by PWMSYNC. If the +//! \e highEnable parameter is \b true, the PWMSYNC will be allowed to reset +//! the high comparator's digital filter latch. If it is false, the ability of +//! the PWMSYNC to reset the latch will be disabled. The \e lowEnable parameter +//! has the same effect on the low comparator's digital filter latch. +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configLatchOnPWMSYNC(uint32_t base, bool highEnable, bool lowEnable); + +//***************************************************************************** +// +//! Configures the comparator subsystem's ramp generator. +//! +//! \param base is the base address of the comparator module. +//! \param maxRampVal is the ramp maximum reference value. +//! \param decrementVal value is the ramp decrement value. +//! \param delayVal is the ramp delay value. +//! \param pwmSyncSrc is the number of the PWMSYNC source. +//! \param useRampValShdw indicates if the max ramp shadow should be used. +//! +//! This function configures many of the main settings of the comparator +//! subsystem's ramp generator. The \e maxRampVal parameter should be passed +//! the ramp maximum reference value that will be loaded into the ramp +//! generator. The \e decrementVal parameter should be passed the decrement +//! value that will be subtracted from the ramp generator on each system clock +//! cycle. The \e delayVal parameter should be passed the 13-bit number of +//! system clock cycles the ramp generator should delay before beginning to +//! decrement the ramp generator after a PWMSYNC signal is received. +//! +//! These three values may be be set individually using the +//! CMPSS_setMaxRampValue(), CMPSS_setRampDecValue(), and +//! CMPSS_setRampDelayValue() APIs. +//! +//! The number of the PWMSYNC signal to be used to reset the ramp generator +//! should be specified by passing it into the \e pwmSyncSrc parameter. For +//! instance, passing a CMPSS_PWMSYNCx into \e pwmSyncSrc will select PWMSYNCx. +//! +//! To indicate whether the ramp generator should reset with the value from the +//! ramp max reference value shadow register or with the latched ramp max +//! reference value, use the \e useRampValShdw parameter. Passing it \b true +//! will result in the latched value being bypassed. The ramp generator will be +//! loaded right from the shadow register. A value of \b false will load the +//! ramp generator from the latched value. +//! +//! \return None. +// +//***************************************************************************** +extern void +CMPSS_configRamp(uint32_t base, uint16_t maxRampVal, uint16_t decrementVal, + uint16_t delayVal, uint16_t pwmSyncSrc, bool useRampValShdw); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CMPSS_H diff --git a/gpio_driverlib_cpu1/device/driverlib/cpu.h b/gpio_driverlib_cpu1/device/driverlib/cpu.h new file mode 100644 index 0000000..3e7385b --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cpu.h @@ -0,0 +1,172 @@ +//########################################################################### +// +// FILE: cpu.h +// +// TITLE: Useful C28x CPU defines. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef CPU_H +#define CPU_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stdint.h" + +// +// External reference to the interrupt flag register (IFR) register +// +#ifndef __TMS320C28XX_CLA__ +extern __cregister volatile uint16_t IFR; +#endif + +// +// External reference to the interrupt enable register (IER) register +// +#ifndef __TMS320C28XX_CLA__ +extern __cregister volatile uint16_t IER; +#endif + +// +// Define to enable interrupts +// +#ifndef EINT +#define EINT __asm(" clrc INTM") +#endif + +// +// Define to disable interrupts +// +#ifndef DINT +#define DINT __asm(" setc INTM") +#endif + +// +// Define to enable debug events +// +#ifndef ERTM +#define ERTM __asm(" clrc DBGM") +#endif + +// +// Define to disable debug events +// +#ifndef DRTM +#define DRTM __asm(" setc DBGM") +#endif + +// +// Define to allow writes to protected registers +// +#ifndef EALLOW +#ifndef __TMS320C28XX_CLA__ +#define EALLOW __eallow() +#else +#define EALLOW __meallow() +#endif // __TMS320C28XX_CLA__ +#endif // EALLOW + +// +// Define to disable writes to protected registers +// +#ifndef EDIS +#ifndef __TMS320C28XX_CLA__ +#define EDIS __edis() +#else +#define EDIS __medis() +#endif // __TMS320C28XX_CLA__ +#endif // EDIS + +// +// Define for emulation stop +// +#ifndef ESTOP0 +#define ESTOP0 __asm(" ESTOP0") +#endif + +// +// Define for emulation stop +// +#ifndef ESTOP1 +#define ESTOP1 __asm(" ESTOP1") +#endif + +// +// Define for no operation +// +#ifndef NOP +#define NOP __asm(" NOP") +#endif + +// +// Define for putting processor into a low-power mode +// +#ifndef _DUAL_HEADERS +#ifndef IDLE +#define IDLE __asm(" IDLE") +#endif +#else +#define IDLE_ASM __asm(" IDLE"); +#endif + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// +//***************************************************************************** +extern void __eallow(void); +extern void __edis(void); + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // CPU_H diff --git a/gpio_driverlib_cpu1/device/driverlib/cputimer.c b/gpio_driverlib_cpu1/device/driverlib/cputimer.c new file mode 100644 index 0000000..5d12934 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cputimer.c @@ -0,0 +1,61 @@ +//############################################################################# +// +// FILE: cputimer.c +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#include "cputimer.h" + +//***************************************************************************** +// +// CPUTimer_setEmulationMode +// +//***************************************************************************** +void CPUTimer_setEmulationMode(uint32_t base, CPUTimer_EmulationMode mode) +{ + ASSERT(CPUTimer_isBaseValid(base)); + // + // Write to FREE_SOFT bits of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) = + (HWREGH(base + CPUTIMER_O_TCR) & + ~(CPUTIMER_TCR_FREE | CPUTIMER_TCR_SOFT)) | + (uint16_t)mode; +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/cputimer.h b/gpio_driverlib_cpu1/device/driverlib/cputimer.h new file mode 100644 index 0000000..71a7501 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/cputimer.h @@ -0,0 +1,509 @@ +//############################################################################# +// +// FILE: cputimer.h +// +// TITLE: C28x CPU timer Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef CPUTIMER_H +#define CPUTIMER_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup cputimer_api CPUTimer +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_cputimer.h" +#include "debug.h" +#include "sysctl.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +//! Values that can be passed to CPUTimer_setEmulationMode() as the +//! \e mode parameter. +// +//**************************************************************************** +typedef enum +{ + //! Denotes that the timer will stop after the next decrement + CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT = 0x0000, + //! Denotes that the timer will stop when it reaches zero + CPUTIMER_EMULATIONMODE_STOPATZERO = 0x0400, + //! Denotes that the timer will run free + CPUTIMER_EMULATIONMODE_RUNFREE = 0x0800 +}CPUTimer_EmulationMode; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! CPUTimer_selectClockSource() as the \e source parameter. +// +//***************************************************************************** +typedef enum +{ + //! System Clock Source + CPUTIMER_CLOCK_SOURCE_SYS = 0x0, + //! Internal Oscillator 1 Clock Source + CPUTIMER_CLOCK_SOURCE_INTOSC1 = 0x1, + //! Internal Oscillator 2 Clock Source + CPUTIMER_CLOCK_SOURCE_INTOSC2 = 0x2, + //! External Clock Source + CPUTIMER_CLOCK_SOURCE_XTAL = 0x3, + //! Auxiliary PLL Clock Source + CPUTIMER_CLOCK_SOURCE_AUX = 0x6 +} CPUTimer_ClockSource; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! CPUTimer_selectClockSource() as the \e prescaler parameter. +// +//***************************************************************************** +typedef enum +{ + CPUTIMER_CLOCK_PRESCALER_1 = 0, //!< Prescaler value of / 1 + CPUTIMER_CLOCK_PRESCALER_2 = 1, //!< Prescaler value of / 2 + CPUTIMER_CLOCK_PRESCALER_4 = 2, //!< Prescaler value of / 4 + CPUTIMER_CLOCK_PRESCALER_8 = 3, //!< Prescaler value of / 8 + CPUTIMER_CLOCK_PRESCALER_16 = 4 //!< Prescaler value of / 16 +} CPUTimer_Prescaler; + +//***************************************************************************** +// +//! \internal +//! Checks CPU timer base address. +//! +//! \param base specifies the Timer module base address. +//! +//! This function determines if a CPU timer module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool CPUTimer_isBaseValid(uint32_t base) +{ + return((base == CPUTIMER0_BASE) || (base == CPUTIMER1_BASE) || + (base == CPUTIMER2_BASE)); +} +#endif + +//***************************************************************************** +// +//! Clears CPU timer overflow flag. +//! +//! \param base is the base address of the timer module. +//! +//! This function clears the CPU timer overflow flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_clearOverflowFlag(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TIF bit of TCR register + // + HWREGH(base + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; +} + +//***************************************************************************** +// +//! Disables CPU timer interrupt. +//! +//! \param base is the base address of the timer module. +//! +//! This function disables the CPU timer interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_disableInterrupt(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Clear TIE bit of TCR register + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TIE; +} + +//***************************************************************************** +// +//! Enables CPU timer interrupt. +//! +//! \param base is the base address of the timer module. +//! +//! This function enables the CPU timer interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_enableInterrupt(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TIE bit of TCR register + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TIE; +} + +//***************************************************************************** +// +//! Reloads CPU timer counter. +//! +//! \param base is the base address of the timer module. +//! +//! This function reloads the CPU timer counter with the values contained in +//! the CPU timer period register. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_reloadTimerCounter(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TRB bit of register TCR + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TRB; +} + +//***************************************************************************** +// +//! Stops CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function stops the CPU timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_stopTimer(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Set TSS bit of register TCR + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Starts(restarts) CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function starts (restarts) the CPU timer. +//! +//! \b Note: This function doesn't reset the timer counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_resumeTimer(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Clear TSS bit of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Starts(restarts) CPU timer. +//! +//! \param base is the base address of the timer module. +//! +//! This function starts (restarts) the CPU timer. +//! +//! \b Note: This function reloads the timer counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_startTimer(uint32_t base) +{ + uint16_t tcrValue = 0; + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Reload the timer counter + // + tcrValue = HWREGH(base + CPUTIMER_O_TCR) & (~CPUTIMER_TCR_TIF); + HWREGH(base + CPUTIMER_O_TCR) = tcrValue | CPUTIMER_TCR_TRB; + + // + // Clear TSS bit of register TCR + // + HWREGH(base + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; +} + +//***************************************************************************** +// +//! Sets CPU timer period. +//! +//! \param base is the base address of the timer module. +//! \param periodCount is the CPU timer period count. +//! +//! This function sets the CPU timer period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_setPeriod(uint32_t base, uint32_t periodCount) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Load the MSB period Count + // + HWREG(base + CPUTIMER_O_PRD) = periodCount; +} + +//***************************************************************************** +// +//! Returns the current CPU timer counter value. +//! +//! \param base is the base address of the timer module. +//! +//! This function returns the current CPU timer counter value. +//! +//! \return Returns the current CPU timer count value. +// +//***************************************************************************** +static inline uint32_t CPUTimer_getTimerCount(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Get the TIMH:TIM registers value + // + return(HWREG(base + CPUTIMER_O_TIM)); +} + +//***************************************************************************** +// +//! Set CPU timer pre-scaler value. +//! +//! \param base is the base address of the timer module. +//! \param prescaler is the CPU timer pre-scaler value. +//! +//! This function sets the pre-scaler value for the CPU timer. For every value +//! of (prescaler + 1), the CPU timer counter decrements by 1. +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_setPreScaler(uint32_t base, uint16_t prescaler) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Writes to TPR.TDDR and TPRH.TDDRH bits + // + HWREGH(base + CPUTIMER_O_TPRH) = prescaler >> 8U; + HWREGH(base + CPUTIMER_O_TPR) = (prescaler & CPUTIMER_TPR_TDDR_M) ; +} + +//***************************************************************************** +// +//! Return the CPU timer overflow status. +//! +//! \param base is the base address of the timer module. +//! +//! This function returns the CPU timer overflow status. +//! +//! \return Returns true if the CPU timer has overflowed, false if not. +// +//***************************************************************************** +static inline bool CPUTimer_getTimerOverflowStatus(uint32_t base) +{ + ASSERT(CPUTimer_isBaseValid(base)); + + // + // Check if TIF bits of register TCR are set + // + return(((HWREGH(base + CPUTIMER_O_TCR) & CPUTIMER_TCR_TIF) == + CPUTIMER_TCR_TIF) ? true : false); +} + +//***************************************************************************** +// +//! Select CPU Timer 2 Clock Source and Prescaler +//! +//! \param base is the base address of the timer module. +//! \param source is the clock source to use for CPU Timer 2 +//! \param prescaler is the value that configures the selected clock source +//! relative to the system clock +//! +//! This function selects the specified clock source and prescaler value +//! for the CPU timer (CPU timer 2 only). +//! +//! The \e source parameter can be any one of the following: +//! - \b CPUTIMER_CLOCK_SOURCE_SYS - System Clock +//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC1 - Internal Oscillator 1 Clock +//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC2 - Internal Oscillator 2 Clock +//! - \b CPUTIMER_CLOCK_SOURCE_XTAL - External Clock +//! - \b CPUTIMER_CLOCK_SOURCE_AUX - Auxiliary PLL Clock +//! +//! The \e prescaler parameter can be any one of the following: +//! - \b CPUTIMER_CLOCK_PRESCALER_1 - Prescaler value of / 1 +//! - \b CPUTIMER_CLOCK_PRESCALER_2 - Prescaler value of / 2 +//! - \b CPUTIMER_CLOCK_PRESCALER_4 - Prescaler value of / 4 +//! - \b CPUTIMER_CLOCK_PRESCALER_8 - Prescaler value of / 8 +//! - \b CPUTIMER_CLOCK_PRESCALER_16 - Prescaler value of / 16 +//! +//! \return None. +// +//***************************************************************************** +static inline void CPUTimer_selectClockSource(uint32_t base, + CPUTimer_ClockSource source, + CPUTimer_Prescaler prescaler) +{ + ASSERT(base == CPUTIMER2_BASE); + + // + // Set source and prescaler for CPU Timer 2 + // + if(base == CPUTIMER2_BASE) + { + EALLOW; + + // + // Set Clock Source + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | (uint16_t)source; + SYSCTL_REGWRITE_DELAY; + + // + // Set Clock Prescaler + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M) | + ((uint16_t)prescaler < 0.0F); + + // + // Get the sign-extended offset trim value + // + oldOffsetTrim = (HWREGH(base + DAC_O_TRIM) & DAC_TRIM_OFFSET_TRIM_M); + oldOffsetTrim = ((oldOffsetTrim & (uint16_t)DAC_REG_BYTE_MASK) ^ + (uint16_t)0x80) - (uint16_t)0x80; + + // + // Calculate new offset trim value if DAC is operating at a reference + // voltage other than 2.5v. + // + newOffsetTrim = ((float32_t)(2.5 / referenceVoltage) * + (int16_t)oldOffsetTrim); + + // + // Check if the new offset trim value is valid + // + ASSERT(((int16_t)newOffsetTrim > -129) && ((int16_t)newOffsetTrim < 128)); + + // + // Set the new offset trim value + // + EALLOW; + HWREGH(base + DAC_O_TRIM) = (HWREGH(base + DAC_O_TRIM) & + ~DAC_TRIM_OFFSET_TRIM_M) | + (int16_t)newOffsetTrim; + + EDIS; + +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/dac.h b/gpio_driverlib_cpu1/device/driverlib/dac.h new file mode 100644 index 0000000..fcd866a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/dac.h @@ -0,0 +1,604 @@ +//########################################################################### +// +// FILE: dac.h +// +// TITLE: C28x DAC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DAC_H +#define DAC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dac_api DAC +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dac.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +// +// A 8-bit register mask +// +#define DAC_REG_BYTE_MASK (0xFFU) //!< Register Byte Mask + +// +// Lock Key +// +#define DAC_LOCK_KEY (0xA000U) //!< DAC Lock Key + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following are defines for the reg parameter of the +// DAC_lockRegister() and DAC_isRegisterLocked() functions. +// +//***************************************************************************** +#define DAC_LOCK_CONTROL (0x1U) //!< Lock the control register +#define DAC_LOCK_SHADOW (0x2U) //!< Lock the shadow value register +#define DAC_LOCK_OUTPUT (0x4U) //!< Lock the output enable register + +#endif // DOXYGEN_PDF_IGNORE + +//***************************************************************************** +// +//! Values that can be passed to DAC_setReferenceVoltage() as the \e source +//! parameter. +// +//***************************************************************************** +typedef enum +{ + DAC_REF_VDAC = 0, //!< VDAC reference voltage + DAC_REF_ADC_VREFHI = 1 //!< ADC VREFHI reference voltage +}DAC_ReferenceVoltage; + +//***************************************************************************** +// +//! Values that can be passed to DAC_setLoadMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + DAC_LOAD_SYSCLK = 0, //!< Load on next SYSCLK + DAC_LOAD_PWMSYNC = 4 //!< Load on next PWMSYNC specified by SYNCSEL +}DAC_LoadMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks DAC base address. +//! +//! \param base specifies the DAC module base address. +//! +//! This function determines if an DAC module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +DAC_isBaseValid(uint32_t base) +{ + return( + (base == DACA_BASE) || + (base == DACB_BASE) || + (base == DACC_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Get the DAC Revision value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC revision value. +//! +//! \return Returns the DAC revision value. +// +//***************************************************************************** +static inline uint16_t +DAC_getRevision(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the revision value. + // + return(HWREGH(base + DAC_O_REV) & DAC_REV_REV_M); +} + +//***************************************************************************** +// +//! Sets the DAC Reference Voltage +//! +//! \param base is the DAC module base address +//! \param source is the selected reference voltage +//! +//! This function sets the DAC reference voltage. +//! +//! The \e source parameter can have the following value: +//! - \b DAC_REF_VDAC - The VDAC reference voltage +//! - \b DAC_REF_ADC_VREFHI - The ADC VREFHI reference voltage +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setReferenceVoltage(uint32_t base, DAC_ReferenceVoltage source) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Set the reference voltage + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_DACREFSEL) | (uint16_t)source; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DAC Load Mode +//! +//! \param base is the DAC module base address +//! \param mode is the selected load mode +//! +//! This function sets the DAC load mode. +//! +//! The \e mode parameter can have one of two values: +//! - \b DAC_LOAD_SYSCLK - Load on next SYSCLK +//! - \b DAC_LOAD_PWMSYNC - Load on next PWMSYNC specified by SYNCSEL +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setLoadMode(uint32_t base, DAC_LoadMode mode) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Set the load mode + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_LOADMODE) | (uint16_t)mode; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DAC PWMSYNC Signal +//! +//! \param base is the DAC module base address +//! \param signal is the selected PWM signal +//! +//! This function sets the DAC PWMSYNC signal. +//! +//! The \e signal parameter must be set to a number that represents the PWM +//! signal that will be set. For instance, passing 2 into \e signal will +//! select PWM sync signal 2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setPWMSyncSignal(uint32_t base, uint16_t pwmSignal) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((pwmSignal > 0U) && (pwmSignal < 17U)); + + // + // Set the PWM sync signal + // + EALLOW; + + HWREGH(base + DAC_O_CTL) = (HWREGH(base + DAC_O_CTL) & + ~DAC_CTL_SYNCSEL_M) | + ((uint16_t)(pwmSignal - 1U) << + DAC_CTL_SYNCSEL_S); + + EDIS; +} + +//***************************************************************************** +// +//! Get the DAC Active Output Value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC active output value. +//! +//! \return Returns the DAC active output value. +// +//***************************************************************************** +static inline uint16_t +DAC_getActiveValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the active value + // + return(HWREGH(base + DAC_O_VALA) & DAC_VALA_DACVALA_M); +} + +//***************************************************************************** +// +//! Set the DAC Shadow Output Value +//! +//! \param base is the DAC module base address +//! \param value is the 12-bit code to be loaded into the active value register +//! +//! This function sets the DAC shadow output value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setShadowValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT(value <= DAC_VALS_DACVALS_M); + + // + // Set the shadow value + // + HWREGH(base + DAC_O_VALS) = (HWREGH(base + DAC_O_VALS) & + ~DAC_VALS_DACVALS_M) | + (uint16_t)(value & DAC_VALS_DACVALS_M); +} + +//***************************************************************************** +// +//! Get the DAC Shadow Output Value +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC shadow output value. +//! +//! \return Returns the DAC shadow output value. +// +//***************************************************************************** +static inline uint16_t +DAC_getShadowValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the shadow value + // + return(HWREGH(base + DAC_O_VALS) & DAC_VALS_DACVALS_M); +} + +//***************************************************************************** +// +//! Enable the DAC Output +//! +//! \param base is the DAC module base address +//! +//! This function enables the DAC output. +//! +//! \note A delay is required after enabling the DAC. Further details +//! regarding the exact delay time length can be found in the device datasheet. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_enableOutput(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Enable the output + // + EALLOW; + + HWREGH(base + DAC_O_OUTEN) |= DAC_OUTEN_DACOUTEN; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the DAC Output +//! +//! \param base is the DAC module base address +//! +//! This function disables the DAC output. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_disableOutput(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Disable the output + // + EALLOW; + + HWREGH(base + DAC_O_OUTEN) &= ~DAC_OUTEN_DACOUTEN; + + EDIS; +} + +//***************************************************************************** +// +//! Set DAC Offset Trim +//! +//! \param base is the DAC module base address +//! \param offset is the specified value for the offset trim +//! +//! This function sets the DAC offset trim. The \e offset value should be a +//! signed number in the range of -128 to 127. +//! +//! \note The offset should not be modified unless specifically indicated by +//! TI Errata or other documentation. Modifying the offset value could cause +//! this module to operate outside of the datasheet specifications. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_setOffsetTrim(uint32_t base, int16_t offset) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((offset > -129) && (offset < 128)); + + // + // Set the offset trim value + // + EALLOW; + + HWREGH(base + DAC_O_TRIM) = (HWREGH(base + DAC_O_TRIM) & + ~DAC_TRIM_OFFSET_TRIM_M) | (int16_t)offset; + + EDIS; +} + +//***************************************************************************** +// +//! Get DAC Offset Trim +//! +//! \param base is the DAC module base address +//! +//! This function gets the DAC offset trim value. +//! +//! \return None. +// +//***************************************************************************** +static inline int16_t +DAC_getOffsetTrim(uint32_t base) +{ + uint16_t value; + + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + + // + // Get the sign-extended offset trim value + // + value = (HWREGH(base + DAC_O_TRIM) & DAC_TRIM_OFFSET_TRIM_M); + value = ((value & (uint16_t)DAC_REG_BYTE_MASK) ^ (uint16_t)0x80) - + (uint16_t)0x80; + + return((int16_t)value); +} + +//***************************************************************************** +// +//! Lock write-access to DAC Register +//! +//! \param base is the DAC module base address +//! \param reg is the selected DAC registers +//! +//! This function locks the write-access to the specified DAC register. Only a +//! system reset can unlock the register once locked. +//! +//! The \e reg parameter can be an ORed combination of any of the following +//! values: +//! - \b DAC_LOCK_CONTROL - Lock the DAC control register +//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register +//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register +//! +//! \return None. +// +//***************************************************************************** +static inline void +DAC_lockRegister(uint32_t base, uint16_t reg) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((reg & ~(DAC_LOCK_CONTROL | DAC_LOCK_SHADOW | + DAC_LOCK_OUTPUT)) == 0U); + + // + // Lock the specified registers + // + EALLOW; + + HWREGH(base + DAC_O_LOCK) |= (DAC_LOCK_KEY | reg); + + EDIS; +} + +//***************************************************************************** +// +//! Check if DAC Register is locked +//! +//! \param base is the DAC module base address +//! \param reg is the selected DAC register locks to check +//! +//! This function checks if write-access has been locked on the specified DAC +//! register. +//! +//! The \e reg parameter can be an ORed combination of any of the following +//! values: +//! - \b DAC_LOCK_CONTROL - Lock the DAC control register +//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register +//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register +//! +//! \return Returns \b true if any of the registers specified are locked, and +//! \b false if all specified registers aren't locked. +// +//***************************************************************************** +static inline bool +DAC_isRegisterLocked(uint32_t base, uint16_t reg) +{ + // + // Check the arguments. + // + ASSERT(DAC_isBaseValid(base)); + ASSERT((reg & ~(DAC_LOCK_CONTROL | DAC_LOCK_SHADOW | + DAC_LOCK_OUTPUT)) == 0U); + + // + // Return the lock status on the specified registers + // + return((bool)((HWREGH(base + DAC_O_LOCK) & reg) != 0U)); +} + +//***************************************************************************** +// +//! Tune DAC Offset Trim +//! +//! \param base is the DAC module base address +//! \param referenceVoltage is the reference voltage the DAC +//! module is operating at. +//! +//! This function adjusts/tunes the DAC offset trim. The \e referenceVoltage +//! value should be a floating point number in the range specified in the +//! device data manual. +//! +//! \note Use this function to adjust the DAC offset trim if operating +//! at a reference voltage other than 2.5v. Since this function modifies +//! the DAC offset trim register, it should only be called once after +//! Device_cal. If it is called multiple times after Device_cal, the offset +//! value scaled would be the wrong value. +//! +//! \return None. +// +//***************************************************************************** +extern void +DAC_tuneOffsetTrim(uint32_t base, float32_t referenceVoltage); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DAC_H diff --git a/gpio_driverlib_cpu1/device/driverlib/dcsm.c b/gpio_driverlib_cpu1/device/driverlib/dcsm.c new file mode 100644 index 0000000..808027a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/dcsm.c @@ -0,0 +1,377 @@ +//############################################################################# +// +// FILE: dcsm.c +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#include "dcsm.h" + +//***************************************************************************** +// +// DCSM_unlockZone1CSM +// +//***************************************************************************** +void +DCSM_unlockZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey) +{ + uint32_t linkPointer; + uint32_t zsbBase = (DCSM_Z1OTP_BASE + 0x20U); // base address of the ZSB + int32_t bitPos = 28; // Bits [28:0] point to a ZSB (29-bit link pointer) + int32_t zeroFound = 0; + + // + // Check the arguments. + // + ASSERT(psCMDKey != NULL); + + linkPointer = HWREG(DCSM_Z1_BASE + DCSM_O_Z1_LINKPOINTER); + + // + // Bits 31 and 30 as most-significant 0 are invalid LinkPointer options + // + linkPointer = linkPointer << 3; + + // + // Zone-Select Block (ZSB) selection using Link-Pointers + // and 0's bit position within the Link pointer + // + while((zeroFound == 0) && (bitPos > -1)) + { + // + // The most significant bit position in the resolved link pointer + // which is 0, defines the valid base address for the ZSB. + // + if((linkPointer & 0x80000000U) == 0U) + { + zeroFound = 1; + // + // Base address of the ZSB is calculated using + // 0x10 as the slope/step with which zsbBase expands with + // change in the bitPos and 3*0x10 is the offset + // + zsbBase = (DCSM_Z1OTP_BASE + (((uint32_t)bitPos + 3U) * 0x10U)); + } + else + { + // + // Move through the linkPointer to find the most significant + // bit position of 0 + // + bitPos--; + linkPointer = linkPointer << 1; + } + } + + // + // Perform dummy reads on the 128-bit password + // Using linkPointer because it is no longer needed + // + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD0); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD1); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD2); + linkPointer = HWREG(zsbBase + DCSM_O_Z1_CSMPSWD3); + + if(psCMDKey != NULL) + { + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY0) = psCMDKey->csmKey0; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY1) = psCMDKey->csmKey1; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY2) = psCMDKey->csmKey2; + HWREG(DCSM_Z1_BASE + DCSM_O_Z1_CSMKEY3) = psCMDKey->csmKey3; + } +} + +//***************************************************************************** +// +// DCSM_unlockZone2CSM +// +//***************************************************************************** +void +DCSM_unlockZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey) +{ + uint32_t linkPointer; + uint32_t zsbBase = (DCSM_Z2OTP_BASE + 0x20U); // base address of the ZSB + int32_t bitPos = 28; // Bits [28:0] point to a ZSB (29-bit link pointer) + int32_t zeroFound = 0; + + // + // Check the arguments. + // + ASSERT(psCMDKey != NULL); + + linkPointer = HWREG(DCSM_Z2_BASE + DCSM_O_Z2_LINKPOINTER); + + // + // Bits 31 and 30 as most-significant 0 are invalid LinkPointer options + // + linkPointer = linkPointer << 3; + + // + // Zone-Select Block (ZSB) selection using Link-Pointers + // and 0's bit position within the Link pointer + // + while((zeroFound == 0) && (bitPos > -1)) + { + // + // The most significant bit position in the resolved link pointer + // which is 0, defines the valid base address for the ZSB. + // + if((linkPointer & 0x80000000U) == 0U) + { + zeroFound = 1; + // + // Base address of the ZSB is calculated using + // 0x10 as the slope/step with which zsbBase expands with + // change in the bitPos and 3*0x10 is the offset + // + zsbBase = (DCSM_Z2OTP_BASE + (((uint32_t)bitPos + 3U) * 0x10U)); + } + else + { + // + // Move through the linkPointer to find the most significant + // bit position of 0 + // + bitPos--; + linkPointer = linkPointer << 1; + } + } + + // + // Perform dummy reads on the 128-bit password + // Using linkPointer because it is no longer needed + // + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD0); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD1); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD2); + linkPointer = HWREG(zsbBase + DCSM_O_Z2_CSMPSWD3); + + if(psCMDKey != NULL) + { + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY0) = psCMDKey->csmKey0; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY1) = psCMDKey->csmKey1; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY2) = psCMDKey->csmKey2; + HWREG(DCSM_Z2_BASE + DCSM_O_Z2_CSMKEY3) = psCMDKey->csmKey3; + } +} +//***************************************************************************** +// +// DCSM_getZone1FlashEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone1FlashEXEStatus(DCSM_Sector sector) +{ + uint16_t regValue; + DCSM_EXEOnlyStatus status; + + // + // Check if sector belongs to this zone + // + if(DCSM_getFlashSectorZone(sector) != DCSM_MEMORY_ZONE1) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status register + // + regValue = HWREGH(DCSM_Z1_BASE + DCSM_O_Z1_EXEONLYSECTR); + // + // Get the EXE status of the Flash Sector + // + status = (DCSM_EXEOnlyStatus)((uint16_t) + ((regValue >> (uint16_t)sector) & + 0x01U)); + } + return(status); +} + +//***************************************************************************** +// +// DCSM_getZone1RAMEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone1RAMEXEStatus(DCSM_RAMModule module) +{ + ASSERT(module != DCSM_CLA); + uint32_t status; + + // + // Check if module belongs to this zone + // + if(DCSM_getRAMZone(module) != DCSM_MEMORY_ZONE1) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status of the RAM Module + // + status = (uint16_t)((HWREGH(DCSM_Z1_BASE + DCSM_O_Z1_EXEONLYRAMR) >> + (uint16_t)module) & 0x01U); + } + return((DCSM_EXEOnlyStatus)status); +} + +//***************************************************************************** +// +// DCSM_getZone2FlashEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone2FlashEXEStatus(DCSM_Sector sector) +{ + uint16_t regValue; + DCSM_EXEOnlyStatus status; + + // + // Check if sector belongs to this zone + // + if(DCSM_getFlashSectorZone(sector) != DCSM_MEMORY_ZONE2) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status register + // + regValue = HWREGH(DCSM_Z2_BASE + DCSM_O_Z2_EXEONLYSECTR); + // + // Get the EXE status of the Flash Sector + // + status = (DCSM_EXEOnlyStatus)((uint16_t)((regValue >> + (uint16_t)sector) & 0x01U)); + } + + return(status); +} + +//***************************************************************************** +// +// DCSM_getZone2RAMEXEStatus +// +//***************************************************************************** +DCSM_EXEOnlyStatus +DCSM_getZone2RAMEXEStatus(DCSM_RAMModule module) +{ + ASSERT(module != DCSM_CLA); + uint32_t status; + + // + // Check if module belongs to this zone + // + if(DCSM_getRAMZone(module) != DCSM_MEMORY_ZONE2) + { + status = DCSM_INCORRECT_ZONE; + } + else + { + // + // Get the EXE status of the RAM Module + // + status = (uint16_t)((HWREGH(DCSM_Z2_BASE + + DCSM_O_Z2_EXEONLYRAMR) >> (uint16_t)module) & 0x01U); + } + return((DCSM_EXEOnlyStatus)status); +} + +//***************************************************************************** +// +// DCSM_claimZoneSemaphore +// +//***************************************************************************** +bool +DCSM_claimZoneSemaphore(DCSM_SemaphoreZone zone) +{ + // + // FLSEM register address. + // + uint32_t regAddress = DCSMCOMMON_BASE + DCSM_O_FLSEM; + + EALLOW; + + // + // Write 0xA5 to the key and write the zone that is attempting to claim the + // Flash Pump Semaphore to the semaphore bits. + // + HWREGH(regAddress) = ((uint16_t)FLSEM_KEY << DCSM_FLSEM_KEY_S) | + (uint16_t)zone; + EDIS; + + // + // If the calling function was unable to claim the zone semaphore, then + // return false + // + return(((HWREGH(regAddress) & DCSM_FLSEM_SEM_M) == (uint16_t)zone) ? + true : false); +} + +//***************************************************************************** +// +// DCSM_releaseZoneSemaphore +// +//***************************************************************************** +bool +DCSM_releaseZoneSemaphore(void) +{ + // + // FLSEM register address. + // + uint32_t regAddress = DCSMCOMMON_BASE + DCSM_O_FLSEM; + + EALLOW; + + // + // Write 0xA5 to the key and write the zone that is attempting to claim the + // Flash Pump Semaphore to the semaphore bits. + // + HWREGH(regAddress) = ((uint16_t)FLSEM_KEY << DCSM_FLSEM_KEY_S); + EDIS; + + // + // If the calling function was unable to release the zone semaphore, then + // return false + // + return(((HWREGH(regAddress) & DCSM_FLSEM_SEM_M) == 0x0U) ? true : false); +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/dcsm.h b/gpio_driverlib_cpu1/device/driverlib/dcsm.h new file mode 100644 index 0000000..d181fa7 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/dcsm.h @@ -0,0 +1,669 @@ +//############################################################################# +// +// FILE: dcsm.h +// +// TITLE: C28x Driver for the DCSM security module. +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef DCSM_H +#define DCSM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dcsm_api DCSM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dcsm.h" +#include "inc/hw_types.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the unlockZone1CSM() and unlockZone2CSM(). +// These are not parameters for any function. +// These are not intended for application code. +// +//***************************************************************************** + +#define DCSM_O_Z1_CSMPSWD0 0x08U //!< Z1 CSMPSWD0 offset +#define DCSM_O_Z1_CSMPSWD1 0x0AU //!< Z1 CSMPSWD1 offset +#define DCSM_O_Z1_CSMPSWD2 0x0CU //!< Z1 CSMPSWD2 offset +#define DCSM_O_Z1_CSMPSWD3 0x0EU //!< Z1 CSMPSWD3 offset +#define DCSM_O_Z2_CSMPSWD0 0x08U //!< Z2 CSMPSWD0 offset +#define DCSM_O_Z2_CSMPSWD1 0x0AU //!< Z2 CSMPSWD1 offset +#define DCSM_O_Z2_CSMPSWD2 0x0CU //!< Z2 CSMPSWD2 offset +#define DCSM_O_Z2_CSMPSWD3 0x0EU //!< Z2 CSMPSWD3 offset + +//***************************************************************************** +// +// Register key defines. +// +//***************************************************************************** +#define FLSEM_KEY 0xA5U //!< Zone semaphore key + +//***************************************************************************** +// +//! Data structures to hold password keys. +// +//***************************************************************************** +typedef struct +{ + uint32_t csmKey0; + uint32_t csmKey1; + uint32_t csmKey2; + uint32_t csmKey3; +} DCSM_CSMPasswordKey; + +//***************************************************************************** +// +//! Values to distinguish the status of RAM or FLASH sectors. These values +//! describe which zone the memory location belongs too. +//! These values can be returned from DCSM_getRAMZone(), +//! DCSM_getFlashSectorZone(). +// +//***************************************************************************** +typedef enum +{ + DCSM_MEMORY_INACCESSIBLE, //!< Inaccessible + DCSM_MEMORY_ZONE1, //!< Zone 1 + DCSM_MEMORY_ZONE2, //!< Zone 2 + DCSM_MEMORY_FULL_ACCESS //!< Full access +} DCSM_MemoryStatus; + +//***************************************************************************** +// +//! Values to pass to DCSM_claimZoneSemaphore(). These values are used +//! to describe the zone that can write to Flash Wrapper registers. +// +//***************************************************************************** +typedef enum +{ + DCSM_FLSEM_ZONE1 = 0x01U, //!< Flash semaphore Zone 1 + DCSM_FLSEM_ZONE2 = 0x02U //!< Flash semaphore Zone 2 +} DCSM_SemaphoreZone; + +//***************************************************************************** +// +//! Values to distinguish the security status of the zones. +//! These values can be returned from DCSM_getZone1CSMSecurityStatus(), +//! DCSM_getZone2CSMSecurityStatus(). +// +//***************************************************************************** +typedef enum +{ + DCSM_STATUS_SECURE, //!< Secure + DCSM_STATUS_UNSECURE, //!< Unsecure + DCSM_STATUS_LOCKED, //!< Locked +} DCSM_SecurityStatus; + +//***************************************************************************** +// +// Values to distinguish the status of the Control Registers. These values +// describe can be used with the return values of +// DCSM_getZone1ControlStatus(), and DCSM_getZone2ControlStatus(). +// +//***************************************************************************** +#define DCSM_ALLZERO 0x08U //!< CSM Passwords all zeros +#define DCSM_ALLONE 0x10U //!< CSM Passwords all ones +#define DCSM_UNSECURE 0x20U //!< Zone is secure/unsecure +#define DCSM_ARMED 0x40U //!< CSM is armed + +//***************************************************************************** +// +//! Values to decribe the EXEONLY Status. +//! These values are returned from to DCSM_getZone1RAMEXEStatus(), +//! DCSM_getZone2RAMEXEStatus(), DCSM_getZone1FlashEXEStatus(), +//! DCSM_getZone2FlashEXEStatus(). +// +//***************************************************************************** +typedef enum +{ + DCSM_PROTECTED, //!< Protected + DCSM_UNPROTECTED, //!< Unprotected + DCSM_INCORRECT_ZONE //!< Incorrect Zone +}DCSM_EXEOnlyStatus; + +//***************************************************************************** +// +//! Values to distinguish RAM Module. +//! These values can be passed to DCSM_getZone1RAMEXEStatus() +//! DCSM_getZone2RAMEXEStatus(), DCSM_getRAMZone(). +// +//***************************************************************************** +typedef enum +{ + // + //C28x RAMs + // + DCSM_RAMLS0, //!< RAMLS0 + DCSM_RAMLS1, //!< RAMLS1 + DCSM_RAMLS2, //!< RAMLS2 + DCSM_RAMLS3, //!< RAMLS3 + DCSM_RAMLS4, //!< RAMLS4 + DCSM_RAMLS5, //!< RAMLS5 + DCSM_RAMD0, //!< RAMD0 + DCSM_RAMD1, //!< RAMD1 + DCSM_CLA = 14U //!> + shift) & 0x03U); + return((DCSM_MemoryStatus)ramStatus); +} + +//***************************************************************************** +// +//! Returns the security zone a flash sector belongs to +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function returns the security zone a flash sector belongs to. +//! +//! \return Returns DCSM_MEMORY_INACCESSIBLE if the section is inaccessible , +//! DCSM_MEMORY_ZONE1 if the section belongs to zone 1, DCSM_MEMORY_ZONE2 if +//! the section belongs to zone 2 and DCSM_MEMORY_FULL_ACCESS if the section +//! doesn't belong to any zone (or if the section is unsecure).. +// +//***************************************************************************** +static inline DCSM_MemoryStatus +DCSM_getFlashSectorZone(DCSM_Sector sector) +{ + uint32_t sectStat; + uint16_t shift; + + // + // Get the Sector status register for the specific bank + // + sectStat = HWREG(DCSMCOMMON_BASE + DCSM_O_SECTSTAT); + shift = (uint16_t)sector * 2U; + + // + //Read the SECTSTAT register for the specific Flash Sector. + // + return((DCSM_MemoryStatus)((uint16_t)((sectStat >> shift) & 0x3U))); +} + +//***************************************************************************** +// +//! Read Zone 1 Link Pointer Error +//! +//! A non-zero value indicates an error on the bit position that is set to 1. +//! +//! \return Returns the value of the Zone 1 Link Pointer error. +// +//***************************************************************************** +static inline uint32_t +DCSM_getZone1LinkPointerError(void) +{ + // + // Return the LinkPointer Error for specific bank + // + return(HWREG(DCSM_Z1_BASE + DCSM_O_Z1_LINKPOINTERERR)); +} + +//***************************************************************************** +// +//! Read Zone 2 Link Pointer Error +//! +//! A non-zero value indicates an error on the bit position that is set to 1. +//! +//! \return Returns the value of the Zone 2 Link Pointer error. +// +//***************************************************************************** +static inline uint32_t +DCSM_getZone2LinkPointerError(void) +{ + // + // Return the LinkPointer Error for specific bank + // + return(HWREG(DCSM_Z2_BASE + DCSM_O_Z2_LINKPOINTERERR)); +} + +//***************************************************************************** +// +//! Unlocks Zone 1 CSM. +//! +//! \param psCMDKey is a pointer to the DCSM_CSMPasswordKey struct that has the +//! CSM password for zone 1. +//! +//! This function unlocks the CSM password. It first reads the +//! four password locations in the User OTP. If any of the password values is +//! different from 0xFFFFFFFF, it unlocks the device by writing the provided +//! passwords into CSM Key registers +//! +//! \return None. +//! +//! \note This function should not be called in an actual application, +//! should only be used for once to program the OTP memory. Ensure flash data +//! cache is disabled before calling this function(Flash_disableCache). +// +//***************************************************************************** +extern void +DCSM_unlockZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey); + +//***************************************************************************** +// +//! Unlocks Zone 2 CSM. +//! +//! \param psCMDKey is a pointer to the CSMPSWDKEY that has the CSM +//! password for zone 2. +//! +//! This function unlocks the CSM password. It first reads +//! the four password locations in the User OTP. If any of the password values +//! is different from 0xFFFFFFFF, it unlocks the device by writing the +//! provided passwords into CSM Key registers +//! +//! \return None. +//! +//! \note This function should not be called in an actual application, +//! should only be used for once to program the OTP memory. Ensure flash data +//! cache is disabled before calling this function(Flash_disableCache). +// +//***************************************************************************** +extern void +DCSM_unlockZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey); +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 1 for a flash sector +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function takes in a valid sector value and returns the status of EXE +//! ONLY security protection for the sector. +//! +//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if sector does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone1FlashEXEStatus(DCSM_Sector sector); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 1 for a RAM module +//! +//! \param module is the RAM module value. Valid values are type DCSM_RAMModule +//! C28x RAMs : +//! - \b DCSM_RAMLS0 +//! - \b DCSM_RAMLS1 +//! - \b DCSM_RAMLS2 +//! - \b DCSM_RAMLS3 +//! - \b DCSM_RAMLS4 +//! - \b DCSM_RAMLS5 +//! - \b DCSM_RAMD0 +//! - \b DCSM_RAMD1 +//! +//! This function takes in a valid module value and returns the status of EXE +//! ONLY security protection for that module. DCSM_CLA is an invalid module +//! value. There is no EXE-ONLY available for DCSM_CLA. +//! +//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if module does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone1RAMEXEStatus(DCSM_RAMModule module); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 2 for a flash sector +//! +//! \param sector is the flash sector value. Use DCSM_Sector type. +//! +//! This function takes in a valid sector value and returns the status of EXE +//! ONLY security protection for the sector. +//! +//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if sector does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone2FlashEXEStatus(DCSM_Sector sector); + +//***************************************************************************** +// +//! Returns the EXE-ONLY status of zone 2 for a RAM module +//! +//! \param module is the RAM module value. Valid values are type DCSM_RAMModule +//! C28x RAMs : +//! - \b DCSM_RAMLS0 +//! - \b DCSM_RAMLS1 +//! - \b DCSM_RAMLS2 +//! - \b DCSM_RAMLS3 +//! - \b DCSM_RAMLS4 +//! - \b DCSM_RAMLS5 +//! - \b DCSM_RAMD0 +//! - \b DCSM_RAMD1 +//! +//! This function takes in a valid module value and returns the status of EXE +//! ONLY security protection for that module. DCSM_CLA is an invalid module +//! value. There is no EXE-ONLY available for DCSM_CLA. +//! +//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected, +//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected, +//! DCSM_INCORRECT_ZONE if module does not belong to this zone. +// +//***************************************************************************** +extern DCSM_EXEOnlyStatus +DCSM_getZone2RAMEXEStatus(DCSM_RAMModule module); + +//***************************************************************************** +// +//! Claims the zone semaphore which allows access to the Flash Wrapper register +//! for that zone. +//! +//! \param zone is the zone which is trying to claim the semaphore which allows +//! access to the Flash Wrapper registers. +//! +//! \return Returns true for a successful semaphore capture, false if it was +//! unable to capture the semaphore. +// +//***************************************************************************** +extern bool +DCSM_claimZoneSemaphore(DCSM_SemaphoreZone zone); + +//***************************************************************************** +// +//! Releases the zone semaphore. +//! +//! \return Returns true if it was successful in releasing the zone semaphore +//! and false if it was unsuccessful in releasing the zone semaphore. +//! +//! \note If the calling function is not in the right zone to be able +//! to access this register, it will return a false. +// +//***************************************************************************** +extern bool +DCSM_releaseZoneSemaphore(void); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DCSM_H diff --git a/gpio_driverlib_cpu1/device/driverlib/debug.h b/gpio_driverlib_cpu1/device/driverlib/debug.h new file mode 100644 index 0000000..5a2f93a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/debug.h @@ -0,0 +1,91 @@ +//########################################################################### +// +// FILE: debug.h +// +// TITLE: Assert definition macro for debug. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DEBUG_H +#define DEBUG_H + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. It is the +// application's responsibility to define the __error__ function. +// +//***************************************************************************** +extern void __error__(const char *filename, uint32_t line); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#ifdef __TMS320C28XX__ +// +// When called from C28x application +// +#define ASSERT(expr) do \ + { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } \ + while((_Bool)0) +#else +// +// When called from CLA application. Update as needed. +// +#define ASSERT(expr) do \ + { \ + if(!(expr)) \ + { \ + __mdebugstop(); \ + } \ + } \ + while((_Bool)0) +#endif +#else +#define ASSERT(expr) +#endif + +#endif // DEBUG_H diff --git a/gpio_driverlib_cpu1/device/driverlib/dma.c b/gpio_driverlib_cpu1/device/driverlib/dma.c new file mode 100644 index 0000000..ea591b1 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/dma.c @@ -0,0 +1,370 @@ +//########################################################################### +// +// FILE: dma.c +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "dma.h" + +//***************************************************************************** +// +// DMA_configAddresses +// +//***************************************************************************** +void DMA_configAddresses(uint32_t base, const void *destAddr, + const void *srcAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up SOURCE address. + // + HWREG(base + DMA_O_SRC_BEG_ADDR_SHADOW) = (uint32_t)srcAddr; + HWREG(base + DMA_O_SRC_ADDR_SHADOW) = (uint32_t)srcAddr; + + // + // Set up DESTINATION address. + // + HWREG(base + DMA_O_DST_BEG_ADDR_SHADOW) = (uint32_t)destAddr; + HWREG(base + DMA_O_DST_ADDR_SHADOW) = (uint32_t)destAddr; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configBurst +// +//***************************************************************************** +void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep, + int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT((size >= 1U) && (size <= 32U)); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up BURST registers. + // + HWREGH(base + DMA_O_BURST_SIZE) = size - 1U; + HWREGH(base + DMA_O_SRC_BURST_STEP) = srcStep; + HWREGH(base + DMA_O_DST_BURST_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configTransfer +// +//***************************************************************************** +void DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep, + int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT(transferSize <= 0x10000U); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up TRANSFER registers. + // + HWREGH(base + DMA_O_TRANSFER_SIZE) = (uint16_t)(transferSize - 1U); + HWREGH(base + DMA_O_SRC_TRANSFER_STEP) = srcStep; + HWREGH(base + DMA_O_DST_TRANSFER_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configWrap +// +//***************************************************************************** +void DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep, + uint32_t destWrapSize, int16_t destStep) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT((srcWrapSize <= 0x10000U) || (destWrapSize <= 0x10000U)); + ASSERT(((srcStep >= -4096) && (srcStep <= 4095)) && + ((destStep >= -4096) && (destStep <= 4095))); + + EALLOW; + + // + // Set up WRAP registers. + // + HWREGH(base + DMA_O_SRC_WRAP_SIZE) = (uint16_t)(srcWrapSize - 1U); + HWREGH(base + DMA_O_SRC_WRAP_STEP) = srcStep; + + HWREGH(base + DMA_O_DST_WRAP_SIZE) = (uint16_t)(destWrapSize - 1U); + HWREGH(base + DMA_O_DST_WRAP_STEP) = destStep; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configMode +// +//***************************************************************************** +void DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up trigger selection in the CMA/CLA trigger source selection + // registers. These are considered part of system control. + // + switch(base) + { + case DMA_CH1_BASE: + // + // Channel 1 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH1_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH1_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH1_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH1_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 1U; + break; + + case DMA_CH2_BASE: + // + // Channel 2 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH2_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH2_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH2_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH2_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 2U; + break; + + case DMA_CH3_BASE: + // + // Channel 3 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH3_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH3_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH3_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH3_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 3U; + break; + + case DMA_CH4_BASE: + // + // Channel 4 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL1) & + ~((uint32_t)SYSCTL_DMACHSRCSEL1_CH4_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL1_CH4_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH4_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH4_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 4U; + break; + + case DMA_CH5_BASE: + // + // Channel 5 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) & + ~((uint32_t)SYSCTL_DMACHSRCSEL2_CH5_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL2_CH5_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH5_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH5_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 5U; + break; + + case DMA_CH6_BASE: + // + // Channel 6 + // + HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) = + (HWREG(DMACLASRCSEL_BASE + SYSCTL_O_DMACHSRCSEL2) & + ~((uint32_t)SYSCTL_DMACHSRCSEL2_CH6_M)) | + ((uint32_t)trigger << SYSCTL_DMACHSRCSEL2_CH6_S); + + // + // Set peripheral interrupt select bits to the channel number. + // + HWREGH(DMA_CH6_BASE + DMA_O_MODE) = + (HWREGH(DMA_CH6_BASE + DMA_O_MODE) & ~DMA_MODE_PERINTSEL_M) | 6U; + break; + + default: + // + // Invalid base. + // + break; + } + + // + // Write the configuration to the mode register. + // + HWREGH(base + DMA_O_MODE) &= ~(DMA_MODE_DATASIZE | DMA_MODE_CONTINUOUS | + DMA_MODE_ONESHOT); + HWREGH(base + DMA_O_MODE) |= config; + + EDIS; +} + +//***************************************************************************** +// +// DMA_configChannel +// +//***************************************************************************** +void DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + ASSERT(((transfParams->configSize == DMA_CFG_SIZE_16BIT) || + (transfParams->configSize == DMA_CFG_SIZE_32BIT)) && + ((transfParams->transferMode == DMA_CFG_ONESHOT_DISABLE) || + (transfParams->transferMode == DMA_CFG_ONESHOT_ENABLE)) && + ((transfParams->reinitMode == DMA_CFG_CONTINUOUS_DISABLE) || + (transfParams->reinitMode == DMA_CFG_CONTINUOUS_ENABLE))); + + // + // Configure DMA Channel + // + DMA_configAddresses(base, (const void *)transfParams->destAddr, + (const void *)transfParams->srcAddr); + + // + // Configure the size of each burst and the address step size + // + DMA_configBurst(base, transfParams->burstSize, transfParams->srcBurstStep, + transfParams->destBurstStep); + + // + // Configure the transfer size and the address step that is + // made after each burst. + // + DMA_configTransfer(base, transfParams->transferSize, + transfParams->srcTransferStep, + transfParams->destTransferStep); + + // + // Configure the DMA channel's wrap settings + // + DMA_configWrap(base, transfParams->srcWrapSize, transfParams->srcWrapStep, + transfParams->destWrapSize, transfParams->destWrapStep); + + // + // Configure the DMA channel's trigger and mode + // + DMA_configMode(base, transfParams->transferTrigger, + transfParams->transferMode | transfParams->reinitMode | + transfParams->configSize); + + // + // Enable the selected peripheral trigger to start a DMA transfer + // + DMA_enableTrigger(base); + + if(transfParams->enableInterrupt) + { + // + // Set the channel interrupt mode + // + DMA_setInterruptMode(base, transfParams->interruptMode); + + // + // Enable the indicated DMA channel interrupt source + // + DMA_enableInterrupt(base); + } + else + { + // + // Disable the indicated DMA channel interrupt source + // + DMA_disableInterrupt(base); + } +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/dma.h b/gpio_driverlib_cpu1/device/driverlib/dma.h new file mode 100644 index 0000000..ae57689 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/dma.h @@ -0,0 +1,1171 @@ +//########################################################################### +// +// FILE: dma.h +// +// TITLE: C28x DMA driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef DMA_H +#define DMA_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup dma_api DMA +//! \brief This module is used for DMA configurations. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_dma.h" +#include "inc/hw_memmap.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Values that can be passed to DMA_configMode() as the config parameter. +// +//***************************************************************************** +//! Only one burst transfer performed per trigger. +#define DMA_CFG_ONESHOT_DISABLE 0U +//! Burst transfers occur without additional event triggers after the first. +#define DMA_CFG_ONESHOT_ENABLE DMA_MODE_ONESHOT + +//! DMA channel will be disabled at the end of a transfer. +#define DMA_CFG_CONTINUOUS_DISABLE 0U +//! DMA reinitializes when the transfer count is zero and waits for a trigger. +#define DMA_CFG_CONTINUOUS_ENABLE DMA_MODE_CONTINUOUS + +//! DMA transfers 16 bits at a time. +#define DMA_CFG_SIZE_16BIT 0U +//! DMA transfers 32 bits at a time. +#define DMA_CFG_SIZE_32BIT DMA_MODE_DATASIZE + +//***************************************************************************** +// +//! Values that can be passed to DMA_configMode() as the \e trigger parameter. +// +//***************************************************************************** +typedef enum +{ + DMA_TRIGGER_SOFTWARE = 0, + + DMA_TRIGGER_ADCA1 = 1, + DMA_TRIGGER_ADCA2 = 2, + DMA_TRIGGER_ADCA3 = 3, + DMA_TRIGGER_ADCA4 = 4, + DMA_TRIGGER_ADCAEVT = 5, + DMA_TRIGGER_ADCB1 = 6, + DMA_TRIGGER_ADCB2 = 7, + DMA_TRIGGER_ADCB3 = 8, + DMA_TRIGGER_ADCB4 = 9, + DMA_TRIGGER_ADCBEVT = 10, + DMA_TRIGGER_ADCC1 = 11, + DMA_TRIGGER_ADCC2 = 12, + DMA_TRIGGER_ADCC3 = 13, + DMA_TRIGGER_ADCC4 = 14, + DMA_TRIGGER_ADCCEVT = 15, + DMA_TRIGGER_ADCD1 = 16, + DMA_TRIGGER_ADCD2 = 17, + DMA_TRIGGER_ADCD3 = 18, + DMA_TRIGGER_ADCD4 = 19, + DMA_TRIGGER_ADCDEVT = 20, + + DMA_TRIGGER_XINT1 = 29, + DMA_TRIGGER_XINT2 = 30, + DMA_TRIGGER_XINT3 = 31, + DMA_TRIGGER_XINT4 = 32, + DMA_TRIGGER_XINT5 = 33, + + DMA_TRIGGER_EPWM1SOCA = 36, + DMA_TRIGGER_EPWM1SOCB = 37, + DMA_TRIGGER_EPWM2SOCA = 38, + DMA_TRIGGER_EPWM2SOCB = 39, + DMA_TRIGGER_EPWM3SOCA = 40, + DMA_TRIGGER_EPWM3SOCB = 41, + DMA_TRIGGER_EPWM4SOCA = 42, + DMA_TRIGGER_EPWM4SOCB = 43, + DMA_TRIGGER_EPWM5SOCA = 44, + DMA_TRIGGER_EPWM5SOCB = 45, + DMA_TRIGGER_EPWM6SOCA = 46, + DMA_TRIGGER_EPWM6SOCB = 47, + DMA_TRIGGER_EPWM7SOCA = 48, + DMA_TRIGGER_EPWM7SOCB = 49, + DMA_TRIGGER_EPWM8SOCA = 50, + DMA_TRIGGER_EPWM8SOCB = 51, + DMA_TRIGGER_EPWM9SOCA = 52, + DMA_TRIGGER_EPWM9SOCB = 53, + DMA_TRIGGER_EPWM10SOCA = 54, + DMA_TRIGGER_EPWM10SOCB = 55, + DMA_TRIGGER_EPWM11SOCA = 56, + DMA_TRIGGER_EPWM11SOCB = 57, + DMA_TRIGGER_EPWM12SOCA = 58, + DMA_TRIGGER_EPWM12SOCB = 59, + + DMA_TRIGGER_TINT0 = 68, + DMA_TRIGGER_TINT1 = 69, + DMA_TRIGGER_TINT2 = 70, + + DMA_TRIGGER_MCBSPAMXEVT = 71, + DMA_TRIGGER_MCBSPAMREVT = 72, + DMA_TRIGGER_MCBSPBMXEVT = 73, + DMA_TRIGGER_MCBSPBMREVT = 74, + + + DMA_TRIGGER_SDFM1FLT1 = 95, + DMA_TRIGGER_SDFM1FLT2 = 96, + DMA_TRIGGER_SDFM1FLT3 = 97, + DMA_TRIGGER_SDFM1FLT4 = 98, + + DMA_TRIGGER_SDFM2FLT1 = 99, + DMA_TRIGGER_SDFM2FLT2 = 100, + DMA_TRIGGER_SDFM2FLT3 = 101, + DMA_TRIGGER_SDFM2FLT4 = 102, + + + DMA_TRIGGER_SPIATX = 109, + DMA_TRIGGER_SPIARX = 110, + DMA_TRIGGER_SPIBTX = 111, + DMA_TRIGGER_SPIBRX = 112, + DMA_TRIGGER_SPICTX = 113, + DMA_TRIGGER_SPICRX = 114, + + DMA_TRIGGER_CLB1INT = 127, + DMA_TRIGGER_CLB2INT = 128, + DMA_TRIGGER_CLB3INT = 129, + DMA_TRIGGER_CLB4INT = 130, + +} DMA_Trigger; + +//***************************************************************************** +// +//! Values that can be passed to DMA_setInterruptMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! DMA interrupt is generated at the beginning of a transfer + DMA_INT_AT_BEGINNING, + //! DMA interrupt is generated at the end of a transfer + DMA_INT_AT_END +} DMA_InterruptMode; + +//***************************************************************************** +// +//! Values that can be passed to DMA_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Transmission stops after current read-write access is completed + DMA_EMULATION_STOP, + //! Continue DMA operation regardless of emulation suspend + DMA_EMULATION_FREE_RUN +} DMA_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to DMA_configChannel() as the +//! configure parameter. +// +//***************************************************************************** +typedef struct +{ + DMA_Trigger transferTrigger; //DMA transfer triggers + DMA_InterruptMode interruptMode; //Channel interrupt mode + //! enableInterrupt can have a value 1(Enable) or 0(Disable) + bool enableInterrupt; //Enable/Disable interrupt mode + //! configSize can have a value DMA_CFG_SIZE_16BIT/32BIT + uint32_t configSize; //Data bus width (16 or 32 bits) + //! transferMode can have a value DMA_CFG_ONESHOT_DISABLE/ENABLE + uint32_t transferMode; //Burst transfer mode + //! reinitMode can have a value DMA_CFG_CONTINUOUS_DISABLE/ENABLE + uint32_t reinitMode; //DMA reinitialization mode + //! burstSize value range from 1 word to 32 sixteen-bit words. + uint32_t burstSize; //Number of words transferred per burst + //! transferSize value range from 1 to 65536 + uint32_t transferSize; //Number of bursts per transfer + //! Number of bursts to be transferred before a wrap of the source address + //! occurs. srcWrapSize value range from 1 to 65536 + uint32_t srcWrapSize; + //! Number of bursts to be transferred before a wrap of the destination + //! address occurs. destWrapSize value range from 1 to 65536 + uint32_t destWrapSize; + uint32_t destAddr; //destination address + uint32_t srcAddr; //source address + //! Amount to inc or dec the source address after each word of a burst. + //! srcBurstStep can have only signed values from -4096 to 4095 + int16_t srcBurstStep; + //! Amount to inc or dec the destination address after each word of a burst. + //! destBurstStep can have only signed values from -4096 to 4095 + int16_t destBurstStep; + //! Amount to inc or dec the source address after each burst of a transfer. + //! srcTransferStep can have only signed values from -4096 to 4095 + int16_t srcTransferStep; + //! Amount to inc or dec the destination address after each burst of a + //! transfer. destTransferStep can have only signed values from -4096 to 4095 + int16_t destTransferStep; + //! Amount to inc or dec the source address when the wrap occurs. + //! srcWrapStep can have only signed values from -4096 to 4095 + int16_t srcWrapStep; + //! Amount to inc or dec the destination address when the wrap occurs. + //! destWrapStep can have only signed values from -4096 to 4095 + int16_t destWrapStep; + +} DMA_ConfigParams; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an DMA channel base address. +//! +//! \param base specifies the DMA channel base address. +//! +//! This function determines if a DMA channel base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +DMA_isBaseValid(uint32_t base) +{ + return((base == DMA_CH1_BASE) || (base == DMA_CH2_BASE) || + (base == DMA_CH3_BASE) || (base == DMA_CH4_BASE) || + (base == DMA_CH5_BASE) || (base == DMA_CH6_BASE)); +} +#endif + +//***************************************************************************** +// +//! Initializes the DMA controller to a known state. +//! +//! This function configures does a hard reset of the DMA controller in order +//! to put it into a known state. The function also sets the DMA to run free +//! during an emulation suspend (see the field DEBUGCTRL.FREE for more info). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_initController(void) +{ + EALLOW; + + // + // Set the hard reset bit. One NOP is required after HARDRESET. + // + HWREGH(DMA_BASE + DMA_O_CTRL) |= DMA_CTRL_HARDRESET; + NOP; + + EDIS; +} + +//***************************************************************************** +// +//! Channel Soft Reset +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function does a soft reset to place the channel into its default state +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_triggerSoftReset(uint32_t base) +{ + EALLOW; + + // + // Set the soft reset bit. One NOP is required after SOFTRESET. + // + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_SOFTRESET; + NOP; + + EDIS; +} + +//***************************************************************************** +// +//! Sets DMA emulation mode. +//! +//! \param mode is the emulation mode to be selected. +//! +//! This function sets the behavior of the DMA operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b DMA_EMULATION_STOP - DMA runs until the current read-write access is +//! completed. +//! - \b DMA_EMULATION_FREE_RUN - DMA operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setEmulationMode(DMA_EmulationMode mode) +{ + EALLOW; + + // + // Set emulation mode + // + if(mode == DMA_EMULATION_STOP) + { + HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) &= ~DMA_DEBUGCTRL_FREE; + } + else + { + HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) |= DMA_DEBUGCTRL_FREE; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables peripherals to trigger a DMA transfer. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the selected peripheral trigger to start a DMA +//! transfer on the specified channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the peripheral interrupt trigger enable bit. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_PERINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables peripherals from triggering a DMA transfer. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the selected peripheral trigger from starting a DMA +//! transfer on the specified channel. This also disables the use of the +//! software force using the DMA_forceTrigger() API. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Clear the peripheral interrupt trigger enable bit. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_PERINTE; + EDIS; +} + +//***************************************************************************** +// +//! Force a peripheral trigger to a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function sets the peripheral trigger flag and if triggering a DMA +//! burst is enabled (see DMA_enableTrigger()), a DMA burst transfer will be +//! forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_forceTrigger(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the peripheral interrupt trigger force bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTFRC; + EDIS; +} + +//***************************************************************************** +// +//! Clears a DMA channel's peripheral trigger flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function clears the peripheral trigger flag. Normally, you would use +//! this function when initializing the DMA for the first time. The flag is +//! cleared automatically when the DMA starts the first burst of a transfer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_clearTriggerFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Write a one to the clear bit to clear the peripheral trigger flag. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Transfer Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Transfer Status Flag is set, which +//! means a DMA transfer has begun. +//! This flag is cleared when TRANSFER_COUNT reaches zero, or when the +//! HARDRESET or SOFTRESET bit is set. +//! +//! \return Returns \b true if the Transfer Status Flag is set. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getTransferStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Transfer Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_TRANSFERSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Burst Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Burst Status Flag is set, which +//! means a DMA burst has begun. +//! This flag is cleared when BURST_COUNT reaches zero, or when the +//! HARDRESET or SOFTRESET bit is set. +//! +//! \return Returns \b true if the Burst Status Flag is set. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getBurstStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Burst Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_BURSTSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Run Status Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Run Status Flag is set, which +//! means the DMA channel is enabled. +//! This flag is cleared when a transfer completes (TRANSFER_COUNT = 0) and +//! continuous mode is disabled, or when the HARDRESET, SOFTRESET, or HALT bit +//! is set. +//! +//! \return Returns \b true if the channel is enabled. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getRunStatusFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Run Status Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_RUNSTS) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's Overflow Flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if the Overflow Flag is set, which +//! means peripheral event trigger was received while Peripheral Event Trigger +//! Flag was already set. +//! This flag can be cleared by writing to ERRCLR bit, using the function +//! DMA_clearErrorFlag(). +//! +//! \return Returns \b true if the channel is enabled. Returns \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +DMA_getOverflowFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the Overflow Flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_OVRFLG) != 0U); +} + +//***************************************************************************** +// +//! Gets the status of a DMA channel's peripheral trigger flag. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function returns \b true if a peripheral trigger event has occurred +//! The flag is automatically cleared when the first burst transfer begins, but +//! if needed, it can be cleared using DMA_clearTriggerFlag(). +//! +//! \return Returns \b true if a peripheral trigger event has occurred and its +//! flag is set. Returns \b false otherwise. +// +//***************************************************************************** +static inline bool +DMA_getTriggerFlagStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Read the peripheral trigger flag and return appropriately. + // + return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_PERINTFLG) != 0U); +} + +//***************************************************************************** +// +//! Starts a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function starts the DMA running, typically after you have configured +//! it. It will wait for the first trigger event to start operation. To halt +//! the channel use DMA_stopChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_startChannel(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the run bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_RUN; + EDIS; +} + +//***************************************************************************** +// +//! Halts a DMA channel. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function halts the DMA at its current state and any current read-write +//! access is completed. To start the channel again use DMA_startChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_stopChannel(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Set the halt bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_HALT; + EDIS; +} + +//***************************************************************************** +// +//! Enables a DMA channel interrupt source. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the indicated DMA channel interrupt source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Enable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables a DMA channel interrupt source. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the indicated DMA channel interrupt source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Disable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTE; + EDIS; +} + +//***************************************************************************** +// +//! Enables the DMA channel overrun interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function enables the indicated DMA channel's ability to generate an +//! interrupt upon the detection of an overrun. An overrun is when a peripheral +//! event trigger is received by the DMA before a previous trigger on that +//! channel had been serviced and its flag had been cleared. +//! +//! Note that this is the same interrupt signal as the interrupt that gets +//! generated at the beginning/end of a transfer. That interrupt must first be +//! enabled using DMA_enableInterrupt() in order for the overrun interrupt to +//! be generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_enableOverrunInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Enable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) |= DMA_MODE_OVRINTE; + EDIS; +} + +//***************************************************************************** +// +//! Disables the DMA channel overrun interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function disables the indicated DMA channel's ability to generate an +//! interrupt upon the detection of an overrun. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_disableOverrunInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Disable the specified DMA channel interrupt. + // + EALLOW; + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_OVRINTE; + EDIS; +} + +//***************************************************************************** +// +//! Clears the DMA channel error flags. +//! +//! \param base is the base address of the DMA channel control registers. +//! +//! This function clears both the DMA channel's sync error flag and its +//! overrun error flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_clearErrorFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + // + // Write to the error clear bit. + // + EALLOW; + HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_ERRCLR; + EDIS; +} + +//***************************************************************************** +// +//! Sets the interrupt generation mode of a DMA channel interrupt. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param mode is a flag to indicate the channel interrupt mode. +//! +//! This function sets the channel interrupt mode. When the \e mode parameter +//! is \b DMA_INT_AT_END, the DMA channel interrupt will be generated at the +//! end of the transfer. If \b DMA_INT_AT_BEGINNING, the interrupt will be +//! generated at the beginning of a new transfer. Generating at the beginning +//! of a new transfer is the default behavior. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setInterruptMode(uint32_t base, DMA_InterruptMode mode) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Write the selected interrupt generation mode to the register. + // + if(mode == DMA_INT_AT_END) + { + HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTMODE; + } + else + { + HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTMODE; + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the DMA channel priority mode. +//! +//! \param ch1IsHighPri is a flag to indicate the channel interrupt mode. +//! +//! This function sets the channel interrupt mode. When the \e ch1IsHighPri +//! parameter is \b false, the DMA channels are serviced in round-robin mode. +//! This is the default behavior. +//! +//! If \b true, channel 1 will be given higher priority than the other +//! channels. This means that if a channel 1 trigger occurs, the current word +//! transfer on any other channel is completed and channel 1 is serviced for +//! the complete burst count. The lower-priority channel's interrupted transfer +//! will then resume. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_setPriorityMode(bool ch1IsHighPri) +{ + EALLOW; + + // + // Write the selected priority mode to the register. + // + if(ch1IsHighPri) + { + HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) |= + DMA_PRIORITYCTRL1_CH1PRIORITY; + } + else + { + HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) &= + ~DMA_PRIORITYCTRL1_CH1PRIORITY; + } + + EDIS; +} + +//***************************************************************************** +// +//! Configures the source address for the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *srcAddr is a source address. +//! +//! This function configures the source address of a DMA +//! channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_configSourceAddress(uint32_t base, const void *srcAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up SOURCE address. + // + HWREG(base + DMA_O_SRC_BEG_ADDR_SHADOW) = (uint32_t)srcAddr; + HWREG(base + DMA_O_SRC_ADDR_SHADOW) = (uint32_t)srcAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the destination address for the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *destAddr is the destination address. +//! +//! This function configures the destinaton address of a DMA +//! channel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +DMA_configDestAddress(uint32_t base, const void *destAddr) +{ + // + // Check the arguments. + // + ASSERT(DMA_isBaseValid(base)); + + EALLOW; + + // + // Set up DESTINATION address. + // + HWREG(base + DMA_O_DST_BEG_ADDR_SHADOW) = (uint32_t)destAddr; + HWREG(base + DMA_O_DST_ADDR_SHADOW) = (uint32_t)destAddr; + + EDIS; +} + +//***************************************************************************** +// +//! Setup DMA to transfer data on the specified channel. +//! +//! \param base is Base address of the DMA channel control register +//! \param *transfParams configuration parameter +//! Refer struct #DMA_ConfigParams +//! +//! This function configures the DMA transfer on the specified channel. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams); + +//***************************************************************************** +// +//! Configures the DMA channel +//! +//! \param base is the base address of the DMA channel control registers. +//! \param *destAddr is the destination address. +//! \param *srcAddr is a source address. +//! +//! This function configures the source and destination addresses of a DMA +//! channel. The parameters are pointers to the data to be transferred. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configAddresses(uint32_t base, const void *destAddr, const void *srcAddr); + +//***************************************************************************** +// +//! Configures the DMA channel's burst settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param size is the number of words transferred per burst. +//! \param srcStep is the amount to increment or decrement the source address +//! after each word of a burst. +//! \param destStep is the amount to increment or decrement the destination +//! address after each word of a burst. +//! +//! This function configures the size of each burst and the address step size. +//! +//! The \e size parameter is the number of words that will be transferred +//! during a single burst. Possible amounts range from 1 word to 32 words. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses after each +//! transferred word of a burst. Only signed values from -4096 to 4095 are +//! valid. +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep, + int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel's transfer settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param transferSize is the number of bursts per transfer. +//! \param srcStep is the amount to increment or decrement the source address +//! after each burst of a transfer unless a wrap occurs. +//! \param destStep is the amount to increment or decrement the destination +//! address after each burst of a transfer unless a wrap occurs. +//! +//! This function configures the transfer size and the address step that is +//! made after each burst. +//! +//! The \e transferSize parameter is the number of bursts per transfer. If DMA +//! channel interrupts are enabled, they will occur after this number of bursts +//! have completed. The maximum number of bursts is 65536. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses after each +//! transferred burst of a transfer. Only signed values from -4096 to 4095 are +//! valid. If a wrap occurs, these step values will be ignored. Wrapping is +//! configured with DMA_configWrap(). +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep, + int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel's wrap settings. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param srcWrapSize is the number of bursts to be transferred before a wrap +//! of the source address occurs. +//! \param srcStep is the amount to increment or decrement the source address +//! after each burst of a transfer unless a wrap occurs. +//! \param destWrapSize is the number of bursts to be transferred before a wrap +//! of the destination address occurs. +//! \param destStep is the amount to increment or decrement the destination +//! address after each burst of a transfer unless a wrap occurs. +//! +//! This function configures the DMA channel's wrap settings. +//! +//! The \e srcWrapSize and \e destWrapSize parameters are the number of bursts +//! that are to be transferred before their respective addresses are wrapped. +//! The maximum wrap size is 65536 bursts. +//! +//! The \e srcStep and \e destStep parameters specify the address step that +//! should be added to the source and destination addresses when the wrap +//! occurs. Only signed values from -4096 to 4095 are valid. +//! +//! \note Note that regardless of what data size (configured by +//! DMA_configMode()) is used, parameters are in terms of 16-bits words. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep, + uint32_t destWrapSize, int16_t destStep); + +//***************************************************************************** +// +//! Configures the DMA channel trigger and mode. +//! +//! \param base is the base address of the DMA channel control registers. +//! \param trigger is the interrupt source that triggers a DMA transfer. +//! \param config is a bit field of several configuration selections. +//! +//! This function configures the DMA channel's trigger and mode. +//! +//! The \e trigger parameter is the interrupt source that will trigger the +//! start of a DMA transfer. +//! +//! The \e config parameter is the logical OR of the following values: +//! - \b DMA_CFG_ONESHOT_DISABLE or \b DMA_CFG_ONESHOT_ENABLE. If enabled, +//! the subsequent burst transfers occur without additional event triggers +//! after the first event trigger. If disabled, only one burst transfer is +//! performed per event trigger. +//! - \b DMA_CFG_CONTINUOUS_DISABLE or \b DMA_CFG_CONTINUOUS_ENABLE. If enabled +//! the DMA reinitializes when the transfer count is zero and waits for the +//! next interrupt event trigger. If disabled, the DMA stops and clears the +//! run status bit. +//! - \b DMA_CFG_SIZE_16BIT or \b DMA_CFG_SIZE_32BIT. This setting selects +//! whether the databus width is 16 or 32 bits. +//! +//! \return None. +// +//***************************************************************************** +extern void +DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // DMA_H diff --git a/gpio_driverlib_cpu1/device/driverlib/driver_inclusive_terminology_mapping.h b/gpio_driverlib_cpu1/device/driverlib/driver_inclusive_terminology_mapping.h new file mode 100644 index 0000000..00e9ac6 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/driver_inclusive_terminology_mapping.h @@ -0,0 +1,109 @@ +#ifndef DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ +#define DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ + + +//***************************************************************************** +// CLB +//***************************************************************************** +#define CLB_LOCAL_IN_MUX_SPISIMO_SLAVE CLB_LOCAL_IN_MUX_SPIPICO_PERIPHERAL +#define CLB_LOCAL_IN_MUX_SPISIMO_MASTER CLB_LOCAL_IN_MUX_SPIPICO_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI1_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI1_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI1_SPISTE CLB_GLOBAL_IN_MUX_SPI1_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI2_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI2_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI2_SPISTE CLB_GLOBAL_IN_MUX_SPI2_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI3_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI3_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI3_SPISTE CLB_GLOBAL_IN_MUX_SPI3_SPIPTE +#define CLB_GLOBAL_IN_MUX_SPI4_SPISOMI_MASTER CLB_GLOBAL_IN_MUX_SPI4_SPIPOCI_CONTROLLER +#define CLB_GLOBAL_IN_MUX_SPI4_SPISTE CLB_GLOBAL_IN_MUX_SPI4_SPIPTE + + + +//***************************************************************************** +// SPI +//***************************************************************************** +#define SPI_MODE_SLAVE SPI_MODE_PERIPHERAL +#define SPI_MODE_MASTER SPI_MODE_CONTROLLER +#define SPI_MODE_SLAVE_OD SPI_MODE_PERIPHERAL_OD +#define SPI_MODE_MASTER_OD SPI_MODE_CONTROLLER_OD + +#define SPI_STE_ACTIVE_LOW SPI_PTE_ACTIVE_LOW +#define SPI_STE_ACTIVE_HIGH SPI_PTE_ACTIVE_HIGH + +#define SPI_setSTESignalPolarity SPI_setPTESignalPolarity + + +//***************************************************************************** +// Interrupt +//***************************************************************************** +#define Interrupt_enableMaster Interrupt_enableGlobal +#define Interrupt_disableMaster Interrupt_disableGlobal + + +//***************************************************************************** +// SysCtrl +//***************************************************************************** +#define SysCtl_AccessMaster SysCtl_AccessController +#define SYSCTL_SEC_MASTER_CLA SYSCTL_SEC_CONTROLLER_CLA +#define SYSCTL_SEC_MASTER_DMA SYSCTL_SEC_CONTROLLER_DMA +#define SysCtl_selectSecMaster SysCtl_selectSecController + + +//***************************************************************************** +// GPIO +//***************************************************************************** +#define GPIO_setMasterCore GPIO_setControllerCore + + + +//***************************************************************************** +// Memcfg +//***************************************************************************** +#define MemCfg_LSRAMMMasterSel MemCfg_LSRAMMControllerSel +#define MEMCFG_LSRAMMASTER_CPU_ONLY MEMCFG_LSRAMCONTROLLER_CPU_ONLY +#define MEMCFG_LSRAMMASTER_CPU_CLA1 MEMCFG_LSRAMCONTROLLER_CPU_CLA1 +#define MemCfg_setLSRAMMasterSel MemCfg_setLSRAMControllerSel + +#define MemCfg_GSRAMMasterSel MemCfg_GSRAMControllerSel +#define MEMCFG_GSRAMMASTER_CPU1 MEMCFG_GSRAMCONTROLLER_CPU1 +#define MEMCFG_GSRAMMASTER_CPU2 MEMCFG_GSRAMCONTROLLER_CPU2 +#define MemCfg_setGSRAMMasterSel MemCfg_setGSRAMControllerSel + +//***************************************************************************** +// EMIF +//***************************************************************************** +#define EMIF_MasterSelect EMIF_ControllerSelect +#define EMIF_selectMaster EMIF_selectController +#define EMIF_MASTER_CPU1_NG EMIF_CONTROLLER_CPU1_NG +#define EMIF_MASTER_CPU1_G EMIF_CONTROLLER_CPU1_G +#define EMIF_MASTER_CPU2_G EMIF_CONTROLLER_CPU2_G +#define EMIF_MASTER_CPU1_NG2 EMIF_CONTROLLER_CPU1_NG2 + + +//***************************************************************************** +// I2C +//***************************************************************************** +#define I2C_MASTER_SEND_MODE I2C_CONTROLLER_SEND_MODE +#define I2C_MASTER_RECEIVE_MODE I2C_CONTROLLER_RECEIVE_MODE +#define I2C_SLAVE_SEND_MODE I2C_TARGET_SEND_MODE +#define I2C_SLAVE_RECEIVE_MODE I2C_TARGET_RECEIVE_MODE +#define I2C_INT_ADDR_SLAVE I2C_INT_ADDR_TARGET +#define I2C_STS_ADDR_SLAVE I2C_STS_ADDR_TARGET +#define I2C_STS_SLAVE_DIR I2C_STS_TARGET_DIR +#define I2C_INTSRC_ADDR_SLAVE I2C_INTSRC_ADDR_TARGET + +#define I2C_initMaster I2C_initController +#define I2C_setSlaveAddress I2C_setTargetAddress +#define I2C_setOwnSlaveAddress I2C_setOwnAddress + + +//***************************************************************************** +// SDFM +//***************************************************************************** +#define SDFM_enableMasterInterrupt SDFM_enableMainInterrupt +#define SDFM_disableMasterInterrupt SDFM_disableMainInterrupt +#define SDFM_enableMasterFilter SDFM_enableMainFilter +#define SDFM_disableMasterFilter SDFM_disableMainFilter + +#define SDFM_MASTER_INTERRUPT_FLAG SDFM_MAIN_INTERRUPT_FLAG + +#endif /* DRIVER_INCLUSIVE_TERMINOLOGY_MAPPING_H_ */ diff --git a/gpio_driverlib_cpu1/device/driverlib/ecap.c b/gpio_driverlib_cpu1/device/driverlib/ecap.c new file mode 100644 index 0000000..4a48441 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/ecap.c @@ -0,0 +1,61 @@ +//########################################################################### +// +// FILE: ecap.c +// +// TITLE: C28x ECAP driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "ecap.h" + +//***************************************************************************** +// +// ECAP_setEmulationMode +// +//***************************************************************************** +void ECAP_setEmulationMode(uint32_t base, ECAP_EmulationMode mode) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to FREE/SOFT bit + // + HWREGH(base + ECAP_O_ECCTL1) = + ((HWREGH(base + ECAP_O_ECCTL1) & (~ECAP_ECCTL1_FREE_SOFT_M)) | + ((uint16_t)mode << ECAP_ECCTL1_FREE_SOFT_S)); +} diff --git a/gpio_driverlib_cpu1/device/driverlib/ecap.h b/gpio_driverlib_cpu1/device/driverlib/ecap.h new file mode 100644 index 0000000..577d7a8 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/ecap.h @@ -0,0 +1,1164 @@ +//########################################################################### +// +// FILE: ecap.h +// +// TITLE: C28x ECAP driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef ECAP_H +#define ECAP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup ecap_api eCAP +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// Includes +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ecap.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// eCAP minimum and maximum values +// +//***************************************************************************** +#define ECAP_MAX_PRESCALER_VALUE 32U // Maximum Pre-scaler value + +//***************************************************************************** +// +// Values that can be passed to ECAP_enableInterrupt(), +// ECAP_disableInterrupt(), ECAP_clearInterrupt() and ECAP_forceInterrupt() as +// the intFlags parameter and returned by ECAP_getInterruptSource(). +// +//***************************************************************************** +//! Event 1 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_1 0x2U +//! Event 2 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_2 0x4U +//! Event 3 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_3 0x8U +//! Event 4 ISR source +//! +#define ECAP_ISR_SOURCE_CAPTURE_EVENT_4 0x10U +//! Counter overflow ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_OVERFLOW 0x20U +//! Counter equals period ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_PERIOD 0x40U +//! Counter equals compare ISR source +//! +#define ECAP_ISR_SOURCE_COUNTER_COMPARE 0x80U + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEmulationMode() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! TSCTR is stopped on emulation suspension + ECAP_EMULATION_STOP = 0x0U, + //! TSCTR runs until 0 before stopping on emulation suspension + ECAP_EMULATION_RUN_TO_ZERO = 0x1U, + //! TSCTR is not affected by emulation suspension + ECAP_EMULATION_FREE_RUN = 0x2U +}ECAP_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setCaptureMode() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! eCAP operates in continuous capture mode + ECAP_CONTINUOUS_CAPTURE_MODE = 0U, + //! eCAP operates in one shot capture mode + ECAP_ONE_SHOT_CAPTURE_MODE = 1U +}ECAP_CaptureMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEventPolarity(),ECAP_setCaptureMode(), +//! ECAP_enableCounterResetOnEvent(),ECAP_disableCounterResetOnEvent(), +//! ECAP_getEventTimeStamp(),ECAP_setDMASource() as the \e event parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_EVENT_1 = 0U, //!< eCAP event 1 + ECAP_EVENT_2 = 1U, //!< eCAP event 2 + ECAP_EVENT_3 = 2U, //!< eCAP event 3 + ECAP_EVENT_4 = 3U //!< eCAP event 4 +}ECAP_Events; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setSyncOutMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! sync out on the sync in signal and software force + ECAP_SYNC_OUT_SYNCI = 0x00U, + //! sync out on counter equals period + ECAP_SYNC_OUT_COUNTER_PRD = 0x40U, + //! Disable sync out signal + ECAP_SYNC_OUT_DISABLED = 0x80U +}ECAP_SyncOutMode; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setAPWMPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_APWM_ACTIVE_HIGH = 0x000, //!< APWM is active high + ECAP_APWM_ACTIVE_LOW = 0x400 //!< APWM is active low +}ECAP_APWMPolarity; + +//***************************************************************************** +// +//! Values that can be passed to ECAP_setEventPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + ECAP_EVNT_RISING_EDGE = 0U, //!< Rising edge polarity + ECAP_EVNT_FALLING_EDGE = 1U //!< Falling edge polarity +}ECAP_EventPolarity; + +//***************************************************************************** +// +//! \internal +//! Checks eCAP base address. +//! +//! \param base specifies the eCAP module base address. +//! +//! This function determines if an eCAP module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool ECAP_isBaseValid(uint32_t base) +{ + return( + (base == ECAP1_BASE) || + (base == ECAP2_BASE) || + (base == ECAP3_BASE) || + (base == ECAP4_BASE) || + (base == ECAP5_BASE) || + (base == ECAP6_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Sets the input prescaler. +//! +//! \param base is the base address of the ECAP module. +//! \param preScalerValue is the pre scaler value for ECAP input +//! +//! This function divides the ECAP input scaler. The pre scale value is +//! doubled inside the module. For example a preScalerValue of 5 will divide +//! the scaler by 10. Use a value of 1 to divide the pre scaler by 1. +//! The \e preScalerValue should be less than \b ECAP_MAX_PRESCALER_VALUE. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setEventPrescaler(uint32_t base, + uint16_t preScalerValue) +{ + ASSERT(ECAP_isBaseValid(base)); + + ASSERT(preScalerValue < ECAP_MAX_PRESCALER_VALUE); + + + // + // Write to PRESCALE bit + // + HWREGH(base + ECAP_O_ECCTL1) = + ((HWREGH(base + ECAP_O_ECCTL1) & (~ECAP_ECCTL1_PRESCALE_M)) | + (preScalerValue << ECAP_ECCTL1_PRESCALE_S)); +} + +//***************************************************************************** +// +//! Sets the Capture event polarity. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number. +//! \param polarity is the polarity of the event. +//! +//! This function sets the polarity of a given event. The value of event +//! is between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 inclusive corresponding to +//! the four available events.For each event the polarity value determines the +//! edge on which the capture is activated. For a rising edge use a polarity +//! value of \b ECAP_EVNT_RISING_EDGE and for a falling edge use a polarity of +//! \b ECAP_EVNT_FALLING_EDGE. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setEventPolarity(uint32_t base, + ECAP_Events event, + ECAP_EventPolarity polarity) +{ + + uint16_t shift; + + ASSERT(ECAP_isBaseValid(base)); + + shift = ((uint16_t)event) << 1U; + + + // + // Write to CAP1POL, CAP2POL, CAP3POL or CAP4POL + // + HWREGH(base + ECAP_O_ECCTL1) = + (HWREGH(base + ECAP_O_ECCTL1) & ~(1U << shift)) | + ((uint16_t)polarity << shift); +} + +//***************************************************************************** +// +//! Sets the capture mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the capture mode. +//! \param event is the event number at which the counter stops or wraps. +//! +//! This function sets the eCAP module to a continuous or one-shot mode. +//! The value of mode should be either \b ECAP_CONTINUOUS_CAPTURE_MODE or +//! \b ECAP_ONE_SHOT_CAPTURE_MODE corresponding to continuous or one-shot mode +//! respectively. +//! +//! The value of event determines the event number at which the counter stops +//! (in one-shot mode) or the counter wraps (in continuous mode). The value of +//! event should be between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 corresponding +//! to the valid event numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setCaptureMode(uint32_t base, + ECAP_CaptureMode mode, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to CONT/ONESHT + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_CONT_ONESHT)) | + (uint16_t)mode); + + // + // Write to STOP_WRAP + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_STOP_WRAP_M)) | + (((uint16_t)event) << ECAP_ECCTL2_STOP_WRAP_S )); +} + +//***************************************************************************** +// +//! Re-arms the eCAP module. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function re-arms the eCAP module. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_reArm(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to RE-ARM bit + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_REARM; +} + +//***************************************************************************** +// +//! Enables interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source to be enabled. +//! +//! This function sets and enables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + + // + // Set bits in ECEINT register + // + HWREGH(base + ECAP_O_ECEINT) |= intFlags; +} + +//***************************************************************************** +// +//! Disables interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source to be disabled. +//! +//! This function clears and disables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableInterrupt(uint32_t base, + uint16_t intFlags) +{ + + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + // + // Clear bits in ECEINT register + // + HWREGH(base + ECAP_O_ECEINT) &= ~intFlags; +} + +//***************************************************************************** +// +//! Returns the interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the eCAP interrupt flag. The following are valid +//! interrupt sources corresponding to the eCAP interrupt flag. +//! +//! \return Returns the eCAP interrupt that has occurred. The following are +//! valid return values. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \note - User can check if a combination of various interrupts have occurred +//! by ORing the above return values. +// +//***************************************************************************** +static inline uint16_t ECAP_getInterruptSource(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Return contents of ECFLG register + // + return(HWREGH(base + ECAP_O_ECFLG) & 0xFEU); +} + +//***************************************************************************** +// +//! Returns the Global interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the eCAP Global interrupt flag. +//! +//! \return Returns true if there is a global eCAP interrupt, false otherwise. +// +//***************************************************************************** +static inline bool ECAP_getGlobalInterruptStatus(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Return contents of Global interrupt bit + // + return((HWREGH(base + ECAP_O_ECFLG) & 0x1U) == 0x1U); +} + +//***************************************************************************** +// +//! Clears interrupt flag. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source. +//! +//! This function clears eCAP interrupt flags. The following are valid +//! interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_clearInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + // + // Write to ECCLR register + // + HWREGH(base + ECAP_O_ECCLR) = intFlags; +} + +//***************************************************************************** +// +//! Clears global interrupt flag +//! +//! \param base is the base address of the ECAP module. +//! +//! This function clears the global interrupt bit. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_clearGlobalInterrupt(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to INT bit + // + HWREGH(base + ECAP_O_ECCLR) = ECAP_ECCLR_INT; +} + +//***************************************************************************** +// +//! Forces interrupt source. +//! +//! \param base is the base address of the ECAP module. +//! \param intFlags is the interrupt source. +//! +//! This function forces and enables eCAP interrupt source. The following are +//! valid interrupt sources. +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt +//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt +//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates +//! interrupt +//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates +//! interrupt +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_forceInterrupt(uint32_t base, + uint16_t intFlags) +{ + ASSERT(ECAP_isBaseValid(base)); + ASSERT((intFlags & ~(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_2 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_3 | + ECAP_ISR_SOURCE_CAPTURE_EVENT_4 | + ECAP_ISR_SOURCE_COUNTER_OVERFLOW | + ECAP_ISR_SOURCE_COUNTER_PERIOD | + ECAP_ISR_SOURCE_COUNTER_COMPARE)) == 0U); + + + // + // Write to ECFRC register + // + HWREGH(base + ECAP_O_ECFRC) = intFlags; +} + +//***************************************************************************** +// +//! Sets eCAP in Capture mode. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function sets the eCAP module to operate in Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableCaptureMode(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CAP/APWM bit + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM; +} + +//***************************************************************************** +// +//! Sets eCAP in APWM mode. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function sets the eCAP module to operate in APWM mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableAPWMMode(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CAP/APWM bit + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_CAP_APWM; +} + +//***************************************************************************** +// +//! Enables counter reset on an event. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number the time base gets reset. +//! +//! This function enables the base timer, TSCTR, to be reset on capture +//! event provided by the variable event. Valid inputs for event are +//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableCounterResetOnEvent(uint32_t base, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits + // + HWREGH(base + ECAP_O_ECCTL1) |= 1U << ((2U * (uint16_t)event) + 1U); +} + +//***************************************************************************** +// +//! Disables counter reset on events. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number the time base gets reset. +//! +//! This function disables the base timer, TSCTR, from being reset on capture +//! event provided by the variable event. Valid inputs for event are +//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableCounterResetOnEvent(uint32_t base, + ECAP_Events event) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits + // + HWREGH(base + ECAP_O_ECCTL1) &= ~(1U << ((2U * (uint16_t)event) + 1U)); +} + +//***************************************************************************** +// +//! Enables time stamp capture. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function enables time stamp count to be captured +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableTimeStampCapture(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set CAPLDEN bit + // + HWREGH(base + ECAP_O_ECCTL1) |= ECAP_ECCTL1_CAPLDEN; +} + +//***************************************************************************** +// +//! Disables time stamp capture. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function disables time stamp count to be captured +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableTimeStampCapture(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear CAPLDEN bit + // + HWREGH(base + ECAP_O_ECCTL1) &= ~ECAP_ECCTL1_CAPLDEN; +} + +//***************************************************************************** +// +//! Sets a phase shift value count. +//! +//! \param base is the base address of the ECAP module. +//! \param shiftCount is the phase shift value. +//! +//! This function writes a phase shift value to be loaded into the main time +//! stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setPhaseShiftCount(uint32_t base, uint32_t shiftCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CTRPHS + // + HWREG(base + ECAP_O_CTRPHS) = shiftCount; +} + +//***************************************************************************** +// +//! Enable counter loading with phase shift value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function enables loading of the counter with the value present in the +//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_enableLoadCounter(uint32_t base) +{ + + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCI_EN + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_SYNCI_EN; +} + +//***************************************************************************** +// +//! Disable counter loading with phase shift value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function disables loading of the counter with the value present in the +//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_disableLoadCounter(uint32_t base) +{ + + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCI_EN + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_SYNCI_EN; +} + +//***************************************************************************** +// +//! Load time stamp counter +//! +//! \param base is the base address of the ECAP module. +//! +//! This function forces the value in the phase shift counter register to be +//! loaded into Time stamp counter register. +//! Make sure to enable loading of Time stamp counter by calling +//! ECAP_enableLoadCounter() function before calling this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_loadCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SWSYNC + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_SWSYNC; +} + +//***************************************************************************** +// +//! Configures Sync out signal mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the sync out mode. +//! +//! This function sets the sync out mode. Valid parameters for mode are: +//! - ECAP_SYNC_OUT_SYNCI - Trigger sync out on sync-in event. +//! - ECAP_SYNC_OUT_COUNTER_PRD - Trigger sync out when counter equals period. +//! - ECAP_SYNC_OUT_DISABLED - Disable sync out. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setSyncOutMode(uint32_t base, + ECAP_SyncOutMode mode) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Write to SYNCO_SEL + // + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & (~ECAP_ECCTL2_SYNCO_SEL_M)) | + (uint16_t)mode); +} + +//***************************************************************************** +// +//! Stops Time stamp counter. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function stops the time stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_stopCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Clear TSCTR + // + HWREGH(base + ECAP_O_ECCTL2) &= ~ECAP_ECCTL2_TSCTRSTOP; +} + +//***************************************************************************** +// +//! Starts Time stamp counter. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function starts the time stamp counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_startCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + + // + // Set TSCTR + // + HWREGH(base + ECAP_O_ECCTL2) |= ECAP_ECCTL2_TSCTRSTOP; +} + +//***************************************************************************** +// +//! Set eCAP APWM polarity. +//! +//! \param base is the base address of the ECAP module. +//! \param polarity is the polarity of APWM +//! +//! This function sets the polarity of the eCAP in APWM mode. Valid inputs for +//! polarity are: +//! - ECAP_APWM_ACTIVE_HIGH - For active high. +//! - ECAP_APWM_ACTIVE_LOW - For active low. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMPolarity(uint32_t base, + ECAP_APWMPolarity polarity) +{ + ASSERT(ECAP_isBaseValid(base)); + + HWREGH(base + ECAP_O_ECCTL2) = + ((HWREGH(base + ECAP_O_ECCTL2) & ~ECAP_ECCTL2_APWMPOL) | + (uint16_t)polarity); +} + +//***************************************************************************** +// +//! Set eCAP APWM period. +//! +//! \param base is the base address of the ECAP module. +//! \param periodCount is the period count for APWM. +//! +//! This function sets the period count of the APWM waveform. +//! periodCount takes the actual count which is written to the register. The +//! user is responsible for converting the desired frequency or time into +//! the period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMPeriod(uint32_t base, uint32_t periodCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP1 + // + HWREG(base + ECAP_O_CAP1) = periodCount; +} + +//***************************************************************************** +// +//! Set eCAP APWM on or off time count. +//! +//! \param base is the base address of the ECAP module. +//! \param compareCount is the on or off count for APWM. +//! +//! This function sets the on or off time count of the APWM waveform depending +//! on the polarity of the output. If the output , as set by +//! ECAP_setAPWMPolarity(), is active high then compareCount determines the on +//! time. If the output is active low then compareCount determines the off +//! time. compareCount takes the actual count which is written to the register. +//! The user is responsible for converting the desired frequency or time into +//! the appropriate count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMCompare(uint32_t base, uint32_t compareCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP2 + // + HWREG(base + ECAP_O_CAP2) = compareCount; +} + +//***************************************************************************** +// +//! Load eCAP APWM shadow period. +//! +//! \param base is the base address of the ECAP module. +//! \param periodCount is the shadow period count for APWM. +//! +//! This function sets the shadow period count of the APWM waveform. +//! periodCount takes the actual count which is written to the register. The +//! user is responsible for converting the desired frequency or time into +//! the period count. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMShadowPeriod(uint32_t base, + uint32_t periodCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP3 + // + HWREG(base + ECAP_O_CAP3) = periodCount; +} + +//***************************************************************************** +// +//! Set eCAP APWM shadow on or off time count. +//! +//! \param base is the base address of the ECAP module. +//! \param compareCount is the on or off count for APWM. +//! +//! This function sets the shadow on or off time count of the APWM waveform +//! depending on the polarity of the output. If the output , as set by +//! ECAP_setAPWMPolarity() , is active high then compareCount determines the +//! on time. If the output is active low then compareCount determines the off +//! time. compareCount takes the actual count which is written to the register. +//! The user is responsible for converting the desired frequency or time into +//! the appropriate count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void ECAP_setAPWMShadowCompare(uint32_t base, + uint32_t compareCount) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Write to CAP4 + // + HWREG(base + ECAP_O_CAP4) = compareCount; +} + +//***************************************************************************** +// +//! Returns the time base counter value. +//! +//! \param base is the base address of the ECAP module. +//! +//! This function returns the time base counter value. +//! +//! \return Returns the time base counter value. +// +//***************************************************************************** +static inline uint32_t ECAP_getTimeBaseCounter(uint32_t base) +{ + ASSERT(ECAP_isBaseValid(base)); + + // + // Read the Time base counter value + // + return(HWREG(base + ECAP_O_TSCTR)); +} + +//***************************************************************************** +// +//! Returns event time stamp. +//! +//! \param base is the base address of the ECAP module. +//! \param event is the event number. +//! +//! This function returns the current time stamp count of the given event. +//! Valid values for event are \b ECAP_EVENT_1 to \b ECAP_EVENT_4. +//! +//! \return Event time stamp value or 0 if \e event is invalid. +// +//***************************************************************************** +static inline uint32_t ECAP_getEventTimeStamp(uint32_t base, ECAP_Events event) +{ + uint32_t count; + + ASSERT(ECAP_isBaseValid(base)); + + + switch(event) + { + case ECAP_EVENT_1: + + // + // Read CAP1 register + // + count = HWREG(base + ECAP_O_CAP1); + break; + + case ECAP_EVENT_2: + // + // Read CAP2 register + // + count = HWREG(base + ECAP_O_CAP2); + break; + + case ECAP_EVENT_3: + + // + // Read CAP3 register + // + count = HWREG(base + ECAP_O_CAP3); + break; + + case ECAP_EVENT_4: + + // + // Read CAP4 register + // + count = HWREG(base + ECAP_O_CAP4); + break; + + default: + + // + // Invalid event parameter + // + count = 0U; + break; + } + + return(count); +} + +//***************************************************************************** +// +//! Configures emulation mode. +//! +//! \param base is the base address of the ECAP module. +//! \param mode is the emulation mode. +//! +//! This function configures the eCAP counter, TSCTR, to the desired emulation +//! mode when emulation suspension occurs. Valid inputs for mode are: +//! - ECAP_EMULATION_STOP - Counter is stopped immediately. +//! - ECAP_EMULATION_RUN_TO_ZERO - Counter runs till it reaches 0. +//! - ECAP_EMULATION_FREE_RUN - Counter is not affected. +//! +//! \return None. +// +//***************************************************************************** +extern void ECAP_setEmulationMode(uint32_t base, ECAP_EmulationMode mode); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // ECAP_H diff --git a/gpio_driverlib_cpu1/device/driverlib/emif.c b/gpio_driverlib_cpu1/device/driverlib/emif.c new file mode 100644 index 0000000..a862104 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/emif.c @@ -0,0 +1,46 @@ +//########################################################################### +// +// FILE: emif.c +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "emif.h" + diff --git a/gpio_driverlib_cpu1/device/driverlib/emif.h b/gpio_driverlib_cpu1/device/driverlib/emif.h new file mode 100644 index 0000000..7177421 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/emif.h @@ -0,0 +1,1369 @@ +//########################################################################### +// +// FILE: emif.h +// +// TITLE: C28x EMIF driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef EMIF_H +#define EMIF_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup emif_api EMIF +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_emif.h" +#include "inc/hw_memcfg.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Defines to specify access protection to EMIF_setAccessProtection(). +// +//***************************************************************************** +//! This flag is used to specify whether CPU fetches are allowed/blocked +//! for EMIF. +#define EMIF_ACCPROT0_FETCHPROT MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 + +//! This flag is used to specify whether CPU writes are allowed/blocked +//! for EMIF. +#define EMIF_ACCPROT0_CPUWRPROT MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 + +//! This flag is used to specify whether DMA writes are allowed/blocked +//! for EMIF. It is valid only for EMIF1 instance. +#define EMIF_ACCPROT0_DMAWRPROT MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1 + +//***************************************************************************** +// +// Define to mask out the bits in the EMIF1ACCPROT0 register that aren't +// associated with EMIF1 access protection. +// +//***************************************************************************** +#define EMIF_ACCPROT0_MASK_EMIF1 \ + ((uint16_t)MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 |\ + (uint16_t)MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 |\ + (uint16_t)MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1) + +//***************************************************************************** +// +// Define to mask out the bits in the EMIF2ACCPROT0 register that aren't +// associated with EMIF2 access protection. +// +//***************************************************************************** +#define EMIF_ACCPROT0_MASK_EMIF2 \ + ((uint16_t)MEMCFG_EMIF2ACCPROT0_FETCHPROT_EMIF2 |\ + (uint16_t)MEMCFG_EMIF2ACCPROT0_CPUWRPROT_EMIF2) + +//***************************************************************************** +// +// Define to mask out the bits in the ASYNC_CSx_CR register that +// aren't associated with async configuration. +// +//***************************************************************************** +#define EMIF_ASYNC_CS_CR_MASK ((uint32_t)EMIF_ASYNC_CS2_CR_R_HOLD_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_R_STROBE_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_R_SETUP_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_HOLD_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_STROBE_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_W_SETUP_M | \ + (uint32_t)EMIF_ASYNC_CS2_CR_TA_M) + +//***************************************************************************** +// +// Define to mask out the bits in the INT_MSK register that aren't associated +// with interrupts. +// +//***************************************************************************** +#define EMIF_ASYNC_INT_MASK ((uint16_t)EMIF_INT_MSK_SET_AT_MASK_SET | \ + (uint16_t)EMIF_INT_MSK_SET_LT_MASK_SET | \ + (uint16_t)EMIF_INT_MSK_SET_WR_MASK_SET_M) + +//***************************************************************************** +// +// Defines to specify interrupt sources to EMIF_enableAsyncInterrupt() and +// EMIF_disableAsyncInterrupt().Three interrupts are available for asynchronous +// memory interface: Masked Asyncronous Timeout(AT) to indicate EMxWAIT signal +// remains active even after maximum wait cycles are reached. Masked Line Trap +// (LT) to indicate illegal memory access or invalid cache line size. +// Masked Wait Rise(WR) to indicate rising edge on EMxWAIT is detected. +// +//***************************************************************************** +//! This flag is used to allow/block EMIF to generate Masked Asynchronous +//! Timeout interrupt. +#define EMIF_ASYNC_INT_AT EMIF_INT_MSK_SET_AT_MASK_SET + +//! This flag is used to allow/block EMIF to generate Masked Line Trap +//! interrupt. +#define EMIF_ASYNC_INT_LT EMIF_INT_MSK_SET_LT_MASK_SET + +//! This flag is used to allow/block EMIF to generate Masked Wait Rise +//! interrupt. +#define EMIF_ASYNC_INT_WR EMIF_INT_MSK_SET_WR_MASK_SET_M + +//***************************************************************************** +// +// Define for key for EMIF1MSEL register that enables the register write. +// +//***************************************************************************** +#define EMIF_MSEL_KEY 0x93A5CE70U + +//***************************************************************************** +// +// Define to mask out the bits in the SDRAM_CR register that aren't +// associated with SDRAM configuration parameters. +// +//***************************************************************************** +#define EMIF_SYNC_SDRAM_CR_MASK ((uint32_t)EMIF_SDRAM_CR_PAGESIGE_M | \ + (uint32_t)EMIF_SDRAM_CR_IBANK_M | \ + (uint32_t)EMIF_SDRAM_CR_BIT_11_9_LOCK | \ + (uint32_t)EMIF_SDRAM_CR_CL_M | \ + (uint32_t)EMIF_SDRAM_CR_NM | \ + (uint32_t)EMIF_SDRAM_CR_SR) + +//***************************************************************************** +// +// Define to mask out the bits in the SDRAM_TR register that aren't +// associated with SDRAM timings parameters. +// +//***************************************************************************** +#define EMIF_SYNC_SDRAM_TR_MASK ((uint32_t)EMIF_SDRAM_TR_T_RRD_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RC_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RAS_M | \ + (uint32_t)EMIF_SDRAM_TR_T_WR_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RCD_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RP_M | \ + (uint32_t)EMIF_SDRAM_TR_T_RFC_M) + +//***************************************************************************** +// +//! Values that can be passed to EMIF_setAsyncMode(), +//! EMIF_setAsyncTimingParams(), EMIF_setAsyncDataBusWidth(), +//! EMIF_enableAsyncExtendedWait() and EMIF_disableAsyncExtendedWait() +//! as the \e offset parameter. Three chip selects are available in +//! asynchronous memory interface so there are three configuration registers +//! available for each EMIF instance. All the three chip select offsets are +//! valid for EMIF1 while only EMIF_ASYNC_CS2_OFFSET is valid for EMIF2. +// +//***************************************************************************** +typedef enum +{ + EMIF_ASYNC_CS2_OFFSET = EMIF_O_ASYNC_CS2_CR, //! It is valid only for EMIF1 instance and not for EMIF2 instance. +//! Valid value for configBase parameter is EMIF1CONFIG_BASE. Valid +//! values for select parameter can be \e EMIF_CONTROLLER_CPU1_NG, +//! \e EMIF_CONTROLLER_CPU1_G, \e EMIF_CONTROLLER_CPU2_G or +//! \e EMIF_CONTROLLER_CPU1_NG2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_selectController(uint32_t configBase, EMIF_ControllerSelect select) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase)); + + // + // Sets the bits that enables EMIF1 controller selection. + // + EALLOW; + HWREG(configBase + MEMCFG_O_EMIF1MSEL) = (EMIF_MSEL_KEY | (uint32_t)select); + EDIS; +} + +//***************************************************************************** +// +//! Sets the access protection. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! \param access is the required access protection configuration. +//! +//! This function sets the access protection for an EMIF instance from CPU +//! and DMA. The \e access parameter can be any of \b EMIF_ACCPROT0_FETCHPROT, +//! \b EMIF_ACCPROT0_CPUWRPROT \b EMIF_ACCPROT0_DMAWRPROT values or their +//! combination. EMIF_ACCPROT0_DMAWRPROT value is valid as access parameter +//! for EMIF1 instance only . +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAccessProtection(uint32_t configBase, uint16_t access) +{ + uint16_t temp; + // + // Check the arguments. + // + + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + if(configBase == EMIF1CONFIG_BASE) + { + ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF1); + temp = EMIF_ACCPROT0_MASK_EMIF1; + } + else + { + ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF2); + temp = EMIF_ACCPROT0_MASK_EMIF2; + } + + // + // Sets the bits that enables access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) = + (HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) & ~(temp)) | access; + EDIS; +} + +//***************************************************************************** +// +//! Commits the lock configuration. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function commits the access protection for an EMIF instance from +//! CPU & DMA. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_commitAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that commits access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1COMMIT) |= + MEMCFG_EMIF1COMMIT_COMMIT_EMIF1; + EDIS; +} + +//***************************************************************************** +// +//! Locks the write to access configuration fields. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function locks the write to access configuration fields i.e +//! ACCPROT0 & Mselect fields, for an EMIF instance. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_lockAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that locks access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1LOCK) |= MEMCFG_EMIF1LOCK_LOCK_EMIF1; + EDIS; +} + +//***************************************************************************** +// +//! Unlocks the write to access configuration fields. +//! +//! \param configBase is the configuration address of the EMIF instance used. +//! +//! This function unlocks the write to access configuration fields such as +//! ACCPROT0 & Mselect fields, for an EMIF instance. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_unlockAccessConfig(uint32_t configBase) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) || + EMIF_isEMIF2ConfigBaseValid(configBase)); + + // + // Sets the bits that unlocks access protection config. + // + EALLOW; + HWREGH(configBase + MEMCFG_O_EMIF1LOCK) &= + ~((uint16_t)MEMCFG_EMIF1LOCK_LOCK_EMIF1); + EDIS; +} + +//***************************************************************************** +// +// Prototypes for Asynchronous Memory Interface +// +//***************************************************************************** +//***************************************************************************** +// +//! Selects the asynchronous mode of operation. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param mode is the desired mode of operation for external memory. +//! +//! +//! This function sets the mode of operation for asynchronous memory +//! between Normal or Strobe mode. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! Valid values for param \e mode can be \e EMIF_ASYNC_STROBE_MODE or +//! \e EMIF_ASYNC_NORMAL_MODE. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncMode(uint32_t base, EMIF_AsyncCSOffset offset, + EMIF_AsyncMode mode) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async mode of operation. + // + HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset) + & ~((uint32_t)EMIF_ASYNC_CS2_CR_SS)) + | (uint32_t)mode; +} + +//***************************************************************************** +// +//! Enables the Extended Wait Mode. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of the +//! EMIF instance +//! +//! This function enables the extended wait mode for an asynchronous +//! external memory.Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the bit that enables extended wait mode. + // + HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) | + EMIF_ASYNC_CS2_CR_EW; +} + +//***************************************************************************** +// +//! Disables the Extended Wait Mode. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! This function disables the extended wait mode for an asynchronous external +//! memory.Valid values for param \e offset can be \e EMIF_ASYNC_CS2_OFFSET, +//! \e EMIF_ASYNC_CS3_OFFSET & \e EMIF_ASYNC_C43_OFFSET for EMIF1 and +//! \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset) + { + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the bit that disables extended wait mode. + // + HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) & + ~((uint32_t)EMIF_ASYNC_CS2_CR_EW); +} + +//***************************************************************************** +// +//! Sets the wait polarity. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param polarity is desired wait polarity. +//! +//! This function sets the wait polarity for an asynchronous external memory. +//! Valid values for param \e polarity can be \e EMIF_ASYNC_WAIT_POLARITY_LOW +//! or \e EMIF_ASYNC_WAIT_POLARITY_HIGH. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncWaitPolarity(uint32_t base, EMIF_AsyncWaitPolarity polarity) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the polarity for async extended wait mode. + // + HWREG(base + EMIF_O_ASYNC_WCCR) = (HWREG(base + EMIF_O_ASYNC_WCCR) + & ~((uint32_t)EMIF_ASYNC_WCCR_WP0)) + | (uint32_t)polarity; +} + +//***************************************************************************** +// +//! Sets the Maximum Wait Cycles. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param value is the desired maximum wait cycles. +//! +//! This function sets the maximum wait cycles for extended asynchronous cycle. +//! Valid values for parameter \e value lies b/w 0x0U-0xFFU or 0-255. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncMaximumWaitCycles(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(value <= (EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M)); + + // + // Sets the bit that enables extended wait mode. + // + HWREGH(base + EMIF_O_ASYNC_WCCR) = (HWREGH(base + EMIF_O_ASYNC_WCCR) + & ~((uint16_t)EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M)) + | value; +} + +//***************************************************************************** +// +//! Sets the Asynchronous Memory Timing Characteristics. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param tParam is the desired timing parameters. +//! +//! This function sets timing characteristics for an external asynchronous +//! memory to be interfaced. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET and +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 & EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncTimingParams(uint32_t base, EMIF_AsyncCSOffset offset, + const EMIF_AsyncTimingParams *tParam) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async memory timing parameters. + // + temp = (tParam->turnArnd << EMIF_ASYNC_CS2_CR_TA_S) | + (tParam->rHold << EMIF_ASYNC_CS2_CR_R_HOLD_S) | + (tParam->rStrobe << EMIF_ASYNC_CS2_CR_R_STROBE_S) | + (tParam->rSetup << EMIF_ASYNC_CS2_CR_R_SETUP_S) | + (tParam->wHold << EMIF_ASYNC_CS2_CR_W_HOLD_S) | + (tParam->wStrobe << EMIF_ASYNC_CS2_CR_W_STROBE_S) | + (tParam->wSetup << EMIF_ASYNC_CS2_CR_W_SETUP_S); + + HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset) & + ~EMIF_ASYNC_CS_CR_MASK) | temp; +} + +//***************************************************************************** +// +//! Sets the Asynchronous Data Bus Width. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param offset is the offset of asynchronous chip select of EMIF instance. +//! +//! \param width is the data bus width of the memory. +//! +//! This function sets the data bus size for an external asynchronous memory +//! to be interfaced. Valid values for param \e offset can be +//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET & +//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2. +//! Valid values of param \e width can be \e EMIF_ASYNC_DATA_WIDTH_8, +//! \e EMIF_ASYNC_DATA_WIDTH_16 or \e EMIF_ASYNC_DATA_WIDTH_32. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setAsyncDataBusWidth(uint32_t base, EMIF_AsyncCSOffset offset, + EMIF_AsyncDataWidth width) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + if(base == EMIF2_BASE) + { + ASSERT(offset == EMIF_ASYNC_CS2_OFFSET); + } + + // + // Sets the async memory data bus width. + // + HWREGH(base + (uint32_t)offset) = (HWREGH(base + (uint32_t)offset) + & ~((uint16_t)EMIF_ASYNC_CS2_CR_ASIZE_M)) + | (uint32_t)width; +} + +//***************************************************************************** +// +// Prototypes for Interrupt Handling +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables the Asynchronous Memory Interrupts. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for desired interrupts. +//! +//! This function enables the desired interrupts for an external asynchronous +//! memory interface. Valid values for param \e intFlags can be +//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or their +//! combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableAsyncInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bits that enables async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK_SET) = intFlags; +} + +//***************************************************************************** +// +//! Disables the Asynchronous Memory Interrupts. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for interrupts to be disabled. +//! +//! This function disables the desired interrupts for an external asynchronous +//! memory interface. Valid values for param \e intFlags can be +//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or +//! their combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableAsyncInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bits that disables async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK_CLR) = intFlags; + +} + +//***************************************************************************** +// +//! Gets the interrupt status. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function gets the interrupt status for an EMIF instance. +//! +//! \return Returns the current interrupt status. +// +//***************************************************************************** +static inline uint16_t +EMIF_getAsyncInterruptStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets the async memory interrupt status. + // + return(HWREGH(base + EMIF_O_INT_MSK) & EMIF_ASYNC_INT_MASK); +} + +//***************************************************************************** +// +//! Clears the interrupt status for an EMIF instance. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param intFlags is the mask for the interrupt status to be cleared. +//! +//! This function clears the interrupt status for an EMIF instance. +//! The \e intFlags parameter can be any of \b EMIF_INT_MSK_SET_AT_MASK_SET, +//! \b EMIF_INT_MSK_SET_LT_MASK_SET, or \b EMIF_INT_MSK_SET_WR_MASK_SET_M +//! values or their combination. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_clearAsyncInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(intFlags <= EMIF_ASYNC_INT_MASK); + + // + // Sets the bit that clears desired async memory interrupts. + // + HWREGH(base + EMIF_O_INT_MSK) = intFlags; +} + +//***************************************************************************** +// +// Prototypes for Synchronous Memory Interface +// +//***************************************************************************** +//***************************************************************************** +// +//! Sets the Synchronous Memory Timing Parameters. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param tParam is parameters from memory datasheet in \e ns. +//! +//! This function sets the timing characteristics for an external +//! synchronous memory to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncTimingParams(uint32_t base, const EMIF_SyncTimingParams *tParam) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets sync memory timing parameters. + // + temp = ((tParam->tRrd << EMIF_SDRAM_TR_T_RRD_S) + & EMIF_SDRAM_TR_T_RRD_M) + | ((tParam->tRc << EMIF_SDRAM_TR_T_RC_S) + & EMIF_SDRAM_TR_T_RC_M) + | ((tParam->tRas << EMIF_SDRAM_TR_T_RAS_S) + & EMIF_SDRAM_TR_T_RAS_M) + | ((tParam->tWr << EMIF_SDRAM_TR_T_WR_S) + & EMIF_SDRAM_TR_T_WR_M) + | ((tParam->tRcd << EMIF_SDRAM_TR_T_RCD_S) + & EMIF_SDRAM_TR_T_RCD_M) + | ((tParam->tRp << EMIF_SDRAM_TR_T_RP_S) + & EMIF_SDRAM_TR_T_RP_M) + | ((tParam->tRfc << EMIF_SDRAM_TR_T_RFC_S) + & EMIF_SDRAM_TR_T_RFC_M); + + HWREG(base + EMIF_O_SDRAM_TR) = (HWREG(base + EMIF_O_SDRAM_TR) & + ~EMIF_SYNC_SDRAM_TR_MASK) | temp; +} + +//***************************************************************************** +// +//! Sets the SDRAM Self Refresh Exit Timing. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param tXs is the desired timing value. +//! +//! This function sets the self refresh exit timing for an external +//! synchronous memory to be interfaced. tXs values must lie between +//! 0x0U-0x1FU or 0-31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncSelfRefreshExitTmng(uint32_t base, uint16_t tXs) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(tXs <= EMIF_SDR_EXT_TMNG_T_XS_M); + + // + // Sets the self refresh exit timing for sync memory. + // + HWREGH(base + EMIF_O_SDR_EXT_TMNG) = (HWREGH(base + EMIF_O_SDR_EXT_TMNG) + & ~((uint16_t)EMIF_SDR_EXT_TMNG_T_XS_M)) + | tXs; +} + +//***************************************************************************** +// +//! Sets the SDR Refresh Rate. +//! +//! \param base is the base address of an EMIF instance. +//! +//! \param refRate is the refresh rate. +//! +//! This function sets the refresh rate for an external synchronous memory +//! to be interfaced. Valid values for refRate lies b/w 0x0U-0x1FFFU or +//! 0-8191. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncRefreshRate(uint32_t base, uint16_t refRate) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + ASSERT(refRate <= EMIF_SDRAM_RCR_REFRESH_RATE_M); + + // + // Sets the sync memory refresh rate. + // + HWREGH(base + EMIF_O_SDRAM_RCR) = (HWREGH(base + EMIF_O_SDRAM_RCR) + & (~(uint16_t)EMIF_SDRAM_RCR_REFRESH_RATE_M)) + | refRate; +} + +//***************************************************************************** +// +//! Sets the Synchronous Memory configuration parameters. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! \param config is the desired configuration parameters. +//! +//! This function sets configuration parameters like CL, NM, IBANK +//! and PAGESIZE for an external synchronous memory to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_setSyncMemoryConfig(uint32_t base, const EMIF_SyncConfig *config) +{ + uint32_t temp; + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the sync memory configuration bits. + // + temp = ((uint32_t)config->casLatency | (uint32_t)config->iBank | + (uint32_t)config->narrowMode | (uint32_t)config->pageSize); + + HWREG(base + EMIF_O_SDRAM_CR) = (HWREG(base + EMIF_O_SDRAM_CR) & + ~EMIF_SYNC_SDRAM_CR_MASK) | temp; +} + +//***************************************************************************** +// +// Prototypes for EMIF Low Power Modes +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables Self Refresh. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function enables Self Refresh Mode for EMIF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncSelfRefresh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables sync memory self refresh mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_SR; +} + +//***************************************************************************** +// +//! Disables Self Refresh. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Self Refresh Mode for EMIF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncSelfRefresh(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables sync memory self refresh mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_SR); +} + +//***************************************************************************** +// +//! Enables Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function Enables Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables sync memory power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PD; +} + +//***************************************************************************** +// +//! Disables Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables sync memory power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PD); +} + +//***************************************************************************** +// +//! Enables Refresh in Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function enables Refresh in Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_enableSyncRefreshInPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that enables refresh in power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PDWR; +} + +//***************************************************************************** +// +//! Disables Refresh in Power Down. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function disables Refresh in Power Down Mode for synchronous memory +//! to be interfaced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EMIF_disableSyncRefreshInPowerDown(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Sets the bits that disables refresh in power down mode. + // + HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PDWR); +} + +//***************************************************************************** +// +//! Gets total number of SDRAM accesses. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function returns total number of SDRAM accesses +//! from a controller(CPUx/CPUx.DMA). +//! +//! \return \e Returns total number of accesses to SDRAM. +// +//***************************************************************************** +static inline uint32_t +EMIF_getSyncTotalAccesses(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets total accesses to sync memory. + // + return(HWREG(base + EMIF_O_TOTAL_SDRAM_AR)); + +} + +//***************************************************************************** +// +//! Gets total number of SDRAM accesses which require activate command. +//! +//! \param base is the base address of the EMIF instance used. +//! +//! This function returns total number of accesses to SDRAM which +//! require activate command. +//! +//!\return \e Returns total number of accesses to SDRAM which require activate. +// +//***************************************************************************** +static inline uint32_t +EMIF_getSyncTotalActivateAccesses(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EMIF_isBaseValid(base)); + + // + // Gets total accesses to sync memory which requires activate command. + // + return(HWREG(base + EMIF_O_TOTAL_SDRAM_ACTR)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EMIF_H diff --git a/gpio_driverlib_cpu1/device/driverlib/epwm.c b/gpio_driverlib_cpu1/device/driverlib/epwm.c new file mode 100644 index 0000000..76e09bb --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/epwm.c @@ -0,0 +1,363 @@ +//########################################################################### +// +// FILE: epwm.c +// +// TITLE: C28x EPWM driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "epwm.h" + +//***************************************************************************** +// +// EPWM_setEmulationMode +// +//***************************************************************************** +void EPWM_setEmulationMode(uint32_t base, EPWM_EmulationMode emulationMode) +{ + // + // Check the arguments. + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to FREE_SOFT bits + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & (~EPWM_TBCTL_FREE_SOFT_M)) | + ((uint16_t)emulationMode << EPWM_TBCTL_FREE_SOFT_S)); +} + +//***************************************************************************** +// +// EPWM_configureSignal +// +//***************************************************************************** +void EPWM_configureSignal(uint32_t base, const EPWM_SignalParams *signalParams) +{ + float32_t tbClkInHz = 0.0F; + uint16_t tbPrdVal = 0U, cmpAVal = 0U, cmpBVal = 0U; + + // + // Check the arguments. + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Valid values in the function for TBCTR Mode are UP, DOWN + // and UP-DOWN count. + // + ASSERT((uint16_t)signalParams->tbCtrMode <= 2U); + + // + // Configure EPWM clock Divider + // + SysCtl_setEPWMClockDivider(signalParams->epwmClkDiv); + + // + // Configure Time Base counter Clock + // + EPWM_setClockPrescaler(base, signalParams->tbClkDiv, + signalParams->tbHSClkDiv); + + // + // Configure Time Base Counter Mode + // + EPWM_setTimeBaseCounterMode(base, signalParams->tbCtrMode); + + // + // Calculate TBCLK, TBPRD and CMPx values to be configured for + // achieving desired signal + // + tbClkInHz = ((float32_t)signalParams->sysClkInHz / + (float32_t)(1U << ((uint16_t)signalParams->epwmClkDiv + + (uint16_t)signalParams->tbClkDiv))); + + if(signalParams->tbHSClkDiv <= EPWM_HSCLOCK_DIVIDER_4) + { + tbClkInHz /= (float32_t)(1U << (uint16_t)signalParams->tbHSClkDiv); + } + else + { + tbClkInHz /= (float32_t)(2U * (uint16_t)signalParams->tbHSClkDiv); + } + + if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP) + { + tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f); + cmpAVal = (uint16_t)(signalParams->dutyValA * + (float32_t)(tbPrdVal + 1U)); + cmpBVal = (uint16_t)(signalParams->dutyValB * + (float32_t)(tbPrdVal + 1U)); + } + else if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_DOWN) + { + tbPrdVal = (uint16_t)((tbClkInHz / signalParams->freqInHz) - 1.0f); + cmpAVal = (uint16_t)((float32_t)(tbPrdVal + 1U) - + (signalParams->dutyValA * (float32_t)(tbPrdVal + 1U))); + cmpBVal = (uint16_t)((float32_t)(tbPrdVal + 1U) - + (signalParams->dutyValB * (float32_t)(tbPrdVal + 1U))); + } + else + { + tbPrdVal = (uint16_t)(tbClkInHz / (2.0f * signalParams->freqInHz)); + cmpAVal = (uint16_t)(((float32_t)tbPrdVal - + ((signalParams->dutyValA * + (float32_t)tbPrdVal))) + 0.5f); + cmpBVal = (uint16_t)(((float32_t)tbPrdVal - + ((signalParams->dutyValB * + (float32_t)tbPrdVal))) + 0.5f); + } + + // + // Configure TBPRD value + // + EPWM_setTimeBasePeriod(base, tbPrdVal); + + // + // Default Configurations. + // + EPWM_disablePhaseShiftLoad(base); + EPWM_setPhaseShift(base, 0U); + EPWM_setTimeBaseCounter(base, 0U); + + // + // Setup shadow register load on ZERO + // + EPWM_setCounterCompareShadowLoadMode(base, + EPWM_COUNTER_COMPARE_A, + EPWM_COMP_LOAD_ON_CNTR_ZERO); + EPWM_setCounterCompareShadowLoadMode(base, + EPWM_COUNTER_COMPARE_B, + EPWM_COMP_LOAD_ON_CNTR_ZERO); + // + // Set Compare values + // + EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, + cmpAVal); + EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B, + cmpBVal); + + // + // Set actions for ePWMxA & ePWMxB + // + if(signalParams->tbCtrMode == EPWM_COUNTER_MODE_UP) + { + // + // Set PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxA on event A, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Set PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + } + else + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Clear PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + + } + } + else if((signalParams->tbCtrMode == EPWM_COUNTER_MODE_DOWN)) + { + // + // Set PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxA on event A, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Set PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + else + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + // + // Clear PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + } + else + { + // + // Clear PWMxA on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Set PWMxA on event A, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); + + // + // Clear PWMxA on event A, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_A, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); + + if(signalParams->invertSignalB == true) + { + // + // Set PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Clear PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + // + // Set PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + else + { + // + // Clear PWMxB on Zero + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); + + // + // Set PWMxB on event B, up count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_HIGH, + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); + // + // Clear PWMxB on event B, down count + // + EPWM_setActionQualifierAction(base, + EPWM_AQ_OUTPUT_B, + EPWM_AQ_OUTPUT_LOW, + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); + } + } +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/epwm.h b/gpio_driverlib_cpu1/device/driverlib/epwm.h new file mode 100644 index 0000000..ada9b80 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/epwm.h @@ -0,0 +1,7496 @@ +//############################################################################# +// +// FILE: epwm.h +// +// TITLE: C28x EPWM Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef EPWM_H +#define EPWM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup epwm_api ePWM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_epwm.h" +#include "cpu.h" +#include "debug.h" +#include "sysctl.h" + + +// +// Time Base Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setEmulationMode() as the +//! \e emulationMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Stop after next Time Base counter increment or decrement + EPWM_EMULATION_STOP_AFTER_NEXT_TB = 0, + //! Stop when counter completes whole cycle + EPWM_EMULATION_STOP_AFTER_FULL_CYCLE = 1, + //! Free run + EPWM_EMULATION_FREE_RUN = 2 +} EPWM_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setCountModeAfterSync() as the +//! \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNT_MODE_DOWN_AFTER_SYNC = 0, //!< Count down after sync event + EPWM_COUNT_MODE_UP_AFTER_SYNC = 1 //!< Count up after sync event +} EPWM_SyncCountMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setClockPrescaler() as the +//! \e prescaler parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_CLOCK_DIVIDER_1 = 0, //!< Divide clock by 1 + EPWM_CLOCK_DIVIDER_2 = 1, //!< Divide clock by 2 + EPWM_CLOCK_DIVIDER_4 = 2, //!< Divide clock by 4 + EPWM_CLOCK_DIVIDER_8 = 3, //!< Divide clock by 8 + EPWM_CLOCK_DIVIDER_16 = 4, //!< Divide clock by 16 + EPWM_CLOCK_DIVIDER_32 = 5, //!< Divide clock by 32 + EPWM_CLOCK_DIVIDER_64 = 6, //!< Divide clock by 64 + EPWM_CLOCK_DIVIDER_128 = 7 //!< Divide clock by 128 +} EPWM_ClockDivider; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setClockPrescaler() as the +//! \e highSpeedPrescaler parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_HSCLOCK_DIVIDER_1 = 0, //!< Divide clock by 1 + EPWM_HSCLOCK_DIVIDER_2 = 1, //!< Divide clock by 2 + EPWM_HSCLOCK_DIVIDER_4 = 2, //!< Divide clock by 4 + EPWM_HSCLOCK_DIVIDER_6 = 3, //!< Divide clock by 6 + EPWM_HSCLOCK_DIVIDER_8 = 4, //!< Divide clock by 8 + EPWM_HSCLOCK_DIVIDER_10 = 5, //!< Divide clock by 10 + EPWM_HSCLOCK_DIVIDER_12 = 6, //!< Divide clock by 12 + EPWM_HSCLOCK_DIVIDER_14 = 7 //!< Divide clock by 14 +} EPWM_HSClockDivider; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setSyncOutPulseMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Sync pulse is generated by software + EPWM_SYNC_OUT_PULSE_ON_SOFTWARE = 0, + //! Sync pulse is passed from EPWMxSYNCIN + EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN = 0, + //! Sync pulse is generated when time base counter equals zero + EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO = 1, + //! Sync pulse is generated when time base counter equals compare B value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B = 2, + //! Sync pulse is disabled + EPWM_SYNC_OUT_PULSE_DISABLED = 4, + //! Sync pulse is generated when time base counter equals compare C value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C = 5, + //! Sync pulse is generated when time base counter equals compare D value + EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D = 6 +} EPWM_SyncOutPulseMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setPeriodLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! PWM Period register access is through shadow register + EPWM_PERIOD_SHADOW_LOAD = 0, + //! PWM Period register access is directly + EPWM_PERIOD_DIRECT_LOAD = 1 +} EPWM_PeriodLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTimeBaseCounterMode() as the +//! \e counterMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNTER_MODE_UP = 0, //!< Up - count mode + EPWM_COUNTER_MODE_DOWN = 1, //!< Down - count mode + EPWM_COUNTER_MODE_UP_DOWN = 2, //!< Up - down - count mode + EPWM_COUNTER_MODE_STOP_FREEZE = 3 //!< Stop - Freeze counter +} EPWM_TimeBaseCountMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectPeriodLoadEvent() as the +//! \e shadowLoadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Shadow to active load occurs when time base counter reaches 0 + EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO = 0, + //! Shadow to active load occurs when time base counter reaches 0 and a + //! SYNC occurs + EPWM_SHADOW_LOAD_MODE_COUNTER_SYNC = 1, + //! Shadow to active load occurs only when a SYNC occurs + EPWM_SHADOW_LOAD_MODE_SYNC = 2 +} EPWM_PeriodShadowLoadMode; + +//***************************************************************************** +// +// Values that can be returned by the EPWM_getTimeBaseCounterDirection() +// +//***************************************************************************** +//! Time base counter is counting up +//! +#define EPWM_TIME_BASE_STATUS_COUNT_UP 1U +//! Time base counter is counting down +//! +#define EPWM_TIME_BASE_STATUS_COUNT_DOWN 0U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setupEPWMLinks() as the \e epwmLink +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_LINK_WITH_EPWM_1 = 0, //!< link current ePWM with ePWM1 + EPWM_LINK_WITH_EPWM_2 = 1, //!< link current ePWM with ePWM2 + EPWM_LINK_WITH_EPWM_3 = 2, //!< link current ePWM with ePWM3 + EPWM_LINK_WITH_EPWM_4 = 3, //!< link current ePWM with ePWM4 + EPWM_LINK_WITH_EPWM_5 = 4, //!< link current ePWM with ePWM5 + EPWM_LINK_WITH_EPWM_6 = 5, //!< link current ePWM with ePWM6 + EPWM_LINK_WITH_EPWM_7 = 6, //!< link current ePWM with ePWM7 + EPWM_LINK_WITH_EPWM_8 = 7, //!< link current ePWM with ePWM8 + EPWM_LINK_WITH_EPWM_9 = 8, //!< link current ePWM with ePWM9 + EPWM_LINK_WITH_EPWM_10 = 9, //!< link current ePWM with ePWM10 + EPWM_LINK_WITH_EPWM_11 = 10, //!< link current ePWM with ePWM11 + EPWM_LINK_WITH_EPWM_12 = 11 //!< link current ePWM with ePWM12 +} EPWM_CurrentLink; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setupEPWMLinks() as the \e linkComp +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_LINK_TBPRD = 0U, //!< link TBPRD registers + EPWM_LINK_COMP_A = 4U, //!< link COMPA registers + EPWM_LINK_COMP_B = 8U, //!< link COMPB registers + EPWM_LINK_COMP_C = 12U, //!< link COMPC registers + EPWM_LINK_COMP_D = 16U, //!< link COMPD registers + EPWM_LINK_GLDCTL2 = 28U //!< link GLDCTL2 registers +} EPWM_LinkComponent; + +// +// Counter Compare Module +// +//***************************************************************************** +// +//! Values that can be passed to the EPWM_getCounterCompareShadowStatus(), +//! EPWM_setCounterCompareValue(), EPWM_setCounterCompareShadowLoadMode(), +//! EPWM_disableCounterCompareShadowLoadMode() +//! as the \e compModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_COUNTER_COMPARE_A = 0, //!< Counter compare A + EPWM_COUNTER_COMPARE_B = 2, //!< Counter compare B + EPWM_COUNTER_COMPARE_C = 5, //!< Counter compare C + EPWM_COUNTER_COMPARE_D = 7 //!< Counter compare D +} EPWM_CounterCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setCounterCompareShadowLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_COMP_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_COMP_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_COMP_LOAD_FREEZE = 3, + //! Load on sync or when counter equals zero + EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO = 4, + //! Load on sync or when counter equals period + EPWM_COMP_LOAD_ON_SYNC_CNTR_PERIOD = 5, + //! Load on sync or when counter equals zero or period + EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO_PERIOD = 6, + //! Load on sync only + EPWM_COMP_LOAD_ON_SYNC_ONLY = 8 +} EPWM_CounterCompareLoadMode; + +// +// Action Qualifier Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierShadowLoadMode() and +//! EPWM_disableActionQualifierShadowLoadMode() as the \e aqModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_ACTION_QUALIFIER_A = 0, //!< Action Qualifier A + EPWM_ACTION_QUALIFIER_B = 2 //!< Action Qualifier B +} EPWM_ActionQualifierModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierShadowLoadMode() as the +//! \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_AQ_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_AQ_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_AQ_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_AQ_LOAD_FREEZE = 3, + //! Load on sync or when counter equals zero + EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO = 4, + //! Load on sync or when counter equals period + EPWM_AQ_LOAD_ON_SYNC_CNTR_PERIOD = 5, + //! Load on sync or when counter equals zero or period + EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO_PERIOD = 6, + //! Load on sync only + EPWM_AQ_LOAD_ON_SYNC_ONLY = 8 +} EPWM_ActionQualifierLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierT1TriggerSource() and +//! EPWM_setActionQualifierT2TriggerSource() as the \e trigger parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 = 0, //!< Digital compare event A 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 = 1, //!< Digital compare event A 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 = 2, //!< Digital compare event B 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 = 3, //!< Digital compare event B 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 = 4, //!< Trip zone 1 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 = 5, //!< Trip zone 2 + EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 = 6, //!< Trip zone 3 + EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN = 7 //!< ePWM sync +} EPWM_ActionQualifierTriggerSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierAction() as the \e +//! event parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals zero + EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO = 0, + //! Time base counter equals period + EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD = 2, + //! Time base counter up equals COMPA + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA = 4, + //! Time base counter down equals COMPA + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA = 6, + //! Time base counter up equals COMPB + EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB = 8, + //! Time base counter down equals COMPB + EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB = 10, + //! T1 event on count up + EPWM_AQ_OUTPUT_ON_T1_COUNT_UP = 1, + //! T1 event on count down + EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN = 3, + //! T2 event on count up + EPWM_AQ_OUTPUT_ON_T2_COUNT_UP = 5, + //! T2 event on count down + EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN = 7 +} EPWM_ActionQualifierOutputEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierSWAction(), +//! EPWM_setActionQualifierAction() as the \e outPut parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_OUTPUT_NO_CHANGE = 0, //!< No change in the output pins + EPWM_AQ_OUTPUT_LOW = 1, //!< Set output pins to low + EPWM_AQ_OUTPUT_HIGH = 2, //!< Set output pins to High + EPWM_AQ_OUTPUT_TOGGLE = 3 //!< Toggle the output pins +} EPWM_ActionQualifierOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierContSWForceAction() +//! as the \e outPut parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_SW_DISABLED = 0, //!< Software forcing disabled + EPWM_AQ_SW_OUTPUT_LOW = 1, //!< Set output pins to low + EPWM_AQ_SW_OUTPUT_HIGH = 2 //!< Set output pins to High +} EPWM_ActionQualifierSWOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierActionComplete() +//! as the \e action parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals zero and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_ZERO = 0x0, + //! Time base counter equals zero and set output pins to low + EPWM_AQ_OUTPUT_LOW_ZERO = 0x1, + //! Time base counter equals zero and set output pins to high + EPWM_AQ_OUTPUT_HIGH_ZERO = 0x2, + //! Time base counter equals zero and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_ZERO = 0x3, + //! Time base counter equals period and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_PERIOD = 0x0, + //! Time base counter equals period and set output pins to low + EPWM_AQ_OUTPUT_LOW_PERIOD = 0x4, + //! Time base counter equals period and set output pins to high + EPWM_AQ_OUTPUT_HIGH_PERIOD = 0x8, + //! Time base counter equals period and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_PERIOD = 0xC, + //! Time base counter up equals COMPA and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPA = 0x00, + //! Time base counter up equals COMPA and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_CMPA = 0x10, + //! Time base counter up equals COMPA and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_CMPA = 0x20, + //! Time base counter up equals COMPA and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_CMPA = 0x30, + //! Time base counter down equals COMPA and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPA = 0x00, + //! Time base counter down equals COMPA and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_CMPA = 0x40, + //! Time base counter down equals COMPA and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA = 0x80, + //! Time base counter down equals COMPA and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPA = 0xC0, + //! Time base counter up equals COMPB and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPB = 0x000, + //! Time base counter up equals COMPB and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_CMPB = 0x100, + //! Time base counter up equals COMPB and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_CMPB = 0x200, + //! Time base counter up equals COMPB and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_CMPB = 0x300, + //! Time base counter down equals COMPB and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPB = 0x000, + //! Time base counter down equals COMPB and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_CMPB = 0x400, + //! Time base counter down equals COMPB and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_CMPB = 0x800, + //! Time base counter down equals COMPB and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPB = 0xC00 +} EPWM_ActionQualifierEventAction; + +//***************************************************************************** +// +//! Values that can be passed to +//! EPWM_setAdditionalActionQualifierActionComplete() as the \e action +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! T1 event on count up and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_T1 = 0x0, + //! T1 event on count up and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_T1 = 0x1, + //! T1 event on count up and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_T1 = 0x2, + //! T1 event on count up and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_T1 = 0x3, + //! T1 event on count down and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T1 = 0x0, + //! T1 event on count down and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_T1 = 0x4, + //! T1 event on count down and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_T1 = 0x8, + //! T1 event on count down and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_T1 = 0xC, + //! T2 event on count up and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_UP_T2 = 0x00, + //! T2 event on count up and set output pins to low + EPWM_AQ_OUTPUT_LOW_UP_T2 = 0x10, + //! T2 event on count up and set output pins to high + EPWM_AQ_OUTPUT_HIGH_UP_T2 = 0x20, + //! T2 event on count up and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_UP_T2 = 0x30, + //! T2 event on count down and no change in the output pins + EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T2 = 0x00, + //! T2 event on count down and set output pins to low + EPWM_AQ_OUTPUT_LOW_DOWN_T2 = 0x40, + //! T2 event on count down and set output pins to high + EPWM_AQ_OUTPUT_HIGH_DOWN_T2 = 0x80, + //! T2 event on count down and toggle the output pins + EPWM_AQ_OUTPUT_TOGGLE_DOWN_T2 = 0xC0 +} EPWM_AdditionalActionQualifierEventAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_forceActionQualifierSWAction(), +//! EPWM_setActionQualifierSWAction(), EPWM_setActionQualifierAction() +//! EPWM_setActionQualifierContSWForceAction() as the \e epwmOutput parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_AQ_OUTPUT_A = 0, //!< ePWMxA output + EPWM_AQ_OUTPUT_B = 2 //!< ePWMxB output +} EPWM_ActionQualifierOutputModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setActionQualifierContSWForceShadowMode() +//! as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Shadow mode load when counter equals zero + EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO = 0, + //! Shadow mode load when counter equals period + EPWM_AQ_SW_SH_LOAD_ON_CNTR_PERIOD = 1, + //! Shadow mode load when counter equals zero or period + EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! No shadow load mode. Immediate mode only. + EPWM_AQ_SW_IMMEDIATE_LOAD = 3 +} EPWM_ActionQualifierContForce; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandOutputSwapMode() +//! as the \e output parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_OUTPUT_A = 1, //!< DB output is ePWMA + EPWM_DB_OUTPUT_B = 0 //!< DB output is ePWMB +} EPWM_DeadBandOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandDelayPolarity(), +//! EPWM_setDeadBandDelayMode() as the \e delayMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_RED = 1, //!< DB RED (Rising Edge Delay) mode + EPWM_DB_FED = 0 //!< DB FED (Falling Edge Delay) mode +} EPWM_DeadBandDelayMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandDelayPolarity as the +//! \e polarity parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DB_POLARITY_ACTIVE_HIGH = 0, //!< DB polarity is not inverted + EPWM_DB_POLARITY_ACTIVE_LOW = 1 //!< DB polarity is inverted +} EPWM_DeadBandPolarity; + +//***************************************************************************** +// +// Values that can be passed to EPWM_setRisingEdgeDeadBandDelayInput(), +// EPWM_setFallingEdgeDeadBandDelayInput() as the input parameter. +// +//***************************************************************************** +//! Input signal is ePWMA +//! +#define EPWM_DB_INPUT_EPWMA 0U +//! Input signal is ePWMB +//! +#define EPWM_DB_INPUT_EPWMB 1U +//! Input signal is the output of Rising Edge delay +//! +#define EPWM_DB_INPUT_DB_RED 2U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandControlShadowLoadMode() as +//! the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_DB_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_DB_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_DB_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_DB_LOAD_FREEZE = 3 +} EPWM_DeadBandControlLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setRisingEdgeDelayCountShadowLoadMode() +//! as the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_RED_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_RED_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_RED_LOAD_FREEZE = 3 +} EPWM_RisingEdgeDelayLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setFallingEdgeDelayCountShadowLoadMode() +//! as the \e loadMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter equals zero + EPWM_FED_LOAD_ON_CNTR_ZERO = 0, + //! Load when counter equals period + EPWM_FED_LOAD_ON_CNTR_PERIOD = 1, + //! Load when counter equals zero or period + EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD = 2, + //! Freeze shadow to active load + EPWM_FED_LOAD_FREEZE = 3 +} EPWM_FallingEdgeDelayLoadMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDeadBandCounterClock() as the +//! \e clockMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Dead band counter runs at TBCLK rate + EPWM_DB_COUNTER_CLOCK_FULL_CYCLE = 0, + //! Dead band counter runs at 2*TBCLK rate + EPWM_DB_COUNTER_CLOCK_HALF_CYCLE = 1 +} EPWM_DeadBandClockMode; + +// +// Trip Zone +// +//***************************************************************************** +// +// Values that can be passed to EPWM_enableTripZoneSignals() and +// EPWM_disableTripZoneSignals() as the tzSignal parameter. +// +//***************************************************************************** +//! TZ1 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC1 0x1U +//! TZ2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC2 0x2U +//! TZ3 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC3 0x4U +//! TZ4 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC4 0x8U +//! TZ5 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC5 0x10U +//! TZ6 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_CBC6 0x20U +//! DCAEVT2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_DCAEVT2 0x40U +//! DCBEVT2 Cycle By Cycle +//! +#define EPWM_TZ_SIGNAL_DCBEVT2 0x80U +//! One-shot TZ1 +//! +#define EPWM_TZ_SIGNAL_OSHT1 0x100U +//! One-shot TZ2 +//! +#define EPWM_TZ_SIGNAL_OSHT2 0x200U +//! One-shot TZ3 +//! +#define EPWM_TZ_SIGNAL_OSHT3 0x400U +//! One-shot TZ4 +//! +#define EPWM_TZ_SIGNAL_OSHT4 0x800U +//! One-shot TZ5 +//! +#define EPWM_TZ_SIGNAL_OSHT5 0x1000U +//! One-shot TZ6 +//! +#define EPWM_TZ_SIGNAL_OSHT6 0x2000U +//! One-shot DCAEVT1 +//! +#define EPWM_TZ_SIGNAL_DCAEVT1 0x4000U +//! One-shot DCBEVT1 +//! +#define EPWM_TZ_SIGNAL_DCBEVT1 0x8000U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneDigitalCompareEventCondition() +//! as the \e dcType parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_DC_OUTPUT_A1 = 0, //!< Digital Compare output 1 A + EPWM_TZ_DC_OUTPUT_A2 = 3, //!< Digital Compare output 2 A + EPWM_TZ_DC_OUTPUT_B1 = 6, //!< Digital Compare output 1 B + EPWM_TZ_DC_OUTPUT_B2 = 9 //!< Digital Compare output 2 B +} EPWM_TripZoneDigitalCompareOutput; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneDigitalCompareEventCondition() +//! as the \e dcEvent parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_EVENT_DC_DISABLED = 0, //!< Event is disabled + EPWM_TZ_EVENT_DCXH_LOW = 1, //!< Event when DCxH low + EPWM_TZ_EVENT_DCXH_HIGH = 2, //!< Event when DCxH high + EPWM_TZ_EVENT_DCXL_LOW = 3, //!< Event when DCxL low + EPWM_TZ_EVENT_DCXL_HIGH = 4, //!< Event when DCxL high + EPWM_TZ_EVENT_DCXL_HIGH_DCXH_LOW = 5 //!< Event when DCxL high DCxH low +} EPWM_TripZoneDigitalCompareOutputEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAction() as the \e tzEvent +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ACTION_EVENT_TZA = 0, //!< TZ1 - TZ6, DCAEVT2, DCAEVT1 + EPWM_TZ_ACTION_EVENT_TZB = 2, //!< TZ1 - TZ6, DCBEVT2, DCBEVT1 + EPWM_TZ_ACTION_EVENT_DCAEVT1 = 4, //!< DCAEVT1 (Digital Compare A event 1) + EPWM_TZ_ACTION_EVENT_DCAEVT2 = 6, //!< DCAEVT2 (Digital Compare A event 2) + EPWM_TZ_ACTION_EVENT_DCBEVT1 = 8, //!< DCBEVT1 (Digital Compare B event 1) + EPWM_TZ_ACTION_EVENT_DCBEVT2 = 10 //!< DCBEVT2 (Digital Compare B event 2) +} EPWM_TripZoneEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAction() as the +//! \e tzAction parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ACTION_HIGH_Z = 0, //!< High impedance output + EPWM_TZ_ACTION_HIGH = 1, //!< High voltage state + EPWM_TZ_ACTION_LOW = 2, //!< Low voltage state + EPWM_TZ_ACTION_DISABLE = 3 //!< Disable action +} EPWM_TripZoneAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvAction() as the +//! \e tzAdvEvent parameter. +// +//***************************************************************************** +typedef enum +{ + //! TZ1 - TZ6, DCBEVT2, DCBEVT1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_TZB_D = 9, + //! TZ1 - TZ6, DCBEVT2, DCBEVT1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_TZB_U = 6, + //! TZ1 - TZ6, DCAEVT2, DCAEVT1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_TZA_D = 3, + //! TZ1 - TZ6, DCAEVT2, DCAEVT1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_TZA_U = 0 +} EPWM_TripZoneAdvancedEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvDigitalCompareActionA(), +//! EPWM_setTripZoneAdvDigitalCompareActionB(),EPWM_setTripZoneAdvAction() +//! as the \e tzAdvDCAction parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_TZ_ADV_ACTION_HIGH_Z = 0, //!< High impedance output + EPWM_TZ_ADV_ACTION_HIGH = 1, //!< High voltage state + EPWM_TZ_ADV_ACTION_LOW = 2, //!< Low voltage state + EPWM_TZ_ADV_ACTION_TOGGLE = 3, //!< Toggle the output + EPWM_TZ_ADV_ACTION_DISABLE = 7 //!< Disable action +} EPWM_TripZoneAdvancedAction; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setTripZoneAdvDigitalCompareActionA() and +//! EPWM_setTripZoneAdvDigitalCompareActionB() as the \e tzAdvDCEvent +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Digital Compare event A/B 1 while counting up + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U = 0, + //! Digital Compare event A/B 1 while counting down + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D = 3, + //! Digital Compare event A/B 2 while counting up + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U = 6, + //! Digital Compare event A/B 2 while counting down + EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D = 9 +} EPWM_TripZoneAdvDigitalCompareEvent; + + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableTripZoneInterrupt()and +// EPWM_disableTripZoneInterrupt() as the tzInterrupt parameter . +// +//***************************************************************************** +//! Trip Zones Cycle By Cycle interrupt +//! +#define EPWM_TZ_INTERRUPT_CBC 0x2U +//! Trip Zones One Shot interrupt +//! +#define EPWM_TZ_INTERRUPT_OST 0x4U +//! Digital Compare A Event 1 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCAEVT1 0x8U +//! Digital Compare A Event 2 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCAEVT2 0x10U +//! Digital Compare B Event 1 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCBEVT1 0x20U +//! Digital Compare B Event 2 interrupt +//! +#define EPWM_TZ_INTERRUPT_DCBEVT2 0x40U + +//***************************************************************************** +// +// Values that can be returned by EPWM_getTripZoneFlagStatus() . +// +//***************************************************************************** +//! Trip Zones Cycle By Cycle flag +//! +#define EPWM_TZ_FLAG_CBC 0x2U +//! Trip Zones One Shot flag +//! +#define EPWM_TZ_FLAG_OST 0x4U +//! Digital Compare A Event 1 flag +//! +#define EPWM_TZ_FLAG_DCAEVT1 0x8U +//! Digital Compare A Event 2 flag +//! +#define EPWM_TZ_FLAG_DCAEVT2 0x10U +//! Digital Compare B Event 1 flag +//! +#define EPWM_TZ_FLAG_DCBEVT1 0x20U +//! Digital Compare B Event 2 flag +//! +#define EPWM_TZ_FLAG_DCBEVT2 0x40U + +//***************************************************************************** +// +// Value can be passed to EPWM_clearTripZoneFlag() as the +// tzInterrupt parameter and returned by EPWM_getTripZoneFlagStatus(). +// +//***************************************************************************** +//! Trip Zone interrupt +//! +#define EPWM_TZ_INTERRUPT 0x1U + +//***************************************************************************** +// +// Values that can be passed to EPWM_clearCycleByCycleTripZoneFlag() +// as the tzCbcFlag parameter and returned by +// EPWM_getCycleByCycleTripZoneFlagStatus(). +// +//***************************************************************************** +//! CBC flag 1 +//! +#define EPWM_TZ_CBC_FLAG_1 0x1U +//! CBC flag 2 +//! +#define EPWM_TZ_CBC_FLAG_2 0x2U +//! CBC flag 3 +//! +#define EPWM_TZ_CBC_FLAG_3 0x4U +//! CBC flag 4 +//! +#define EPWM_TZ_CBC_FLAG_4 0x8U +//! CBC flag 5 +//! +#define EPWM_TZ_CBC_FLAG_5 0x10U +//! CBC flag 6 +//! +#define EPWM_TZ_CBC_FLAG_6 0x20U +//! CBC flag Digital compare event A2 +//! +#define EPWM_TZ_CBC_FLAG_DCAEVT2 0x40U +//! CBC flag Digital compare event B2 +//! +#define EPWM_TZ_CBC_FLAG_DCBEVT2 0x80U + +//***************************************************************************** +// +// Values that can be passed to EPWM_clearOneShotTripZoneFlag() as +// the tzCbcFlag parameter and returned by the +// EPWM_getOneShotTripZoneFlagStatus() . +// +//***************************************************************************** +//! OST flag OST1 +//! +#define EPWM_TZ_OST_FLAG_OST1 0x1U +//! OST flag OST2 +//! +#define EPWM_TZ_OST_FLAG_OST2 0x2U +//! OST flag OST3 +//! +#define EPWM_TZ_OST_FLAG_OST3 0x4U +//! OST flag OST4 +//! +#define EPWM_TZ_OST_FLAG_OST4 0x8U +//! OST flag OST5 +//! +#define EPWM_TZ_OST_FLAG_OST5 0x10U +//! OST flag OST6 +//! +#define EPWM_TZ_OST_FLAG_OST6 0x20U +//! OST flag Digital compare event A1 +//! +#define EPWM_TZ_OST_FLAG_DCAEVT1 0x40U +//! OST flag Digital compare event B1 +//! +#define EPWM_TZ_OST_FLAG_DCBEVT1 0x80U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectCycleByCycleTripZoneClearEvent() as +//! the \e clearMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Clear CBC pulse when counter equals zero + EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO = 0, + //! Clear CBC pulse when counter equals period + EPWM_TZ_CBC_PULSE_CLR_CNTR_PERIOD = 1, + //! Clear CBC pulse when counter equals zero or period + EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD = 2 +} EPWM_CycleByCycleTripZoneClearMode; + +//***************************************************************************** +// +// Values that can be passed to EPWM_forceTripZoneEvent() as the +// tzForceEvent parameter. +// +//***************************************************************************** +//! Force Cycle By Cycle trip event +//! +#define EPWM_TZ_FORCE_EVENT_CBC 0x2U +//! Force a One-Shot Trip Event +//! +#define EPWM_TZ_FORCE_EVENT_OST 0x4U +//! Force Digital Compare Output A Event 1 +//! +#define EPWM_TZ_FORCE_EVENT_DCAEVT1 0x8U +//! Force Digital Compare Output A Event 2 +//! +#define EPWM_TZ_FORCE_EVENT_DCAEVT2 0x10U +//! Force Digital Compare Output B Event 1 +//! +#define EPWM_TZ_FORCE_EVENT_DCBEVT1 0x20U +//! Force Digital Compare Output B Event 2 +//! +#define EPWM_TZ_FORCE_EVENT_DCBEVT2 0x40U + +//***************************************************************************** +// +// Values that can be passed to EPWM_setInterruptSource() as the +// interruptSource parameter. +// +//***************************************************************************** +//! Time-base counter is disabled +//! +#define EPWM_INT_TBCTR_DISABLED 0U +//! Time-base counter equal to zero +//! +#define EPWM_INT_TBCTR_ZERO 1U +//! Time-base counter equal to period +//! +#define EPWM_INT_TBCTR_PERIOD 2U +//! Time-base counter equal to zero or period +//! +#define EPWM_INT_TBCTR_ZERO_OR_PERIOD 3U +//! time-base counter equal to CMPA when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPA 4U +//! time-base counter equal to CMPC when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPC 8U +//! time-base counter equal to CMPA when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPA 5U +//! time-base counter equal to CMPC when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPC 10U +//! time-base counter equal to CMPB when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPB 6U +//! time-base counter equal to CMPD when the timer is incrementing +//! +#define EPWM_INT_TBCTR_U_CMPD 12U +//! time-base counter equal to CMPB when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPB 7U +//! time-base counter equal to CMPD when the timer is decrementing +//! +#define EPWM_INT_TBCTR_D_CMPD 14U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_enableADCTrigger(), +//! EPWM_disableADCTrigger(),EPWM_setADCTriggerSource(), +//! EPWM_setADCTriggerEventPrescale(),EPWM_getADCTriggerFlagStatus(), +//! EPWM_clearADCTriggerFlag(),EPWM_enableADCTriggerEventCountInit(), +//! EPWM_disableADCTriggerEventCountInit(),EPWM_forceADCTriggerEventCountInit(), +//! EPWM_setADCTriggerEventCountInitValue(),EPWM_getADCTriggerEventCount(), +//! EPWM_forceADCTrigger() as the \e adcSOCType parameter +// +//***************************************************************************** +typedef enum +{ + EPWM_SOC_A = 0, //!< SOC A + EPWM_SOC_B = 1 //!< SOC B +} EPWM_ADCStartOfConversionType; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setADCTriggerSource() as the +//! \e socSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Event is based on DCxEVT1 + EPWM_SOC_DCxEVT1 = 0, + //! Time-base counter equal to zero + EPWM_SOC_TBCTR_ZERO = 1, + //! Time-base counter equal to period + EPWM_SOC_TBCTR_PERIOD = 2, + //! Time-base counter equal to zero or period + EPWM_SOC_TBCTR_ZERO_OR_PERIOD = 3, + //! Time-base counter equal to CMPA when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPA = 4, + //! Time-base counter equal to CMPC when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPC = 8, + //! Time-base counter equal to CMPA when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPA = 5, + //! Time-base counter equal to CMPC when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPC = 10, + //! Time-base counter equal to CMPB when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPB = 6, + //! Time-base counter equal to CMPD when the timer is incrementing + EPWM_SOC_TBCTR_U_CMPD = 12, + //! Time-base counter equal to CMPB when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPB = 7, + //! Time-base counter equal to CMPD when the timer is decrementing + EPWM_SOC_TBCTR_D_CMPD = 14 +} EPWM_ADCStartOfConversionSource; + +// +// Digital Compare Module +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectDigitalCompareTripInput(), +//! EPWM_enableDigitalCompareTripCombinationInput(), +//! EPWM_disableDigitalCompareTripCombinationInput() as the \e dcType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_TYPE_DCAH = 0, //!< Digital Compare A High + EPWM_DC_TYPE_DCAL = 1, //!< Digital Compare A Low + EPWM_DC_TYPE_DCBH = 2, //!< Digital Compare B High + EPWM_DC_TYPE_DCBL = 3 //!< Digital Compare B Low +} EPWM_DigitalCompareType; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_selectDigitalCompareTripInput() +//! as the \e tripSource parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_TRIP_TRIPIN1 = 0, //!< Trip 1 + EPWM_DC_TRIP_TRIPIN2 = 1, //!< Trip 2 + EPWM_DC_TRIP_TRIPIN3 = 2, //!< Trip 3 + EPWM_DC_TRIP_TRIPIN4 = 3, //!< Trip 4 + EPWM_DC_TRIP_TRIPIN5 = 4, //!< Trip 5 + EPWM_DC_TRIP_TRIPIN6 = 5, //!< Trip 6 + EPWM_DC_TRIP_TRIPIN7 = 6, //!< Trip 7 + EPWM_DC_TRIP_TRIPIN8 = 7, //!< Trip 8 + EPWM_DC_TRIP_TRIPIN9 = 8, //!< Trip 9 + EPWM_DC_TRIP_TRIPIN10 = 9, //!< Trip 10 + EPWM_DC_TRIP_TRIPIN11 = 10, //!< Trip 11 + EPWM_DC_TRIP_TRIPIN12 = 11, //!< Trip 12 + EPWM_DC_TRIP_TRIPIN14 = 13, //!< Trip 14 + EPWM_DC_TRIP_TRIPIN15 = 14, //!< Trip 15 + EPWM_DC_TRIP_COMBINATION = 15 //!< All Trips (Trip1 - Trip 15) are selected +} EPWM_DigitalCompareTripInput; + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableDigitalCompareTripCombinationInput(), +// EPWM_disableDigitalCompareTripCombinationInput() as the tripInput +// parameter. +// +//***************************************************************************** +//! Combinational Trip 1 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN1 0x1U +//! Combinational Trip 2 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN2 0x2U +//! Combinational Trip 3 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN3 0x4U +//! Combinational Trip 4 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN4 0x8U +//! Combinational Trip 5 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN5 0x10U +//! Combinational Trip 6 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN6 0x20U +//! Combinational Trip 7 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN7 0x40U +//! Combinational Trip 8 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN8 0x80U +//! Combinational Trip 9 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN9 0x100U +//! Combinational Trip 10 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN10 0x200U +//! Combinational Trip 11 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN11 0x400U +//! Combinational Trip 12 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN12 0x800U +//! Combinational Trip 14 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN14 0x2000U +//! Combinational Trip 15 input +//! +#define EPWM_DC_COMBINATIONAL_TRIPIN15 0x4000U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareBlankingEvent() as the +//! the \e blankingPulse parameter. +// +//***************************************************************************** +typedef enum +{ + //! Time base counter equals period + EPWM_DC_WINDOW_START_TBCTR_PERIOD = 0, + //! Time base counter equals zero + EPWM_DC_WINDOW_START_TBCTR_ZERO = 1, + //! Time base counter equals zero or period + EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD = 2 +} EPWM_DigitalCompareBlankingPulse; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareFilterInput() +//! as the \e filterInput parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_WINDOW_SOURCE_DCAEVT1 = 0, //!< DC filter signal source is DCAEVT1 + EPWM_DC_WINDOW_SOURCE_DCAEVT2 = 1, //!< DC filter signal source is DCAEVT2 + EPWM_DC_WINDOW_SOURCE_DCBEVT1 = 2, //!< DC filter signal source is DCBEVT1 + EPWM_DC_WINDOW_SOURCE_DCBEVT2 = 3 //!< DC filter signal source is DCBEVT2 +} EPWM_DigitalCompareFilterInput; + +//***************************************************************************** +// +//! Values that can be assigned to EPWM_setDigitalCompareEventSource(), +//! EPWM_setDigitalCompareEventSyncMode(),EPWM_enableDigitalCompareSyncEvent() +//! EPWM_enableDigitalCompareADCTrigger(),EPWM_disableDigitalCompareSyncEvent() +//! EPWM_disableDigitalCompareADCTrigger() as the \e dcModule parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_MODULE_A = 0, //!< Digital Compare Module A + EPWM_DC_MODULE_B = 1 //!< Digital Compare Module B +} EPWM_DigitalCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSource(), +//! EPWM_setDigitalCompareEventSyncMode as the \e dcEvent parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EVENT_1 = 0, //!< Digital Compare Event number 1 + EPWM_DC_EVENT_2 = 1 //!< Digital Compare Event number 2 +} EPWM_DigitalCompareEvent; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSource() as the +//! \e dcEventSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Signal source is unfiltered (DCAEVT1/2) + EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL = 0, + //! Signal source is filtered (DCEVTFILT) + EPWM_DC_EVENT_SOURCE_FILT_SIGNAL = 1 +} EPWM_DigitalCompareEventSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEventSyncMode() as the +//! \e syncMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! DC input signal is synced with TBCLK + EPWM_DC_EVENT_INPUT_SYNCED = 0, + //! DC input signal is not synced with TBCLK + EPWM_DC_EVENT_INPUT_NOT_SYNCED = 1 +} EPWM_DigitalCompareSyncMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setGlobalLoadTrigger() as the +//! \e loadTrigger parameter. +// +//***************************************************************************** +typedef enum +{ + //! Load when counter is equal to zero + EPWM_GL_LOAD_PULSE_CNTR_ZERO = 0x0, + //! Load when counter is equal to period + EPWM_GL_LOAD_PULSE_CNTR_PERIOD = 0x1, + //! Load when counter is equal to zero or period + EPWM_GL_LOAD_PULSE_CNTR_ZERO_PERIOD = 0x2, + //! Load on sync event + EPWM_GL_LOAD_PULSE_SYNC = 0x3, + //! Load on sync event or when counter is equal to zero + EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_ZERO = 0x4, + //! Load on sync event or when counter is equal to period + EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_PERIOD = 0x5, + //! Load on sync event or when counter is equal to period or zero + EPWM_GL_LOAD_PULSE_SYNC_CNTR_ZERO_PERIOD = 0x6, + //! Load on global force + EPWM_GL_LOAD_PULSE_GLOBAL_FORCE = 0xF +} EPWM_GlobalLoadTrigger; + +//***************************************************************************** +// +// Values that can be passed to EPWM_enableGlobalLoadRegisters(), +// EPWM_disableGlobalLoadRegisters() as theloadRegister parameter. +// +//***************************************************************************** +//! Global load TBPRD:TBPRDHR +//! +#define EPWM_GL_REGISTER_TBPRD_TBPRDHR 0x1U +//! Global load CMPA:CMPAHR +//! +#define EPWM_GL_REGISTER_CMPA_CMPAHR 0x2U +//! Global load CMPB:CMPBHR +//! +#define EPWM_GL_REGISTER_CMPB_CMPBHR 0x4U +//! Global load CMPC +//! +#define EPWM_GL_REGISTER_CMPC 0x8U +//! Global load CMPD +//! +#define EPWM_GL_REGISTER_CMPD 0x10U +//! Global load DBRED:DBREDHR +//! +#define EPWM_GL_REGISTER_DBRED_DBREDHR 0x20U +//! Global load DBFED:DBFEDHR +//! +#define EPWM_GL_REGISTER_DBFED_DBFEDHR 0x40U +//! Global load DBCTL +//! +#define EPWM_GL_REGISTER_DBCTL 0x80U +//! Global load AQCTLA/A2 +//! +#define EPWM_GL_REGISTER_AQCTLA_AQCTLA2 0x100U +//! Global load AQCTLB/B2 +//! +#define EPWM_GL_REGISTER_AQCTLB_AQCTLB2 0x200U +//! Global load AQCSFRC +//! +#define EPWM_GL_REGISTER_AQCSFRC 0x400U + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setValleyTriggerSource() as the \e +//! trigger parameter. +// +//***************************************************************************** +typedef enum +{ + //! Valley capture trigged by software + EPWM_VALLEY_TRIGGER_EVENT_SOFTWARE = 0U, + //! Valley capture trigged by when counter is equal to zero + EPWM_VALLEY_TRIGGER_EVENT_CNTR_ZERO = 1U, + //! Valley capture trigged by when counter is equal period + EPWM_VALLEY_TRIGGER_EVENT_CNTR_PERIOD = 2U, + //! Valley capture trigged when counter is equal to zero or period + EPWM_VALLEY_TRIGGER_EVENT_CNTR_ZERO_PERIOD = 3U, + //! Valley capture trigged by DCAEVT1 (Digital Compare A event 1) + EPWM_VALLEY_TRIGGER_EVENT_DCAEVT1 = 4U, + //! Valley capture trigged by DCAEVT2 (Digital Compare A event 2) + EPWM_VALLEY_TRIGGER_EVENT_DCAEVT2 = 5U, + //! Valley capture trigged by DCBEVT1 (Digital Compare B event 1) + EPWM_VALLEY_TRIGGER_EVENT_DCBEVT1 = 6U, + //! Valley capture trigged by DCBEVT2 (Digital Compare B event 2) + EPWM_VALLEY_TRIGGER_EVENT_DCBEVT2 = 7U +} EPWM_ValleyTriggerSource; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_getValleyCountEdgeStatus() as the \e edge +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_VALLEY_COUNT_START_EDGE = 0, //!< Valley count start edge + EPWM_VALLEY_COUNT_STOP_EDGE = 1 //!< Valley count stop edge +} EPWM_ValleyCounterEdge; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setValleyDelayValue() as the \e delayMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Delay value equals the offset value defines by software + EPWM_VALLEY_DELAY_MODE_SW_DELAY = 0U, + //! Delay value equals the sum of the Hardware counter value and the offset + //! value defines by software + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SW_DELAY = 1U, + //! Delay value equals the the Hardware counter shifted by + //! (1 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_1_SW_DELAY = 2U, + //! Delay value equals the the Hardware counter shifted by + //! (2 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_2_SW_DELAY = 3U, + //! Delay value equals the the Hardware counter shifted by + //! (4 + the offset value defines by software) + EPWM_VALLEY_DELAY_MODE_VCNT_DELAY_SHIFT_4_SW_DELAY = 4U +} EPWM_ValleyDelayMode; + +// +// DC Edge Filter +// +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEdgeFilterMode() +//! as the \e edgeMode parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EDGEFILT_MODE_RISING = 0, //!< Digital Compare Edge filter low + //!< to high edge mode + EPWM_DC_EDGEFILT_MODE_FALLING = 1, //!< Digital Compare Edge filter high + //!< to low edge mode + EPWM_DC_EDGEFILT_MODE_BOTH = 2 //!< Digital Compare Edge filter both + //!< edges mode +} EPWM_DigitalCompareEdgeFilterMode; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_setDigitalCompareEdgeFilterEdgeCount() +//! as the \e edgeCount parameter. +// +//***************************************************************************** +typedef enum +{ + EPWM_DC_EDGEFILT_EDGECNT_0 = 0, //!< Digital Compare Edge filter edge + //!< count = 0 + EPWM_DC_EDGEFILT_EDGECNT_1 = 1, //!< Digital Compare Edge filter edge + //!< count = 1 + EPWM_DC_EDGEFILT_EDGECNT_2 = 2, //!< Digital Compare Edge filter edge + //!< count = 2 + EPWM_DC_EDGEFILT_EDGECNT_3 = 3, //!< Digital Compare Edge filter edge + //!< count = 3 + EPWM_DC_EDGEFILT_EDGECNT_4 = 4, //!< Digital Compare Edge filter edge + //!< count = 4 + EPWM_DC_EDGEFILT_EDGECNT_5 = 5, //!< Digital Compare Edge filter edge + //!< count = 5 + EPWM_DC_EDGEFILT_EDGECNT_6 = 6, //!< Digital Compare Edge filter edge + //!< count = 6 + EPWM_DC_EDGEFILT_EDGECNT_7 = 7 //!< Digital Compare Edge filter edge + //!< count = 7 +} EPWM_DigitalCompareEdgeFilterEdgeCount; + +//***************************************************************************** +// +//! Values that can be passed to EPWM_configureSignal() as the +//! \e signalParams parameter. +// +//***************************************************************************** +typedef struct +{ + float32_t freqInHz; //!< Desired Signal Frequency(in Hz) + float32_t dutyValA; //!< Desired ePWMxA Signal Duty + float32_t dutyValB; //!< Desired ePWMxB Signal Duty + bool invertSignalB; //!< Invert ePWMxB Signal if true + float32_t sysClkInHz; //!< SYSCLK Frequency(in Hz) + SysCtl_EPWMCLKDivider epwmClkDiv; //!< EPWM Clock Divider + EPWM_TimeBaseCountMode tbCtrMode; //!< Time Base Counter Mode + EPWM_ClockDivider tbClkDiv; //!< Time Base Counter Clock Divider + EPWM_HSClockDivider tbHSClkDiv; //!< Time Base Counter HS Clock Divider +} EPWM_SignalParams; + +//***************************************************************************** +// +// Functions APIs shared with HRPWM module +// +//***************************************************************************** + +// +// Period Control related API +// +#define EPWM_setSyncPulseSource HRPWM_setSyncPulseSource + +//***************************************************************************** +// +// Prototypes for the API. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \internal +//! Checks ePWM base address. +//! +//! \param base specifies the ePWM module base address. +//! +//! This function determines if an ePWM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool EPWM_isBaseValid(uint32_t base) +{ + return( + (base == EPWM1_BASE) || + (base == EPWM2_BASE) || + (base == EPWM3_BASE) || + (base == EPWM4_BASE) || + (base == EPWM5_BASE) || + (base == EPWM6_BASE) || + (base == EPWM7_BASE) || + (base == EPWM8_BASE) || + (base == EPWM9_BASE) || + (base == EPWM10_BASE) || + (base == EPWM11_BASE) || + (base == EPWM12_BASE) + ); +} +#endif + +// +// Time Base Sub Module related APIs +// +//***************************************************************************** +// +//! Set the time base count +//! +//! \param base is the base address of the EPWM module. +//! \param count is the time base count value. +//! +//! This function sets the 16 bit counter value of the time base counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBaseCounter(uint32_t base, uint16_t count) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBCTR register + // + HWREGH(base + EPWM_O_TBCTR) = count; +} + +//***************************************************************************** +// +//! Set count mode after phase shift sync +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the count mode. +//! +//! This function sets the time base count to count up or down after a new +//! phase value set by the EPWM_setPhaseShift(). The count direction is +//! determined by the variable mode. Valid inputs for mode are: +//! - EPWM_COUNT_MODE_UP_AFTER_SYNC - Count up after sync +//! - EPWM_COUNT_MODE_DOWN_AFTER_SYNC - Count down after sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCountModeAfterSync(uint32_t base, EPWM_SyncCountMode mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(mode == EPWM_COUNT_MODE_UP_AFTER_SYNC) + { + // + // Set PHSDIR bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PHSDIR; + } + else + { + // + // Clear PHSDIR bit + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PHSDIR; + } +} + +//***************************************************************************** +// +//! Set the time base clock and the high speed time base clock count pre-scaler +//! +//! \param base is the base address of the EPWM module. +//! \param prescaler is the time base count pre scale value. +//! \param highSpeedPrescaler is the high speed time base count pre scale +//! value. +//! +//! This function sets the pre scaler(divider)value for the time base clock +//! counter and the high speed time base clock counter. +//! Valid values for pre-scaler and highSpeedPrescaler are EPWM_CLOCK_DIVIDER_X, +//! where X is 1,2,4,8,16, 32,64 or 128. +//! The actual numerical values for these macros represent values 0,1...7. +//! The equation for the output clock is: +//! TBCLK = EPWMCLK/(highSpeedPrescaler * pre-scaler) +//! +//! \b Note: EPWMCLK is a scaled version of SYSCLK. At reset EPWMCLK is half +//! SYSCLK. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setClockPrescaler(uint32_t base, EPWM_ClockDivider prescaler, + EPWM_HSClockDivider highSpeedPrescaler) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to CLKDIV and HSPCLKDIV bit + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & + ~(EPWM_TBCTL_CLKDIV_M | EPWM_TBCTL_HSPCLKDIV_M)) | + (((uint16_t)prescaler << EPWM_TBCTL_CLKDIV_S) | + ((uint16_t)highSpeedPrescaler << EPWM_TBCTL_HSPCLKDIV_S))); +} + +//***************************************************************************** +// +//! Force a software sync pulse +//! +//! \param base is the base address of the EPWM module. +//! +//! This function causes a single software initiated sync pulse. Make sure the +//! appropriate mode is selected using EPWM_setupSyncOutputMode() before using +//! this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceSyncPulse(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SWFSYNC bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_SWFSYNC; +} + +//***************************************************************************** +// +//! Set up the sync out pulse event +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the sync out mode. +//! +//! This function set the sync out pulse mode. +//! Valid values for mode are: +//! - EPWM_SYNC_OUT_PULSE_ON_SOFTWARE - sync pulse is generated by software +//! when EPWM_forceSyncPulse() +//! function is called or by EPWMxSYNCI +//! signal. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO - sync pulse is generated when +//! time base counter equals zero. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B - sync pulse is generated when +//! time base counter equals compare +//! B value. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C - sync pulse is generated when +//! time base counter equals compare +//! C value. +//! - EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D - sync pulse is generated when +//! time base counter equals compare +//! D value. +//! - EPWM_SYNC_OUT_PULSE_DISABLED - sync pulse is disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setSyncOutPulseMode(uint32_t base, EPWM_SyncOutPulseMode mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // No extended mode support + // + if(mode < EPWM_SYNC_OUT_PULSE_DISABLED) + { + // + // Write to SYNCOSEL bits + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & ~(EPWM_TBCTL_SYNCOSEL_M)) | + ((uint16_t)mode << EPWM_TBCTL_SYNCOSEL_S)); + } + // + // Extended modes and sync out disable mode + // + else + { + // + // Write 0x3 to SYNCOSEL to enable selection from SYNCOSELX + // + HWREGH(base + EPWM_O_TBCTL) = HWREGH(base + EPWM_O_TBCTL) | + EPWM_TBCTL_SYNCOSEL_M; + + // + // Write to SYNCOSELX bit + // + HWREGH(base + EPWM_O_TBCTL2) = + ((HWREGH(base + EPWM_O_TBCTL2) & ~(EPWM_TBCTL2_SYNCOSELX_M)) | + (((uint16_t)mode & 0x3U) << EPWM_TBCTL2_SYNCOSELX_S)); + } +} + +//***************************************************************************** +// +//! Set PWM period load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the PWM period load mode. +//! +//! This function sets the load mode for the PWM period. If loadMode is set to +//! EPWM_PERIOD_SHADOW_LOAD, a write or read to the TBPRD (PWM Period count +//! register) accesses the shadow register. If loadMode is set to +//! EPWM_PERIOD_DIRECT_LOAD, a write or read to the TBPRD register accesses the +//! register directly. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setPeriodLoadMode(uint32_t base, EPWM_PeriodLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(loadMode == EPWM_PERIOD_SHADOW_LOAD) + { + // + // Clear PRDLD + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PRDLD; + } + else + { + // + // Set PRDLD + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PRDLD; + } +} + +//***************************************************************************** +// +//! Enable phase shift load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables loading of phase shift when the appropriate sync +//! event occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set PHSEN bit + // + HWREGH(base + EPWM_O_TBCTL) |= EPWM_TBCTL_PHSEN; +} + +//***************************************************************************** +// +//! Disable phase shift load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables loading of phase shift. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear PHSEN bit + // + HWREGH(base + EPWM_O_TBCTL) &= ~EPWM_TBCTL_PHSEN; +} + +//***************************************************************************** +// +//! Set time base counter mode +//! +//! \param base is the base address of the EPWM module. +//! \param counterMode is the time base counter mode. +//! +//! This function sets up the time base counter mode. +//! Valid values for counterMode are: +//! - EPWM_COUNTER_MODE_UP - Up - count mode. +//! - EPWM_COUNTER_MODE_DOWN - Down - count mode. +//! - EPWM_COUNTER_MODE_UP_DOWN - Up - down - count mode. +//! - EPWM_COUNTER_MODE_STOP_FREEZE - Stop - Freeze counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBaseCounterMode(uint32_t base, EPWM_TimeBaseCountMode counterMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to CTRMODE bit + // + HWREGH(base + EPWM_O_TBCTL) = + ((HWREGH(base + EPWM_O_TBCTL) & ~(EPWM_TBCTL_CTRMODE_M)) | + ((uint16_t)counterMode)); +} + +//***************************************************************************** +// +//! Set shadow to active period load on sync mode +//! +//! \param base is the base address of the EPWM module. +//! \param shadowLoadMode is the shadow to active load mode. +//! +//! This function sets up the shadow to active Period register load mode with +//! respect to a sync event. Valid values for shadowLoadMode are: +//! - EPWM_SHADOW_LOAD_MODE_COUNTER_ZERO - shadow to active load occurs when +//! time base counter reaches 0. +//! - EPWM_SHADOW_LOAD_MODE_COUNTER_SYNC - shadow to active load occurs when +//! time base counter reaches 0 and a +//! SYNC occurs. +//! - EPWM_SHADOW_LOAD_MODE_SYNC - shadow to active load occurs only +//! when a SYNC occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_selectPeriodLoadEvent(uint32_t base, + EPWM_PeriodShadowLoadMode shadowLoadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to PRDLDSYNC bit + // + HWREGH(base + EPWM_O_TBCTL2) = + ((HWREGH(base + EPWM_O_TBCTL2) & ~(EPWM_TBCTL2_PRDLDSYNC_M)) | + ((uint16_t)shadowLoadMode << EPWM_TBCTL2_PRDLDSYNC_S)); +} +//***************************************************************************** +// +//! Enable one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables one shot sync mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set OSHTSYNCMODE bit + // + HWREGH(base + EPWM_O_TBCTL2) |= EPWM_TBCTL2_OSHTSYNCMODE; +} + +//***************************************************************************** +// +//! Disable one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables one shot sync mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear OSHTSYNCMODE bit + // + HWREGH(base + EPWM_O_TBCTL2) &= ~EPWM_TBCTL2_OSHTSYNCMODE; +} + +//***************************************************************************** +// +//! Start one shot sync mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function propagates a one shot sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_startOneShotSync(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set OSHTSYNC bit + // + HWREGH(base + EPWM_O_TBCTL2) |= EPWM_TBCTL2_OSHTSYNC; +} + +//***************************************************************************** +// +//! Returns time base counter value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the current value of the time base counter. +//! +//! \return returns time base counter value +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBaseCounterValue(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Returns TBCTR value + // + return(HWREGH(base + EPWM_O_TBCTR)); +} + +//***************************************************************************** +// +//! Return time base counter maximum status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the status of the time base max counter. +//! +//! \return Returns true if the counter has reached 0xFFFF. +//! Returns false if the counter hasn't reached 0xFFFF. +// +//***************************************************************************** +static inline bool +EPWM_getTimeBaseCounterOverflowStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return true if CTRMAX bit is set, false otherwise + // + return(((HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_CTRMAX) == + EPWM_TBSTS_CTRMAX) ? true : false); +} + +//***************************************************************************** +// +//! Clear max time base counter event. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the max time base counter latch event. The latch event +//! occurs when the time base counter reaches its maximum value of 0xFFFF. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_clearTimeBaseCounterOverflowEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set CTRMAX bit + // + HWREGH(base + EPWM_O_TBSTS) = EPWM_TBSTS_CTRMAX; +} + +//***************************************************************************** +// +//! Return external sync signal status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the external sync signal status. +//! +//! \return Returns true if if an external sync signal event +//! Returns false if there is no event. +// +//***************************************************************************** +static inline bool +EPWM_getSyncStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return true if SYNCI bit is set, false otherwise + // + return(((HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_SYNCI) == + EPWM_TBSTS_SYNCI) ? true : false); +} + +//***************************************************************************** +// +//! Clear external sync signal event. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the external sync signal latch event. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_clearSyncEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SYNCI bit + // + HWREGH(base + EPWM_O_TBSTS) = EPWM_TBSTS_SYNCI; +} + +//***************************************************************************** +// +//! Return time base counter direction. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the direction of the time base counter. +//! +//! \return returns EPWM_TIME_BASE_STATUS_COUNT_UP if the counter is counting +//! up or EPWM_TIME_BASE_STATUS_COUNT_DOWN if the counter is +//! counting down. +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBaseCounterDirection(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return CTRDIR bit + // + return(HWREGH(base + EPWM_O_TBSTS) & EPWM_TBSTS_CTRDIR); +} + +//***************************************************************************** +// +//! Sets the phase shift offset counter value. +//! +//! \param base is the base address of the EPWM module. +//! \param phaseCount is the phase shift count value. +//! +//! This function sets the 16 bit time-base counter phase of the ePWM relative +//! to the time-base that is supplying the synchronization input signal. Call +//! the EPWM_enablePhaseShiftLoad() function to enable loading of the +//! phaseCount phase shift value when a sync event occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setPhaseShift(uint32_t base, uint16_t phaseCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBPHS bit + // + HWREG(base + EPWM_O_TBPHS) = + ((HWREG(base + EPWM_O_TBPHS) & + ~((uint32_t)EPWM_TBPHS_TBPHS_M)) | + ((uint32_t)phaseCount << EPWM_TBPHS_TBPHS_S)); +} + +//***************************************************************************** +// +//! Sets the PWM period count. +//! +//! \param base is the base address of the EPWM module. +//! \param periodCount is period count value. +//! +//! This function sets the period of the PWM count. The value of periodCount is +//! the value written to the register. User should map the desired period or +//! frequency of the waveform into the correct periodCount. +//! Invoke the function EPWM_selectPeriodLoadEvent() with the appropriate +//! parameter to set the load mode of the Period count. periodCount has a +//! maximum valid value of 0xFFFF +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTimeBasePeriod(uint32_t base, uint16_t periodCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TBPRD bit + // + HWREGH(base + EPWM_O_TBPRD) = periodCount; +} + +//***************************************************************************** +// +//! Gets the PWM period count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets the period of the PWM count. +//! +//! \return The period count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getTimeBasePeriod(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read from TBPRD bit + // + return(HWREGH(base + EPWM_O_TBPRD)); +} + +//***************************************************************************** +// +//! Sets the EPWM links. +//! +//! \param base is the base address of the EPWM module. +//! \param epwmLink is the ePWM instance to link with. +//! \param linkComp is the ePWM component to link. +//! +//! This function links the component defined in linkComp in the current ePWM +//! instance with the linkComp component of the ePWM instance defined by +//! epwmLink. A change (a write) in the value of linkComp component of epwmLink +//! instance, causes a change in the current ePWM linkComp component. +//! For example if the current ePWM is ePWM3 and the values of epwmLink and +//! linkComp are EPWM_LINK_WITH_EPWM_1 and EPWM_LINK_COMP_C respectively, +//! then a write to COMPC register in ePWM1, will result in a simultaneous +//! write to COMPC register in ePWM3. +//! Valid values for epwmLink are: +//! - EPWM_LINK_WITH_EPWM_1 - link current ePWM with ePWM1 +//! - EPWM_LINK_WITH_EPWM_2 - link current ePWM with ePWM2 +//! - EPWM_LINK_WITH_EPWM_3 - link current ePWM with ePWM3 +//! - EPWM_LINK_WITH_EPWM_4 - link current ePWM with ePWM4 +//! - EPWM_LINK_WITH_EPWM_5 - link current ePWM with ePWM5 +//! - EPWM_LINK_WITH_EPWM_6 - link current ePWM with ePWM6 +//! - EPWM_LINK_WITH_EPWM_7 - link current ePWM with ePWM7 +//! - EPWM_LINK_WITH_EPWM_8 - link current ePWM with ePWM8 +//! - EPWM_LINK_WITH_EPWM_9 - link current ePWM with ePWM9 +//! - EPWM_LINK_WITH_EPWM_10 - link current ePWM with ePWM10 +//! - EPWM_LINK_WITH_EPWM_11 - link current ePWM with ePWM11 +//! - EPWM_LINK_WITH_EPWM_12 - link current ePWM with ePWM12 +//! +//! Valid values for linkComp are: +//! - EPWM_LINK_TBPRD - link TBPRD:TBPRDHR registers +//! - EPWM_LINK_COMP_A - link COMPA registers +//! - EPWM_LINK_COMP_B - link COMPB registers +//! - EPWM_LINK_COMP_C - link COMPC registers +//! - EPWM_LINK_COMP_D - link COMPD registers +//! - EPWM_LINK_GLDCTL2 - link GLDCTL2 registers +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setupEPWMLinks(uint32_t base, EPWM_CurrentLink epwmLink, + EPWM_LinkComponent linkComp) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + uint32_t registerOffset; + registerOffset = base + EPWM_O_XLINK; + + // + // Configure EPWM links + // + HWREG(registerOffset) = + ((HWREG(registerOffset) & ~((uint32_t)EPWM_XLINK_TBPRDLINK_M << (uint32_t)linkComp)) | + ((uint32_t)epwmLink << (uint32_t)linkComp)); +} + + +//***************************************************************************** +// +//! Sets up the Counter Compare shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the counter compare module. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets up the counter compare shadow load mode. +//! Valid values for the variables are: +//! - compModule +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! - loadMode +//! - EPWM_COMP_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - EPWM_COMP_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_COMP_LOAD_FREEZE - Freeze shadow to active load +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO - load when counter equals zero +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_PERIOD -load when counter equals period +//! - EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_COMP_LOAD_ON_SYNC_ONLY - load on sync only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCounterCompareShadowLoadMode(uint32_t base, + EPWM_CounterCompareModule compModule, + EPWM_CounterCompareLoadMode loadMode) +{ + uint16_t syncModeOffset; + uint16_t loadModeOffset; + uint16_t shadowModeOffset; + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_C)) + { + syncModeOffset = 10U; + loadModeOffset = 0U; + shadowModeOffset = 4U; + } + else + { + syncModeOffset = 12U; + loadModeOffset = 2U; + shadowModeOffset = 6U; + } + + // + // Get the register offset. EPWM_O_CMPCTL for A&B or + // EPWM_O_CMPCTL2 for C&D + // + registerOffset = base + EPWM_O_CMPCTL + ((uint32_t)compModule & 0x1U); + + // + // Set the appropriate sync and load mode bits and also enable shadow + // load mode. Shadow to active load can also be frozen. + // + HWREGH(registerOffset) = ((HWREGH(registerOffset) & + ~((0x3U << syncModeOffset) | // Clear sync mode + (0x3U << loadModeOffset) | // Clear load mode + (0x1U << shadowModeOffset))) | // shadow mode + ((((uint16_t)loadMode >> 2U) << syncModeOffset) | + (((uint16_t)loadMode & 0x3U) << loadModeOffset))); +} + +//***************************************************************************** +// +//! Disable Counter Compare shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the counter compare module. +//! +//! This function disables counter compare shadow load mode. +//! Valid values for the variables are: +//! - compModule +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableCounterCompareShadowLoadMode(uint32_t base, + EPWM_CounterCompareModule compModule) +{ + uint16_t shadowModeOffset; + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_C)) + { + shadowModeOffset = 4U; + } + else + { + shadowModeOffset = 6U; + } + + // + // Get the register offset. EPWM_O_CMPCTL for A&B or + // EPWM_O_CMPCTL2 for C&D + // + registerOffset = base + EPWM_O_CMPCTL + ((uint32_t)compModule & 0x1U); + + // + // Disable shadow load mode. + // + HWREGH(registerOffset) = (HWREGH(registerOffset) | + (0x1U << shadowModeOffset)); +} + +//***************************************************************************** +// +//! Set counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! \param compCount is the counter compare count value. +//! +//! This function sets the counter compare value for counter compare registers. +//! The maximum value for compCount is 0xFFFF. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule, + uint16_t compCount) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset for the Counter compare + // + registerOffset = EPWM_O_CMPA + (uint32_t)compModule; + + // + // Write to the counter compare registers. + // + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)) + { + // + // Write to COMPA or COMPB bits + // + HWREGH(base + registerOffset + 0x1U) = compCount; + } + else + { + // + // Write to COMPC or COMPD bits + // + HWREGH(base + registerOffset) = compCount; + } +} + +//***************************************************************************** +// +//! Get counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! +//! This function gets the counter compare value for counter compare registers. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! - EPWM_COUNTER_COMPARE_C - counter compare C. +//! - EPWM_COUNTER_COMPARE_D - counter compare D. +//! +//! \return The counter compare count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule) +{ + uint32_t registerOffset; + uint16_t compCount; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset for the Counter compare + // + registerOffset = EPWM_O_CMPA + (uint32_t)compModule; + + // + // Read from the counter compare registers. + // + if((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)) + { + // + // Read COMPA or COMPB bits + // + compCount = (uint16_t)((HWREG(base + registerOffset) & + 0xFFFF0000UL) >> 16U); + } + else + { + // + // Read COMPC or COMPD bits + // + compCount = HWREGH(base + registerOffset); + } + return(compCount); +} + +//***************************************************************************** +// +//! Return the counter compare shadow register full status. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare value module. +//! +//! This function returns the counter Compare shadow register full status flag. +//! Valid values for compModule are: +//! - EPWM_COUNTER_COMPARE_A - counter compare A. +//! - EPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \return Returns true if the shadow register is full. +//! Returns false if the shadow register is not full. +// +//***************************************************************************** +static inline bool +EPWM_getCounterCompareShadowStatus(uint32_t base, + EPWM_CounterCompareModule compModule) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Check the validity of input. + // COMPA and COMPB are valid input arguments. + // + ASSERT((compModule == EPWM_COUNTER_COMPARE_A) || + (compModule == EPWM_COUNTER_COMPARE_B)); + + // + // Read the value of SHDWAFULL or SHDWBFULL bit + // + return((((HWREG(base + EPWM_O_CMPCTL) >> + ((((uint16_t)compModule >> 1U) & 0x1U) + 8U)) & + 0x1U) == 0x1U) ? true:false); +} + +// +// Action Qualifier module related APIs +// +//***************************************************************************** +// +//! Sets the Action Qualifier shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param aqModule is the Action Qualifier module value. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets the Action Qualifier shadow load mode. +//! Valid values for the variables are: +//! - aqModule +//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A. +//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B. +//! - loadMode +//! - EPWM_AQ_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - EPWM_AQ_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - EPWM_AQ_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals +//! zero or period +//! - EPWM_AQ_LOAD_FREEZE - Freeze shadow to active load +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO - load on sync or when counter +//! equals zero +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_PERIOD - load on sync or when counter +//! equals period +//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO_PERIOD - load on sync or when +//! counter equals zero or period +//! - EPWM_AQ_LOAD_ON_SYNC_ONLY - load on sync only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierShadowLoadMode(uint32_t base, + EPWM_ActionQualifierModule aqModule, + EPWM_ActionQualifierLoadMode loadMode) +{ + uint16_t syncModeOffset; + uint16_t shadowModeOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + syncModeOffset = 8U + (uint16_t)aqModule; + shadowModeOffset = 4U + (uint16_t)aqModule; + + // + // Set the appropriate sync and load mode bits and also enable shadow + // load mode. Shadow to active load can also be frozen. + // + HWREGH(base + EPWM_O_AQCTL) = ((HWREGH(base + EPWM_O_AQCTL) & + (~((0x3U << (uint16_t)aqModule) | + (0x3U << (uint16_t)syncModeOffset))) | + (0x1U << shadowModeOffset)) | + ((((uint16_t)loadMode >> 2U) << + syncModeOffset) | (((uint16_t)loadMode & + 0x3U) << (uint16_t)aqModule))); +} + +//***************************************************************************** +// +//! Disable Action Qualifier shadow load mode +//! +//! \param base is the base address of the EPWM module. +//! \param aqModule is the Action Qualifier module value. +//! +//! This function disables the Action Qualifier shadow load mode. +//! Valid values for the variables are: +//! - aqModule +//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A. +//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableActionQualifierShadowLoadMode(uint32_t base, + EPWM_ActionQualifierModule aqModule) +{ + uint16_t shadowModeOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + shadowModeOffset = 4U + (uint16_t)aqModule; + + // + // Disable shadow load mode. Action qualifier is loaded on + // immediate mode only. + // + HWREGH(base + EPWM_O_AQCTL) &= ~(1U << shadowModeOffset); +} + +//***************************************************************************** +// +//! Set up Action qualifier trigger source for event T1 +//! +//! \param base is the base address of the EPWM module. +//! \param trigger sources for Action Qualifier triggers. +//! +//! This function sets up the sources for Action Qualifier event T1. +//! Valid values for trigger are: +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierT1TriggerSource(uint32_t base, + EPWM_ActionQualifierTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set T1 trigger source + // + HWREGH(base + EPWM_O_AQTSRCSEL) = + ((HWREGH(base + EPWM_O_AQTSRCSEL) & (~EPWM_AQTSRCSEL_T1SEL_M)) | + ((uint16_t)trigger)); +} + +//***************************************************************************** +// +//! Set up Action qualifier trigger source for event T2 +//! +//! \param base is the base address of the EPWM module. +//! \param trigger sources for Action Qualifier triggers. +//! +//! This function sets up the sources for Action Qualifier event T2. +//! Valid values for trigger are: +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3 +//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierT2TriggerSource(uint32_t base, + EPWM_ActionQualifierTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set T2 trigger source + // + HWREGH(base + EPWM_O_AQTSRCSEL) = + ((HWREGH(base + EPWM_O_AQTSRCSEL) & (~EPWM_AQTSRCSEL_T2SEL_M)) | + ((uint16_t)trigger << EPWM_AQTSRCSEL_T2SEL_S)); +} + +//***************************************************************************** +// +//! Set up Action qualifier outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! \param event is the event that causes a change in output. +//! +//! This function sets up the Action Qualifier output on ePWM A or ePWMB, +//! depending on the value of epwmOutput, to a value specified by outPut based +//! on the input events - specified by event. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins +//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High +//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins +//! - event +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO - Time base counter equals +//! zero +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD - Time base counter equals +//! period +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA - Time base counter up equals +//! COMPA +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA - Time base counter down +//! equals COMPA +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB - Time base counter up equals +//! COMPB +//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB - Time base counter down +//! equals COMPB +//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_UP - T1 event on count up +//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN - T1 event on count down +//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_UP - T2 event on count up +//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN - T2 event on count down +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierOutput output, + EPWM_ActionQualifierOutputEvent event) +{ + uint32_t registerOffset; + uint32_t registerTOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerOffset = EPWM_O_AQCTLA + (uint32_t)epwmOutput; + registerTOffset = EPWM_O_AQCTLA2 + (uint32_t)epwmOutput; + + // + // If the event occurs on T1 or T2 events + // + if(((uint16_t)event & 0x1U) == 1U) + { + // + // Write to T1U,T1D,T2U or T2D of AQCTLA2 register + // + HWREGH(base + registerTOffset) = + ((HWREGH(base + registerTOffset) & ~(3U << ((uint16_t)event - 1U))) | + ((uint16_t)output << ((uint16_t)event - 1U))); + } + else + { + // + // Write to ZRO,PRD,CAU,CAD,CBU or CBD bits of AQCTLA register + // + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~(3U << (uint16_t)event)) | + ((uint16_t)output << (uint16_t)event)); + } +} + +//***************************************************************************** +// +//! Set up Action qualifier event outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param action is the desired action when the specified event occurs +//! +//! This function sets up the Action Qualifier output on ePWMA or ePWMB, +//! depending on the value of epwmOutput, to a value specified by action. +//! Valid action param values from different time base counter scenarios +//! should be OR'd together to configure complete action for a pwm output. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! +//! - action +//! - When time base counter equals zero +//! - EPWM_AQ_OUTPUT_NO_CHANGE_ZERO - Time base counter equals zero +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_ZERO - Time base counter equals zero +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_ZERO - Time base counter equals zero +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_ZERO - Time base counter equals zero +//! and toggle the output pins +//! - When time base counter equals period +//! - EPWM_AQ_OUTPUT_NO_CHANGE_PERIOD - Time base counter equals period +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_PERIOD - Time base counter equals period +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_PERIOD - Time base counter equals period +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_PERIOD - Time base counter equals period +//! and toggle the output pins +//! - When time base counter equals CMPA during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPA - Time base counter up equals +//! COMPA and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_CMPA - Time base counter up equals +//! COMPA and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPA - Time base counter up equals +//! COMPA and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPA - Time base counter up equals +//! COMPA and toggle output pins +//! - When time base counter equals CMPA during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPA - Time base counter down equals +//! COMPA and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPA - Time base counter down equals +//! COMPA and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA - Time base counter down equals +//! COMPA and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPA - Time base counter down equals +//! COMPA and toggle output pins +//! - When time base counter equals CMPB during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPB - Time base counter up equals +//! COMPB and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_CMPB - Time base counter up equals +//! COMPB and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPB - Time base counter up equals +//! COMPB and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPB - Time base counter up equals +//! COMPB and toggle output pins +//! - When time base counter equals CMPB during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPB- Time base counter down equals +//! COMPB and no change in the +//! output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPB - Time base counter down equals +//! COMPB and set output pins low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPB - Time base counter down equals +//! COMPB and set output pins high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPB - Time base counter down equals +//! COMPB and toggle output pins +//! +//! \b note: A logical OR of the valid values should be passed as the action +//! parameter. Single action should be configured for each time base +//! counter scenario. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierActionComplete(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + uint16_t action) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerOffset = EPWM_O_AQCTLA + (uint32_t)epwmOutput; + + // + // Write to ZRO, PRD, CAU, CAD, CBU or CBD bits of AQCTLA register + // + HWREGH(base + registerOffset) = (uint16_t)action; +} + +//***************************************************************************** +// +//! Set up Additional action qualifier event outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param action is the desired action when the specified event occurs +//! +//! This function sets up the Additional Action Qualifier output on ePWMA or +//! ePWMB depending on the value of epwmOutput, to a value specified by action. +//! Valid action param values from different event scenarios should be OR'd +//! together to configure complete action for a pwm output. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - action +//! - When T1 event occurs during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T1 - T1 event on count up +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_T1 - T1 event on count up +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_UP_T1 - T1 event on count up +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T1 - T1 event on count up +//! and toggle the output pins +//! - When T1 event occurs during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T1- T1 event on count down +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_T1 - T1 event on count down +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T1 - T1 event on count down +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T1 - T1 event on count down +//! and toggle the output pins +//! - When T2 event occurs during up-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T2 - T2 event on count up +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_UP_T2 - T2 event on count up +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_UP_T2 - T2 event on count up +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T2 - T2 event on count up +//! and toggle the output pins +//! - When T2 event occurs during down-count +//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T2 - T2 event on count down +//! and no change in output pins +//! - EPWM_AQ_OUTPUT_LOW_DOWN_T2 - T2 event on count down +//! and set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T2 - T2 event on count down +//! and set output pins to high +//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T2 - T2 event on count down +//! and toggle the output pins +//! +//! \b note: A logical OR of the valid values should be passed as the action +//! parameter. Single action should be configured for each event +//! scenario. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setAdditionalActionQualifierActionComplete(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + uint16_t action) +{ + uint32_t registerTOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the register offset + // + registerTOffset = EPWM_O_AQCTLA2 + (uint32_t)epwmOutput; + + // + // Write to T1U, T1D, T2U or T2D of AQCTLA2 register + // + HWREGH(base + registerTOffset) = (uint16_t)action; +} + +//***************************************************************************** +// +//! Sets up Action qualifier continuous software load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param mode is the mode for shadow to active load mode. +//! +//! This function sets up the AQCFRSC register load mode for continuous +//! software force reload mode. The software force actions are determined by +//! the EPWM_setActionQualifierContSWForceAction() function. +//! Valid values for mode are: +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO - shadow mode load when counter +//! equals zero +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_PERIOD - shadow mode load when counter +//! equals period +//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD - shadow mode load when counter +//! equals zero or period +//! - EPWM_AQ_SW_IMMEDIATE_LOAD - immediate mode load only +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierContSWForceShadowMode(uint32_t base, + EPWM_ActionQualifierContForce mode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Action qualifier software action reload mode. + // Write to RLDCSF bit + // + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_RLDCSF_M) | + ((uint16_t)mode << EPWM_AQSFRC_RLDCSF_S)); +} + +//***************************************************************************** +// +//! Triggers a continuous software forced event. +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! +//! This function triggers a continuous software forced Action Qualifier output +//! on ePWM A or B based on the value of epwmOutput. +//! Valid values for the parameters are: +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_SW_DISABLED - Software forcing disabled. +//! - EPWM_AQ_SW_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_SW_OUTPUT_HIGH - Set output pins to High +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierContSWForceAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierSWOutput output) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Initiate a continuous software forced output + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQCSFRC) = + ((HWREGH(base + EPWM_O_AQCSFRC) & ~EPWM_AQCSFRC_CSFA_M) | + ((uint16_t)output)); + } + else + { + HWREGH(base + EPWM_O_AQCSFRC) = + ((HWREGH(base + EPWM_O_AQCSFRC) & ~EPWM_AQCSFRC_CSFB_M) | + ((uint16_t)output << EPWM_AQCSFRC_CSFB_S)) ; + } +} + +//***************************************************************************** +// +//! Set up one time software forced Action qualifier outputs +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! \param output is the Action Qualifier output. +//! +//! This function sets up the one time software forced Action Qualifier output +//! on ePWM A or ePWMB, depending on the value of epwmOutput to a value +//! specified by outPut. +//! The following are valid values for the parameters. +//! - epwmOutput +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! - output +//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins +//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low +//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High +//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setActionQualifierSWAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput, + EPWM_ActionQualifierOutput output) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the one time software forced action + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_ACTSFA_M) | + ((uint16_t)output)); + } + else + { + HWREGH(base + EPWM_O_AQSFRC) = + ((HWREGH(base + EPWM_O_AQSFRC) & ~EPWM_AQSFRC_ACTSFB_M) | + ((uint16_t)output << EPWM_AQSFRC_ACTSFB_S)); + } +} + +//***************************************************************************** +// +//! Triggers a one time software forced event on Action qualifier +//! +//! \param base is the base address of the EPWM module. +//! \param epwmOutput is the ePWM pin type. +//! +//! This function triggers a one time software forced Action Qualifier event +//! on ePWM A or B based on the value of epwmOutput. +//! Valid values for epwmOutput are: +//! - EPWM_AQ_OUTPUT_A - ePWMxA output +//! - EPWM_AQ_OUTPUT_B - ePWMxB output +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceActionQualifierSWAction(uint32_t base, + EPWM_ActionQualifierOutputModule epwmOutput) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Initiate a software forced event + // + if(epwmOutput == EPWM_AQ_OUTPUT_A) + { + HWREGH(base + EPWM_O_AQSFRC) |= EPWM_AQSFRC_OTSFA; + } + else + { + HWREGH(base + EPWM_O_AQSFRC) |= EPWM_AQSFRC_OTSFB; + } +} + +// +// Dead Band Module related APIs +// +//***************************************************************************** +// +//! Sets Dead Band signal output swap mode. +//! +//! \param base is the base address of the EPWM module. +//! \param output is the ePWM Dead Band output. +//! \param enableSwapMode is the output swap mode. +//! +//! This function sets up the output signal swap mode. For example if the +//! output variable is set to EPWM_DB_OUTPUT_A and enableSwapMode is true, then +//! the ePWM A output gets its signal from the ePWM B signal path. Valid values +//! for the input variables are: +//! - output +//! - EPWM_DB_OUTPUT_A - ePWM output A +//! - EPWM_DB_OUTPUT_B - ePWM output B +//! - enableSwapMode +//! - true - the output is swapped +//! - false - the output and the signal path are the same. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandOutputSwapMode(uint32_t base, EPWM_DeadBandOutput output, + bool enableSwapMode) +{ + uint16_t mask; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + mask = (uint16_t)1U << ((uint16_t)output + EPWM_DBCTL_OUTSWAP_S); + + if(enableSwapMode) + { + // + // Set the appropriate outswap bit to swap output + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) | mask); + } + else + { + // + // Clear the appropriate outswap bit to disable output swap + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) & ~mask); + } +} + +//***************************************************************************** +// +//! Sets Dead Band signal output mode. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Dead Band delay type. +//! \param enableDelayMode is the dead band delay mode. +//! +//! This function sets up the dead band delay mode. The delayMode variable +//! determines if the applied delay is Rising Edge or Falling Edge. The +//! enableDelayMode determines if a dead band delay should be applied. +//! Valid values for the variables are: +//! - delayMode +//! - EPWM_DB_RED - Rising Edge delay +//! - EPWM_DB_FED - Falling Edge delay +//! - enableDelayMode +//! - true - Falling edge or Rising edge delay is applied. +//! - false - Dead Band delay is bypassed. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandDelayMode(uint32_t base, EPWM_DeadBandDelayMode delayMode, + bool enableDelayMode) +{ + uint16_t mask; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + mask = (uint16_t)1U << ((uint16_t)delayMode + EPWM_DBCTL_OUT_MODE_S); + + if(enableDelayMode) + { + // + // Set the appropriate outmode bit to enable Dead Band delay + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) | mask); + } + else + { + // + // Clear the appropriate outswap bit to disable output swap + // + HWREGH(base + EPWM_O_DBCTL) = (HWREGH(base + EPWM_O_DBCTL) & ~ mask); + } +} + +//***************************************************************************** +// +//! Sets Dead Band delay polarity. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Dead Band delay type. +//! \param polarity is the polarity of the delayed signal. +//! +//! This function sets up the polarity as determined by the variable polarity +//! of the Falling Edge or Rising Edge delay depending on the value of +//! delayMode. Valid values for the variables are: +//! - delayMode +//! - EPWM_DB_RED - Rising Edge delay +//! - EPWM_DB_FED - Falling Edge delay +//! - polarity +//! - EPWM_DB_POLARITY_ACTIVE_HIGH - polarity is not inverted. +//! - EPWM_DB_POLARITY_ACTIVE_LOW - polarity is inverted. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandDelayPolarity(uint32_t base, + EPWM_DeadBandDelayMode delayMode, + EPWM_DeadBandPolarity polarity) +{ + uint16_t shift; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + shift = (((uint16_t)delayMode ^ 0x1U) + EPWM_DBCTL_POLSEL_S); + + // + // Set the appropriate polsel bits for dead band polarity + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~ (1U << shift)) | + ((uint16_t)polarity << shift)); +} + +//***************************************************************************** +// +//! Sets Rising Edge Dead Band delay input. +//! +//! \param base is the base address of the EPWM module. +//! \param input is the input signal to the dead band. +//! +//! This function sets up the rising Edge delay input signal. +//! Valid values for input are: +//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA( Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB( Valid for both Falling +//! Edge and Rising Edge) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDeadBandDelayInput(uint32_t base, uint16_t input) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((input == EPWM_DB_INPUT_EPWMA) || + (input == EPWM_DB_INPUT_EPWMB)); + + // + // Set the Rising Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~(1U << (EPWM_DBCTL_IN_MODE_S))) | + (input << EPWM_DBCTL_IN_MODE_S)); +} + +//***************************************************************************** +// +//! Sets Dead Band delay input. +//! +//! \param base is the base address of the EPWM module. +//! \param input is the input signal to the dead band. +//! +//! This function sets up the rising Edge delay input signal. +//! Valid values for input are: +//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA(Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB(Valid for both Falling +//! Edge and Rising Edge) +//! - EPWM_DB_INPUT_DB_RED - Input signal is the output of Rising +//! Edge delay. +//! (Valid only for Falling Edge delay) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDeadBandDelayInput(uint32_t base, uint16_t input) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((input == EPWM_DB_INPUT_EPWMA) || + (input == EPWM_DB_INPUT_EPWMB) || + (input == EPWM_DB_INPUT_DB_RED)); + + if(input == EPWM_DB_INPUT_DB_RED) + { + // + // Set the Falling Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) |= EPWM_DBCTL_DEDB_MODE; + } + else + { + // + // Set the Falling Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) &= ~EPWM_DBCTL_DEDB_MODE; + + // + // Set the Rising Edge Delay input + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~(1U << (EPWM_DBCTL_IN_MODE_S + 1U))) | + (input << (EPWM_DBCTL_IN_MODE_S + 1U))); + } +} + +//***************************************************************************** +// +//! Set the Dead Band control shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load mode. +//! +//! This function enables and sets the Dead Band control register shadow +//! load mode. +//! Valid values for the \e loadMode parameter are: +//! - EPWM_DB_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_DB_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_DB_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_DB_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandControlShadowLoadMode(uint32_t base, + EPWM_DeadBandControlLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode and setup the load event + // + HWREGH(base + EPWM_O_DBCTL2) = + ((HWREGH(base + EPWM_O_DBCTL2) & ~EPWM_DBCTL2_LOADDBCTLMODE_M) | + (EPWM_DBCTL2_SHDWDBCTLMODE | (uint16_t)loadMode)); +} + +//***************************************************************************** +// +//! Disable Dead Band control shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Dead Band control register shadow +//! load mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDeadBandControlShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow load mode. Only immediate load mode only. + // + HWREGH(base + EPWM_O_DBCTL2) = + (HWREGH(base + EPWM_O_DBCTL2) & ~EPWM_DBCTL2_SHDWDBCTLMODE); +} + +//***************************************************************************** +// +//! Set the RED (Rising Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load event. +//! +//! This function sets the Rising Edge Delay register shadow load mode. +//! Valid values for the \e loadMode parameter are: +//! - EPWM_RED_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_RED_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_RED_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDelayCountShadowLoadMode(uint32_t base, + EPWM_RisingEdgeDelayLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode. Set-up the load mode + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_LOADREDMODE_M) | + ((uint16_t)EPWM_DBCTL_SHDWDBREDMODE | + ((uint16_t)loadMode << EPWM_DBCTL_LOADREDMODE_S))); + +} + +//***************************************************************************** +// +//! Disable the RED (Rising Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Rising Edge Delay register shadow load mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableRisingEdgeDelayCountShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow mode. + // + HWREGH(base + EPWM_O_DBCTL) = + (HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_SHDWDBREDMODE); + +} + +//***************************************************************************** +// +//! Set the FED (Falling Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadMode is the shadow to active load event. +//! +//! This function enables and sets the Falling Edge Delay register shadow load +//! mode. Valid values for the \e loadMode parameters are: +//! - EPWM_FED_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - EPWM_FED_LOAD_ON_CNTR_PERIOD - load when counter equals period. +//! - EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period. +//! - EPWM_FED_LOAD_FREEZE - Freeze shadow to active load. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDelayCountShadowLoadMode(uint32_t base, + EPWM_FallingEdgeDelayLoadMode loadMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable the shadow mode. Setup the load mode. + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_LOADFEDMODE_M) | + (EPWM_DBCTL_SHDWDBFEDMODE | + ((uint16_t)loadMode << EPWM_DBCTL_LOADFEDMODE_S))); + +} + +//***************************************************************************** +// +//! Disables the FED (Falling Edge Delay) shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Falling Edge Delay register shadow load mode. +//! Valid values for the parameters are: +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableFallingEdgeDelayCountShadowLoadMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable the shadow mode. + // + HWREGH(base + EPWM_O_DBCTL) = + (HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_SHDWDBFEDMODE); +} + +//***************************************************************************** +// +//! Sets Dead Band Counter clock rate. +//! +//! \param base is the base address of the EPWM module. +//! \param clockMode is the Dead Band counter clock mode. +//! +//! This function sets up the Dead Band counter clock rate with respect to +//! TBCLK (ePWM time base counter). +//! Valid values for clockMode are: +//! - EPWM_DB_COUNTER_CLOCK_FULL_CYCLE -Dead band counter runs at TBCLK +//! (ePWM Time Base Counter) rate. +//! - EPWM_DB_COUNTER_CLOCK_HALF_CYCLE -Dead band counter runs at 2*TBCLK +//! (twice ePWM Time Base Counter)rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDeadBandCounterClock(uint32_t base, + EPWM_DeadBandClockMode clockMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the DB clock mode + // + HWREGH(base + EPWM_O_DBCTL) = + ((HWREGH(base + EPWM_O_DBCTL) & ~EPWM_DBCTL_HALFCYCLE) | + ((uint16_t)clockMode << 15U)); +} + +//***************************************************************************** +// +//! Set ePWM RED count +//! +//! \param base is the base address of the EPWM module. +//! \param redCount is the RED(Rising Edge Delay) count. +//! +//! This function sets the RED (Rising Edge Delay) count value. +//! The value of redCount should be less than 0x4000U. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setRisingEdgeDelayCount(uint32_t base, uint16_t redCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(redCount < 0x4000U); + + // + // Set the RED (Rising Edge Delay) count + // + HWREGH(base + EPWM_O_DBRED) = redCount; +} + +//***************************************************************************** +// +//! Set ePWM FED count +//! +//! \param base is the base address of the EPWM module. +//! \param fedCount is the FED(Falling Edge Delay) count. +//! +//! This function sets the FED (Falling Edge Delay) count value. +//! The value of fedCount should be less than 0x4000U. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setFallingEdgeDelayCount(uint32_t base, uint16_t fedCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(fedCount < 0x4000U); + + // + // Set the RED (Rising Edge Delay) count + // + HWREGH(base + EPWM_O_DBFED) = fedCount; +} + +// +// Chopper module related APIs +// +//***************************************************************************** +// +//! Enable chopper mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables ePWM chopper module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableChopper(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set CHPEN bit. Enable Chopper + // + HWREGH(base + EPWM_O_PCCTL) |= EPWM_PCCTL_CHPEN; +} + +//***************************************************************************** +// +//! Disable chopper mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables ePWM chopper module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableChopper(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear CHPEN bit. Disable Chopper + // + HWREGH(base + EPWM_O_PCCTL) &= ~EPWM_PCCTL_CHPEN; +} + +//***************************************************************************** +// +//! Set chopper duty cycle. +//! +//! \param base is the base address of the EPWM module. +//! \param dutyCycleCount is the chopping clock duty cycle count. +//! +//! This function sets the chopping clock duty cycle. The value of +//! dutyCycleCount should be less than 7. The dutyCycleCount value is converted +//! to the actual chopper duty cycle value base on the following equation: +//! chopper duty cycle = (dutyCycleCount + 1) / 8 +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperDutyCycle(uint32_t base, uint16_t dutyCycleCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(dutyCycleCount < 7U); + + // + // Set the chopper duty cycle + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & ~EPWM_PCCTL_CHPDUTY_M) | + (dutyCycleCount << EPWM_PCCTL_CHPDUTY_S)); +} + +//***************************************************************************** +// +//! Set chopper clock frequency scaler. +//! +//! \param base is the base address of the EPWM module. +//! \param freqDiv is the chopping clock frequency divider. +//! +//! This function sets the scaler for the chopping clock frequency. The value +//! of freqDiv should be less than 8. The chopping clock frequency is altered +//! based on the following equation. +//! chopper clock frequency = SYSCLKOUT / ( 1 + freqDiv) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperFreq(uint32_t base, uint16_t freqDiv) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(freqDiv < 8U); + + // + // Set the chopper clock + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & + ~(uint16_t)EPWM_PCCTL_CHPFREQ_M) | + (freqDiv << EPWM_PCCTL_CHPFREQ_S)); +} + +//***************************************************************************** +// +//! Set chopper clock frequency scaler. +//! +//! \param base is the base address of the EPWM module. +//! \param firstPulseWidth is the width of the first pulse. +//! +//! This function sets the first pulse width of chopper output waveform. The +//! value of firstPulseWidth should be less than 0x10. The value of the first +//! pulse width in seconds is given using the following equation: +//! first pulse width = 1 / (((firstPulseWidth + 1) * SYSCLKOUT)/8) +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setChopperFirstPulseWidth(uint32_t base, uint16_t firstPulseWidth) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(firstPulseWidth < 16U); + + // + // Set the chopper clock + // + HWREGH(base + EPWM_O_PCCTL) = + ((HWREGH(base + EPWM_O_PCCTL) & + ~(uint16_t)EPWM_PCCTL_OSHTWTH_M) | + (firstPulseWidth << EPWM_PCCTL_OSHTWTH_S)); +} + +// +// Trip Zone module related APIs +// +//***************************************************************************** +// +//! Enables Trip Zone signal. +//! +//! \param base is the base address of the EPWM module. +//! \param tzSignal is the Trip Zone signal. +//! +//! This function enables the Trip Zone signals specified by tzSignal as a +//! source for the Trip Zone module. +//! Valid values for tzSignal are: +//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1 +//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2 +//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3 +//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4 +//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5 +//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6 +//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1 +//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1 +//! +//! \b note: A logical OR of the valid values can be passed as the tzSignal +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneSignals(uint32_t base, uint16_t tzSignal) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the trip zone bits + // + EALLOW; + HWREGH(base + EPWM_O_TZSEL) |= tzSignal; + EDIS; +} + +//***************************************************************************** +// +//! Disables Trip Zone signal. +//! +//! \param base is the base address of the EPWM module. +//! \param tzSignal is the Trip Zone signal. +//! +//! This function disables the Trip Zone signal specified by tzSignal as a +//! source for the Trip Zone module. +//! Valid values for tzSignal are: +//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle +//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1 +//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2 +//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3 +//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4 +//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5 +//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6 +//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1 +//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1 +//! +//! \b note: A logical OR of the valid values can be passed as the tzSignal +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableTripZoneSignals(uint32_t base, uint16_t tzSignal) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear the trip zone bits + // + EALLOW; + HWREGH(base + EPWM_O_TZSEL) &= ~tzSignal; + EDIS; +} + +//***************************************************************************** +// +//! Set Digital compare conditions that cause Trip Zone event. +//! +//! \param base is the base address of the EPWM module. +//! \param dcType is the Digital compare output type. +//! \param dcEvent is the Digital Compare output event. +//! +//! This function sets up the Digital Compare output Trip Zone event sources. +//! The dcType variable specifies the event source to be whether Digital +//! Compare output A or Digital Compare output B. The dcEvent parameter +//! specifies the event that causes Trip Zone. +//! Valid values for the parameters are: +//! - dcType +//! - EPWM_TZ_DC_OUTPUT_A1 - Digital Compare output 1 A +//! - EPWM_TZ_DC_OUTPUT_A2 - Digital Compare output 2 A +//! - EPWM_TZ_DC_OUTPUT_B1 - Digital Compare output 1 B +//! - EPWM_TZ_DC_OUTPUT_B2 - Digital Compare output 2 B +//! - dcEvent +//! - EPWM_TZ_EVENT_DC_DISABLED - Event Trigger is disabled +//! - EPWM_TZ_EVENT_DCXH_LOW - Trigger event when DCxH low +//! - EPWM_TZ_EVENT_DCXH_HIGH - Trigger event when DCxH high +//! - EPWM_TZ_EVENT_DCXL_LOW - Trigger event when DCxL low +//! - EPWM_TZ_EVENT_DCXL_HIGH - Trigger event when DCxL high +//! - EPWM_TZ_EVENT_DCXL_HIGH_DCXH_LOW - Trigger event when DCxL high +//! DCxH low +//! +//! \note x in DCxH/DCxL represents DCAH/DCAL or DCBH/DCBL +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneDigitalCompareEventCondition(uint32_t base, + EPWM_TripZoneDigitalCompareOutput dcType, + EPWM_TripZoneDigitalCompareOutputEvent dcEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set Digital Compare Events conditions that cause a Digital Compare trip + // + EALLOW; + HWREGH(base + EPWM_O_TZDCSEL) = + ((HWREGH(base + EPWM_O_TZDCSEL) & ~(0x7U << (uint16_t)dcType)) | + ((uint16_t)dcEvent << (uint16_t)dcType)); + EDIS; +} + +//***************************************************************************** +// +//! Enable advanced Trip Zone event Action. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the advanced actions of the Trip Zone events. The +//! advanced features combine the trip zone events with the direction of the +//! counter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneAdvAction(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable Advanced feature. Set ETZE bit + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Disable advanced Trip Zone event Action. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the advanced actions of the Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableTripZoneAdvAction(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable Advanced feature. clear ETZE bit + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) &= ~EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Trip Zone Action. +//! +//! \param base is the base address of the EPWM module. +//! \param tzEvent is the Trip Zone event type. +//! \param tzAction is the Trip zone Action. +//! +//! This function sets the Trip Zone Action to be taken when a Trip Zone event +//! occurs. +//! Valid values for the parameters are: +//! - tzEvent +//! - EPWM_TZ_ACTION_EVENT_DCBEVT2 - DCBEVT2 (Digital Compare B event 2) +//! - EPWM_TZ_ACTION_EVENT_DCBEVT1 - DCBEVT1 (Digital Compare B event 1) +//! - EPWM_TZ_ACTION_EVENT_DCAEVT2 - DCAEVT2 (Digital Compare A event 2) +//! - EPWM_TZ_ACTION_EVENT_DCAEVT1 - DCAEVT1 (Digital Compare A event 1) +//! - EPWM_TZ_ACTION_EVENT_TZB - TZ1 - TZ6, DCBEVT2, DCBEVT1 +//! - EPWM_TZ_ACTION_EVENT_TZA - TZ1 - TZ6, DCAEVT2, DCAEVT1 +//! - tzAction +//! - EPWM_TZ_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ACTION_HIGH - high output +//! - EPWM_TZ_ACTION_LOW - low low +//! - EPWM_TZ_ACTION_DISABLE - disable action +//! +//! \note Disable the advanced Trip Zone event using +//! EPWM_disableTripZoneAdvAction() before calling this function. +//! \note This function operates on both ePWMA and ePWMB depending on the +//! tzEvent parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAction(uint32_t base, EPWM_TripZoneEvent tzEvent, + EPWM_TripZoneAction tzAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL) = + ((HWREGH(base + EPWM_O_TZCTL) & ~(0x3U << (uint16_t)tzEvent)) | + ((uint16_t)tzAction << (uint16_t)tzEvent)) ; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Trip Zone Action. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvEvent is the Trip Zone event type. +//! \param tzAdvAction is the Trip zone Action. +//! +//! This function sets the Advanced Trip Zone Action to be taken when an +//! advanced Trip Zone event occurs. +//! +//! Valid values for the parameters are: +//! - tzAdvEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_D - TZ1 - TZ6, DCBEVT2, DCBEVT1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_U - TZ1 - TZ6, DCBEVT2, DCBEVT1 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_D - TZ1 - TZ6, DCAEVT2, DCAEVT1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_U - TZ1 - TZ6, DCAEVT2, DCAEVT1 while +//! counting up +//! - tzAdvAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note This function operates on both ePWMA and ePWMB depending on the +//! tzAdvEvent parameter. +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAdvAction(uint32_t base, EPWM_TripZoneAdvancedEvent tzAdvEvent, + EPWM_TripZoneAdvancedAction tzAdvAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTL2) = + ((HWREGH(base + EPWM_O_TZCTL2) & ~(0x7U << (uint16_t)tzAdvEvent)) | + ((uint16_t)tzAdvAction << (uint16_t)tzAdvEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Digital Compare Trip Zone Action on ePWMA. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type. +//! \param tzAdvDCAction is the Digital Compare Trip zone Action. +//! +//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be +//! taken on ePWMA when an advanced Digital Compare Trip Zone A event occurs. +//! Valid values for the parameters are: +//! - tzAdvDCEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event A2 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event A2 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event A1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event A1 while +//! counting up +//! - tzAdvDCAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Digital Compare Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setTripZoneAdvDigitalCompareActionA(uint32_t base, + EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent, + EPWM_TripZoneAdvancedAction tzAdvDCAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTLDCA) = + ((HWREGH(base + EPWM_O_TZCTLDCA) & ~(0x7U << (uint16_t)tzAdvDCEvent)) | + ((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Set Advanced Digital Compare Trip Zone Action on ePWMB. +//! +//! \param base is the base address of the EPWM module. +//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type. +//! \param tzAdvDCAction is the Digital Compare Trip zone Action. +//! +//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be +//! taken on ePWMB when an advanced Digital Compare Trip Zone B event occurs. +//! Valid values for the parameters are: +//! - tzAdvDCEvent +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event B2 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event B2 while +//! counting up +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event B1 while +//! counting down +//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event B1 while +//! counting up +//! - tzAdvDCAction +//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output +//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state +//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state +//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output +//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action +//! +//! \note This function enables the advanced Trip Zone event. +//! +//! \note Advanced Trip Zone events take into consideration the direction of +//! the counter in addition to Digital Compare Trip Zone events. +//! +//! \return None. +// +//***************************************************************************** +static inline void EPWM_setTripZoneAdvDigitalCompareActionB(uint32_t base, + EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent, + EPWM_TripZoneAdvancedAction tzAdvDCAction) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Advanced Action for Trip Zone events + // + EALLOW; + HWREGH(base + EPWM_O_TZCTLDCB) = + ((HWREGH(base + EPWM_O_TZCTLDCB) & ~(0x7U << (uint16_t)tzAdvDCEvent)) | + ((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent)); + + HWREGH(base + EPWM_O_TZCTL2) |= EPWM_TZCTL2_ETZE; + EDIS; +} + +//***************************************************************************** +// +//! Enable Trip Zone interrupts. +//! +//! \param base is the base address of the EPWM module. +//! \param tzInterrupt is the Trip Zone interrupt. +//! +//! This function enables the Trip Zone interrupts. +//! Valid values for tzInterrupt are: +//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt +//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt +//! +//! \b note: A logical OR of the valid values can be passed as the tzInterrupt +//! parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzInterrupt > 0U) && (tzInterrupt <= 0x80U)); + + // + // Enable Trip zone interrupts + // + EALLOW; + HWREGH(base + EPWM_O_TZEINT) |= tzInterrupt; + EDIS; +} + +//***************************************************************************** +// +//! Disable Trip Zone interrupts. +//! +//! \param base is the base address of the EPWM module. +//! \param tzInterrupt is the Trip Zone interrupt. +//! +//! This function disables the Trip Zone interrupts. +//! Valid values for tzInterrupt are: +//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt +//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt +//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt +//! +//! \b note: A logical OR of the valid values can be passed as the tzInterrupt +//! parameter. +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_disableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzInterrupt > 0U) && (tzInterrupt <= 0x80U)); + + // + // Disable Trip zone interrupts + // + EALLOW; + HWREGH(base + EPWM_O_TZEINT) &= ~tzInterrupt; + EDIS; +} + +//***************************************************************************** +// +//! Gets the Trip Zone status flag +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the Trip Zone status flag. +//! +//! \return The function returns the following or the bitwise OR value +//! of the following values. +//! - EPWM_TZ_INTERRUPT - Trip Zone interrupt was generated +//! due to the following TZ events. +//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle event status flag +//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot event status flag +//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 status flag +//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 status flag +//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 status flag +//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 status flag +// +//*************************************************************************** +static inline uint16_t +EPWM_getTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZFLG) & 0x7FU); +} + +//***************************************************************************** +// +//! Gets the Trip Zone Cycle by Cycle flag status +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the specific Cycle by Cycle Trip Zone flag +//! status. +//! +//! \return The function returns the following values. +//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 status flag +//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 status flag +//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 status flag +//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 status flag +//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 status flag +//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 status flag +//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC status flag for Digital compare +//! event A2 +//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC status flag for Digital compare +//! event B2 +// +//*************************************************************************** +static inline uint16_t +EPWM_getCycleByCycleTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Cycle By Cycle Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZCBCFLG) & 0xFFU); +} + +//***************************************************************************** +// +//! Gets the Trip Zone One Shot flag status +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the specific One Shot Trip Zone flag status. +//! +//! \return The function returns the bitwise OR of the following flags. +//! - EPWM_TZ_OST_FLAG_OST1 - OST status flag for OST1 +//! - EPWM_TZ_OST_FLAG_OST2 - OST status flag for OST2 +//! - EPWM_TZ_OST_FLAG_OST3 - OST status flag for OST3 +//! - EPWM_TZ_OST_FLAG_OST4 - OST status flag for OST4 +//! - EPWM_TZ_OST_FLAG_OST5 - OST status flag for OST5 +//! - EPWM_TZ_OST_FLAG_OST6 - OST status flag for OST6 +//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST status flag for Digital +//! compare event A1 +//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST status flag for Digital +//! compare event B1 +// +//*************************************************************************** +static inline uint16_t +EPWM_getOneShotTripZoneFlagStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the One Shot Trip zone flag status + // + return(HWREGH(base + EPWM_O_TZOSTFLG) & 0xFFU); +} + +//***************************************************************************** +// +//! Set the Trip Zone CBC pulse clear event. +//! +//! \param base is the base address of the EPWM module. +//! \param clearEvent is the CBC trip zone clear event. +//! +//! This function set the event which automatically clears the +//! CBC (Cycle by Cycle) latch. +//! Valid values for clearEvent are: +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO - Clear CBC pulse when counter +//! equals zero +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_PERIOD - Clear CBC pulse when counter +//! equals period +//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD - Clear CBC pulse when counter +//! equals zero or period +//! +//! \return None. +// +//************************************************************************** +static inline void +EPWM_selectCycleByCycleTripZoneClearEvent(uint32_t base, + EPWM_CycleByCycleTripZoneClearMode clearEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Cycle by Cycle Trip Latch mode + // + EALLOW; + HWREGH(base + EPWM_O_TZCLR) = + ((HWREGH(base + EPWM_O_TZCLR) & ~EPWM_TZCLR_CBCPULSE_M) | + ((uint16_t)clearEvent << EPWM_TZCLR_CBCPULSE_S)); + EDIS; +} + +//***************************************************************************** +// +//! Clear Trip Zone flag +//! +//! \param base is the base address of the EPWM module. +//! \param tzFlags is the Trip Zone flags. +//! +//! This function clears the Trip Zone flags +//! Valid values for tzFlags are: +//! - EPWM_TZ_INTERRUPT - Global Trip Zone interrupt flag +//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle flag +//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot flag +//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 flag +//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 flag +//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 flag +//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 flag +//! +//! \b note: A bitwise OR of the valid values can be passed as the tzFlags +//! parameter. +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearTripZoneFlag(uint32_t base, uint16_t tzFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzFlags <= 0x80U); + + // + // Clear Trip zone event flag + // + EALLOW; + HWREGH(base + EPWM_O_TZCLR) |= tzFlags; + EDIS; +} + +//***************************************************************************** +// +//! Clear the Trip Zone Cycle by Cycle flag. +//! +//! \param base is the base address of the EPWM module. +//! \param tzCBCFlags is the CBC flag to be cleared. +//! +//! This function clears the specific Cycle by Cycle Trip Zone flag. +//! The following are valid values for tzCBCFlags. +//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 flag +//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 flag +//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 flag +//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 flag +//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 flag +//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 flag +//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC flag Digital compare +//! event A2 +//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC flag Digital compare +//! event B2 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearCycleByCycleTripZoneFlag(uint32_t base, uint16_t tzCBCFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzCBCFlags < 0x800U); + + // + // Clear the Cycle By Cycle Trip zone flag + // + EALLOW; + HWREGH(base + EPWM_O_TZCBCCLR) |= tzCBCFlags; + EDIS; +} + +//***************************************************************************** +// +//! Clear the Trip Zone One Shot flag. +//! +//! \param base is the base address of the EPWM module. +//! \param tzOSTFlags is the OST flags to be cleared. +//! +//! This function clears the specific One Shot (OST) Trip Zone flag. +//! The following are valid values for tzOSTFlags. +//! - EPWM_TZ_OST_FLAG_OST1 - OST flag for OST1 +//! - EPWM_TZ_OST_FLAG_OST2 - OST flag for OST2 +//! - EPWM_TZ_OST_FLAG_OST3 - OST flag for OST3 +//! - EPWM_TZ_OST_FLAG_OST4 - OST flag for OST4 +//! - EPWM_TZ_OST_FLAG_OST5 - OST flag for OST5 +//! - EPWM_TZ_OST_FLAG_OST6 - OST flag for OST6 +//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST flag for Digital compare event A1 +//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST flag for Digital compare event B1 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_clearOneShotTripZoneFlag(uint32_t base, uint16_t tzOSTFlags) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(tzOSTFlags < 0x800U); + + // + // Clear the Cycle By Cycle Trip zone flag + // + EALLOW; + HWREGH(base + EPWM_O_TZOSTCLR) |= tzOSTFlags; + EDIS; +} + +//***************************************************************************** +// +//! Force Trip Zone events. +//! +//! \param base is the base address of the EPWM module. +//! \param tzForceEvent is the forced Trip Zone event. +//! +//! This function forces a Trip Zone event. +//! Valid values for tzForceEvent are: +//! - EPWM_TZ_FORCE_EVENT_CBC - Force Trip Zones Cycle By Cycle event +//! - EPWM_TZ_FORCE_EVENT_OST - Force Trip Zones One Shot Event +//! - EPWM_TZ_FORCE_EVENT_DCAEVT1 - Force Digital Compare A Event 1 +//! - EPWM_TZ_FORCE_EVENT_DCAEVT2 - Force Digital Compare A Event 2 +//! - EPWM_TZ_FORCE_EVENT_DCBEVT1 - Force Digital Compare B Event 1 +//! - EPWM_TZ_FORCE_EVENT_DCBEVT2 - Force Digital Compare B Event 2 +//! +//! \return None. +// +//*************************************************************************** +static inline void +EPWM_forceTripZoneEvent(uint32_t base, uint16_t tzForceEvent) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((tzForceEvent & 0xFF81U)== 0U); + + // + // Force a Trip Zone event + // + EALLOW; + HWREGH(base + EPWM_O_TZFRC) |= tzForceEvent; + EDIS; +} + +// +// Event Trigger related APIs +// +//***************************************************************************** +// +//! Enable ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the ePWM interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable ePWM interrupt + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_INTEN; +} + +//***************************************************************************** +// +//! disable ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the ePWM interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable ePWM interrupt + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_INTEN; +} + +//***************************************************************************** +// +//! Sets the ePWM interrupt source. +//! +//! \param base is the base address of the EPWM module. +//! \param interruptSource is the ePWM interrupt source. +//! +//! This function sets the ePWM interrupt source. +//! Valid values for interruptSource are: +//! - EPWM_INT_TBCTR_DISABLED - Time-base counter is disabled +//! - EPWM_INT_TBCTR_ZERO - Time-base counter equal to zero +//! - EPWM_INT_TBCTR_PERIOD - Time-base counter equal to period +//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_INT_TBCTR_U_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD (depending the value of x) +//! when the timer is incrementing +//! - EPWM_INT_TBCTR_D_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD (depending the value of x) +//! when the timer is decrementing +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptSource(uint32_t base, uint16_t interruptSource) +{ + uint16_t intSource; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(((interruptSource > 0U) && (interruptSource < 9U)) || + (interruptSource == 10U) || (interruptSource == 12U) || + (interruptSource == 14U)); + + if((interruptSource == EPWM_INT_TBCTR_U_CMPC) || + (interruptSource == EPWM_INT_TBCTR_U_CMPD) || + (interruptSource == EPWM_INT_TBCTR_D_CMPC) || + (interruptSource == EPWM_INT_TBCTR_D_CMPD)) + { + // + // Shift the interrupt source by 1 + // + intSource = interruptSource >> 1U; + + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_INTSELCMP; + } + else if((interruptSource == EPWM_INT_TBCTR_U_CMPA) || + (interruptSource == EPWM_INT_TBCTR_U_CMPB) || + (interruptSource == EPWM_INT_TBCTR_D_CMPA) || + (interruptSource == EPWM_INT_TBCTR_D_CMPB)) + { + intSource = interruptSource; + + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_INTSELCMP; + } + else + { + intSource = interruptSource; + } + + // + // Set the interrupt source + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_INTSEL_M) | intSource); +} + +//***************************************************************************** +// +//! Sets the ePWM interrupt event counts. +//! +//! \param base is the base address of the EPWM module. +//! \param eventCount is the event count for interrupt scale +//! +//! This function sets the interrupt event count that determines the number of +//! events that have to occur before an interrupt is issued. +//! Maximum value for eventCount is 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptEventCount(uint32_t base, uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Enable advanced feature of interrupt every up to 15 events + // + HWREGH(base + EPWM_O_ETPS) |= EPWM_ETPS_INTPSSEL; + HWREGH(base + EPWM_O_ETINTPS) = + ((HWREGH(base + EPWM_O_ETINTPS) & ~EPWM_ETINTPS_INTPRD2_M) | + eventCount); +} + +//***************************************************************************** +// +//! Return the interrupt status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the ePWM interrupt status. +//! \b Note This function doesn't return the Trip Zone status. +//! +//! \return Returns true if ePWM interrupt was generated. +//! Returns false if no interrupt was generated +// +//***************************************************************************** +static inline bool +EPWM_getEventTriggerInterruptStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return INT bit of ETFLG register + // + return(((HWREGH(base + EPWM_O_ETFLG) & 0x1U) == 0x1U) ? true : false); +} + +//***************************************************************************** +// +//! Clear interrupt flag. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function clears the ePWM interrupt flag. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_clearEventTriggerInterruptFlag(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear INT bit of ETCLR register + // + HWREGH(base + EPWM_O_ETCLR) |= EPWM_ETCLR_INT; +} + +//***************************************************************************** +// +//! Enable Pre-interrupt count load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the ePWM interrupt counter to be pre-interrupt loaded +//! with a count value. +//! +//! \note This is valid only for advanced/expanded interrupt mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable interrupt event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= EPWM_ETCNTINITCTL_INTINITEN; +} + +//***************************************************************************** +// +//! Disable interrupt count load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the ePWM interrupt counter from being loaded with +//! pre-interrupt count value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable interrupt event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) &= ~EPWM_ETCNTINITCTL_INTINITEN; +} + +//***************************************************************************** +// +//! Force a software pre interrupt event counter load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces the ePWM interrupt counter to be loaded with the +//! contents set by EPWM_setPreInterruptEventCount(). +//! +//! \note make sure the EPWM_enablePreInterruptEventCountLoad() function is +//! is called before invoking this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceInterruptEventCountInit(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Load the Interrupt Event counter value + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= EPWM_ETCNTINITCTL_INTINITFRC; +} + +//***************************************************************************** +// +//! Set interrupt count. +//! +//! \param base is the base address of the EPWM module. +//! \param eventCount is the ePWM interrupt count value. +//! +//! This function sets the ePWM interrupt count. eventCount is the value of the +//! pre-interrupt value that is to be loaded. The maximum value of eventCount +//! is 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setInterruptEventCountInitValue(uint32_t base, uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Set the Pre-interrupt event count + // + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_INTINIT_M) | + (uint16_t)(eventCount & 0xFU)); +} + +//***************************************************************************** +// +//! Get the interrupt count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the ePWM interrupt event count. +//! +//! \return The interrupt event counts that have occurred. +// +//***************************************************************************** +static inline uint16_t +EPWM_getInterruptEventCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the interrupt event count + // + return(((HWREGH(base + EPWM_O_ETINTPS) & EPWM_ETINTPS_INTCNT2_M) >> + EPWM_ETINTPS_INTCNT2_S)); +} + +//***************************************************************************** +// +//! Force ePWM interrupt. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces an ePWM interrupt. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_forceEventTriggerInterrupt(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set INT bit of ETFRC register + // + HWREGH(base + EPWM_O_ETFRC) |= EPWM_ETFRC_INT; +} + +// +// ADC SOC configuration related APIs +// +//***************************************************************************** +// +//! Enable ADC SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function enables the ePWM module to trigger an ADC SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable an SOC + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCAEN; + } + else + { + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCBEN; + } +} + +//***************************************************************************** +// +//! Disable ADC SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function disables the ePWM module from triggering an ADC SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable an SOC + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCAEN; + } + else + { + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCBEN; + } +} + +//***************************************************************************** +// +//! Sets the ePWM SOC source. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param socSource is the SOC source. +//! +//! This function sets the ePWM ADC SOC source. +//! Valid values for socSource are: +//! - adcSOCType +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! - socSource +//! - EPWM_SOC_DCxEVT1 - Event is based on DCxEVT1 +//! - EPWM_SOC_TBCTR_ZERO - Time-base counter equal to zero +//! - EPWM_SOC_TBCTR_PERIOD - Time-base counter equal to period +//! - EPWM_SOC_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or +//! period +//! - EPWM_SOC_TBCTR_U_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD(depending the value of x) +//! when the timer is incrementing +//! - EPWM_SOC_TBCTR_D_CMPx - Where x is A,B,C or D +//! Time-base counter equal to CMPA, CMPB, +//! CMPC or CMPD(depending the value of x) +//! when the timer is decrementing +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerSource(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + EPWM_ADCStartOfConversionSource socSource) +{ + uint16_t source; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + source = (uint16_t)socSource >> 1U; + } + else + { + source = (uint16_t)socSource; + } + + if(adcSOCType == EPWM_SOC_A) + { + // + // Set the SOC source + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_SOCASEL_M) | + (source << EPWM_ETSEL_SOCASEL_S)); + + // + // Enable the comparator selection + // + if((socSource == EPWM_SOC_TBCTR_U_CMPA) || + (socSource == EPWM_SOC_TBCTR_U_CMPB) || + (socSource == EPWM_SOC_TBCTR_D_CMPA) || + (socSource == EPWM_SOC_TBCTR_D_CMPB)) + { + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCASELCMP; + } + else if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCASELCMP; + } + else + { + // + // No action required for the other socSource options + // + } + } + else + { + // + // Enable the comparator selection + // + HWREGH(base + EPWM_O_ETSEL) = + ((HWREGH(base + EPWM_O_ETSEL) & ~EPWM_ETSEL_SOCBSEL_M) | + (source << EPWM_ETSEL_SOCBSEL_S)); + + // + // Enable the comparator selection + // + if((socSource == EPWM_SOC_TBCTR_U_CMPA) || + (socSource == EPWM_SOC_TBCTR_U_CMPB) || + (socSource == EPWM_SOC_TBCTR_D_CMPA) || + (socSource == EPWM_SOC_TBCTR_D_CMPB)) + { + // + // Enable events based on comp A or comp B + // + HWREGH(base + EPWM_O_ETSEL) &= ~EPWM_ETSEL_SOCBSELCMP; + } + else if((socSource == EPWM_SOC_TBCTR_U_CMPC) || + (socSource == EPWM_SOC_TBCTR_U_CMPD) || + (socSource == EPWM_SOC_TBCTR_D_CMPC) || + (socSource == EPWM_SOC_TBCTR_D_CMPD)) + { + // + // Enable events based on comp C or comp D + // + HWREGH(base + EPWM_O_ETSEL) |= EPWM_ETSEL_SOCBSELCMP; + } + else + { + // + // No action required for the other socSource options + // + } + } +} + +//***************************************************************************** +// +//! Sets the ePWM SOC event counts. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param preScaleCount is the event count number. +//! +//! This function sets the SOC event count that determines the number of +//! events that have to occur before an SOC is issued. +//! Valid values for the parameters are: +//! - adcSOCType +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! - preScaleCount +//! - [1 - 15] - Generate SOC pulse every preScaleCount +//! up to 15 events. +//! +//! \note A preScaleCount value of 0 disables the prescale. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerEventPrescale(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + uint16_t preScaleCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(preScaleCount < 16U); + + // + // Enable advanced feature of SOC every up to 15 events + // + HWREGH(base + EPWM_O_ETPS) |= EPWM_ETPS_SOCPSSEL; + if(adcSOCType == EPWM_SOC_A) + { + // + // Set the count for SOC A + // + HWREGH(base + EPWM_O_ETSOCPS) = + ((HWREGH(base + EPWM_O_ETSOCPS) & ~EPWM_ETSOCPS_SOCAPRD2_M) | + preScaleCount); + } + else + { + // + // Set the count for SOC B + // + HWREGH(base + EPWM_O_ETSOCPS) = + ((HWREGH(base + EPWM_O_ETSOCPS) & ~EPWM_ETSOCPS_SOCBPRD2_M) | + (preScaleCount << EPWM_ETSOCPS_SOCBPRD2_S)); + } +} + +//***************************************************************************** +// +//! Return the SOC event status. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function returns the ePWM SOC status. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return Returns true if the selected adcSOCType SOC was generated. +//! Returns false if the selected adcSOCType SOC was not generated. +// +//***************************************************************************** +static inline bool +EPWM_getADCTriggerFlagStatus(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the SOC A/ B status + // + return((((HWREGH(base + EPWM_O_ETFLG) >> + ((uint16_t)adcSOCType + 2U)) & 0x1U) == 0x1U) ? true : false); +} + +//***************************************************************************** +// +//! Clear SOC flag. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function clears the ePWM SOC flag. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_clearADCTriggerFlag(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear SOC A/B bit of ETCLR register + // + HWREGH(base + EPWM_O_ETCLR) |= 1U << ((uint16_t)adcSOCType + 2U); +} + +//***************************************************************************** +// +//! Enable Pre-SOC event count load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function enables the ePWM SOC event counter which is set by the +//! EPWM_setADCTriggerEventCountInitValue() function to be loaded before +//! an SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \note This is valid only for advanced/expanded SOC mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable SOC event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= 1U << ((uint16_t)adcSOCType + 14U); +} + +//***************************************************************************** +// +//! Disable Pre-SOC event count load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function disables the ePWM SOC event counter from being loaded before +//! an SOC event (only an SOC event causes an increment of the counter value). +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \note This is valid only for advanced/expanded SOC mode +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable SOC event count initializing/loading + // + HWREGH(base + EPWM_O_ETCNTINITCTL) &= + ~(1U << ((uint16_t)adcSOCType + 14U)); +} + +//***************************************************************************** +// +//! Force a software pre SOC event counter load. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type +//! +//! This function forces the ePWM SOC counter to be loaded with the +//! contents set by EPWM_setPreADCStartOfConversionEventCount(). +//! +//! \note make sure the EPWM_enableADCTriggerEventCountInit() +//! function is called before invoking this function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceADCTriggerEventCountInit(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Load the Interrupt Event counter value + // + HWREGH(base + EPWM_O_ETCNTINITCTL) |= 1U << ((uint16_t)adcSOCType + 11U); +} + +//***************************************************************************** +// +//! Set ADC Trigger count values. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! \param eventCount is the ePWM interrupt count value. +//! +//! This function sets the ePWM ADC Trigger count values. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! The eventCount has a maximum value of 15. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setADCTriggerEventCountInitValue(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType, + uint16_t eventCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(eventCount < 16U); + + // + // Set the ADC Trigger event count + // + if(adcSOCType == EPWM_SOC_A) + { + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_SOCAINIT_M) | + (uint16_t)(eventCount << EPWM_ETCNTINIT_SOCAINIT_S)); + } + else + { + HWREGH(base + EPWM_O_ETCNTINIT) = + ((HWREGH(base + EPWM_O_ETCNTINIT) & ~EPWM_ETCNTINIT_SOCBINIT_M) | + (eventCount << EPWM_ETCNTINIT_SOCBINIT_S)); + } +} + +//***************************************************************************** +// +//! Get the SOC event count. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function returns the ePWM SOC event count. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return The SOC event counts that have occurred. +// +//***************************************************************************** +static inline uint16_t +EPWM_getADCTriggerEventCount(uint32_t base, + EPWM_ADCStartOfConversionType adcSOCType) +{ + uint16_t eventCount; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the SOC event count + // + if(adcSOCType == EPWM_SOC_A) + { + eventCount = (HWREGH(base + EPWM_O_ETSOCPS) >> + EPWM_ETSOCPS_SOCACNT2_S) & 0xFU; + } + else + { + eventCount = (HWREGH(base + EPWM_O_ETSOCPS) >> + EPWM_ETSOCPS_SOCBCNT2_S) & 0xFU; + } + return(eventCount); +} + +//***************************************************************************** +// +//! Force SOC event. +//! +//! \param base is the base address of the EPWM module. +//! \param adcSOCType is the ADC SOC type. +//! +//! This function forces an ePWM SOC event. +//! Valid values for adcSOCType are: +//! - EPWM_SOC_A - SOC A +//! - EPWM_SOC_B - SOC B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_forceADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set SOC A/B bit of ETFRC register + // + HWREGH(base + EPWM_O_ETFRC) |= 1U << ((uint16_t)adcSOCType + 2U); +} + +// +// Digital Compare module related APIs +// +//***************************************************************************** +// +//! Set the DC trip input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripSource is the tripSource. +//! \param dcType is the Digital Compare type. +//! +//! This function sets the trip input to the Digital Compare (DC). For a given +//! dcType the function sets the tripSource to be the input to the DC. +//! Valid values for the parameter are: +//! - tripSource +//! - EPWM_DC_TRIP_TRIPINx - Trip x,where x ranges from 1 to 15 excluding 13 +//! - EPWM_DC_TRIP_COMBINATION - selects all the Trip signals whose input +//! is enabled by the following function +//! EPWM_enableDigitalCompareTripCombinationInput() +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_selectDigitalCompareTripInput(uint32_t base, + EPWM_DigitalCompareTripInput tripSource, + EPWM_DigitalCompareType dcType) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + EPWM_O_DCTRIPSEL) = + ((HWREGH(base + EPWM_O_DCTRIPSEL) & ~(0xFU << ((uint16_t)dcType << 2U))) | + ((uint16_t)tripSource << ((uint16_t)dcType << 2U))); + EDIS; +} + +// +// DCFILT +// +//***************************************************************************** +// +//! Enable DC filter blanking window. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the DC filter blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareBlankingWindow(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC filter blanking window + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_BLANKE; + EDIS; +} + +//***************************************************************************** +// +//! Disable DC filter blanking window. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the DC filter blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareBlankingWindow(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC filter blanking window + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_BLANKE; + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare Window inverse mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the Digital Compare Window inverse mode. This will +//! invert the blanking window. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareWindowInverseMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC window inverse mode. + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_BLANKINV; + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare Window inverse mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Digital Compare Window inverse mode. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareWindowInverseMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC window inverse mode. + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_BLANKINV; + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare filter blanking pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param blankingPulse is Pulse that starts blanking window. +//! +//! This function sets the input pulse that starts the Digital Compare blanking +//! window. +//! Valid values for blankingPulse are: +//! - EPWM_DC_WINDOW_START_TBCTR_PERIOD - Time base counter equals period +//! - EPWM_DC_WINDOW_START_TBCTR_ZERO - Time base counter equals zero +//! - EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD - Time base counter equals zero +//! or period. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareBlankingEvent(uint32_t base, + EPWM_DigitalCompareBlankingPulse blankingPulse) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC blanking event + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + ((HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_PULSESEL_M) | + ((uint16_t)((uint32_t)blankingPulse << EPWM_DCFCTL_PULSESEL_S))); + EDIS; +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter input. +//! +//! \param base is the base address of the EPWM module. +//! \param filterInput is Digital Compare signal source. +//! +//! This function sets the signal input source that will be filtered by the +//! Digital Compare module. +//! Valid values for filterInput are: +//! - EPWM_DC_WINDOW_SOURCE_DCAEVT1 - DC filter signal source is DCAEVT1 +//! - EPWM_DC_WINDOW_SOURCE_DCAEVT2 - DC filter signal source is DCAEVT2 +//! - EPWM_DC_WINDOW_SOURCE_DCBEVT1 - DC filter signal source is DCBEVT1 +//! - EPWM_DC_WINDOW_SOURCE_DCBEVT2 - DC filter signal source is DCBEVT2 +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareFilterInput(uint32_t base, + EPWM_DigitalCompareFilterInput filterInput) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the signal source that will be filtered + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + ((HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_SRCSEL_M) | + ((uint16_t)filterInput)); + EDIS; +} + +// +// DC Edge Filter +// +//***************************************************************************** +// +//! Enable Digital Compare Edge Filter. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the Digital Compare Edge filter to generate event +//! after configured number of edges. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareEdgeFilter(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable DC Edge Filter + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) |= EPWM_DCFCTL_EDGEFILTSEL; + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare Edge Filter. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the Digital Compare Edge filter. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareEdgeFilter(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable DC Edge Filter + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) &= ~EPWM_DCFCTL_EDGEFILTSEL; + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare Edge Filter Mode. +//! +//! \param base is the base address of the EPWM module. +//! \param edgeMode is Digital Compare Edge filter mode. +//! +//! This function sets the Digital Compare Event filter mode. Valid values +//! for edgeMode are: +//! - EPWM_DC_EDGEFILT_MODE_RISING - DC edge filter mode is rising edge +//! - EPWM_DC_EDGEFILT_MODE_FALLING - DC edge filter mode is falling edge +//! - EPWM_DC_EDGEFILT_MODE_BOTH - DC edge filter mode is both edges +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEdgeFilterMode(uint32_t base, + EPWM_DigitalCompareEdgeFilterMode edgeMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC Edge filter mode + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = + (HWREGH(base + EPWM_O_DCFCTL) & ~EPWM_DCFCTL_EDGEMODE_M) | + ((uint16_t)edgeMode << EPWM_DCFCTL_EDGEMODE_S); + EDIS; +} + +//***************************************************************************** +// +//! Set the Digital Compare Edge Filter Edge Count. +//! +//! \param base is the base address of the EPWM module. +//! \param edgeCount is Digital Compare event filter count +//! +//! This function sets the Digital Compare Event filter Edge Count to generate +//! events. Valid values for edgeCount can be: +//! - EPWM_DC_EDGEFILT_EDGECNT_0 - No edge is required to generate event +//! - EPWM_DC_EDGEFILT_EDGECNT_1 - 1 edge is required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_2 - 2 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_3 - 3 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_4 - 4 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_5 - 5 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_6 - 6 edges are required for event generation +//! - EPWM_DC_EDGEFILT_EDGECNT_7 - 7 edges are required for event generation +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEdgeFilterEdgeCount(uint32_t base, uint16_t edgeCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set DC Edge filter edge count + // + EALLOW; + HWREGH(base + EPWM_O_DCFCTL) = (HWREGH(base + EPWM_O_DCFCTL) & + ~EPWM_DCFCTL_EDGECOUNT_M) | + (edgeCount << EPWM_DCFCTL_EDGECOUNT_S); + EDIS; +} + +//***************************************************************************** +// +//! Returns the Digital Compare Edge Filter Edge Count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the configured Digital Compare Edge filter edge +//! count required to generate events. It can return values from 0-7. +//! +//! \return Returns the configured DigitalCompare Edge filter edge count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareEdgeFilterEdgeCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return configured DC edge filter edge count + // + return((HWREGH(base + EPWM_O_DCFCTL) & EPWM_DCFCTL_EDGECOUNT_M) >> + EPWM_DCFCTL_EDGECOUNT_S); +} + +//***************************************************************************** +// +//! Returns the Digital Compare Edge filter captured edge count status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the count of edges captured by Digital Compare Edge +//! filter. It can return values from 0-7. +//! +//! \return Returns the count of captured edges +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareEdgeFilterEdgeStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return captured edge count by DC Edge filter + // + return((HWREGH(base + EPWM_O_DCFCTL) & EPWM_DCFCTL_EDGESTATUS_M) >> + EPWM_DCFCTL_EDGESTATUS_S); +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter window offset +//! +//! \param base is the base address of the EPWM module. +//! \param windowOffsetCount is blanking window offset length. +//! +//! This function sets the offset between window start pulse and blanking +//! window in TBCLK count. +//! The function take a 16bit count value for the offset value. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareWindowOffset(uint32_t base, uint16_t windowOffsetCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the blanking window offset in TBCLK counts + // + HWREGH(base + EPWM_O_DCFOFFSET) = windowOffsetCount; +} + +//***************************************************************************** +// +//! Set up the Digital Compare filter window length +//! +//! \param base is the base address of the EPWM module. +//! \param windowLengthCount is blanking window length. +//! +//! This function sets up the Digital Compare filter blanking window length in +//! TBCLK count.The function takes a 16bit count value for the window length. +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareWindowLength(uint32_t base, uint16_t windowLengthCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the blanking window length in TBCLK counts + // + HWREGH(base + EPWM_O_DCFWINDOW) = windowLengthCount; +} + +//***************************************************************************** +// +//! Return DC filter blanking window offset count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns DC filter blanking window offset count. +//! +//! \return None +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareBlankingWindowOffsetCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Blanking Window Offset count + // + return(HWREGH(base + EPWM_O_DCFOFFSETCNT)); +} + +//***************************************************************************** +// +//! Return DC filter blanking window length count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns DC filter blanking window length count. +//! +//! \return None +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareBlankingWindowLengthCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the Blanking Window Length count + // + return(HWREGH(base + EPWM_O_DCFWINDOWCNT)); +} + +//***************************************************************************** +// +//! Set up the Digital Compare Event source. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! \param dcEvent is the Digital Compare Event number. +//! \param dcEventSource is the - Digital Compare Event source. +//! +//! This function sets up the Digital Compare module Event sources. +//! The following are valid values for the parameters. +//! - dcModule +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! - dcEvent +//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1 +//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2 +//! - dcEventSource +//! - EPWM_DC_EVENT_SOURCE_FILT_SIGNAL - signal source is filtered +//! \note The signal source for this option is DCxEVTy, where the +//! value of x is dependent on dcModule and the value of y is +//! dependent on dcEvent. Possible signal sources are DCAEVT1, +//! DCBEVT1, DCAEVT2 or DCBEVT2 depending on the value of both +//! dcModule and dcEvent. +//! - EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL - signal source is unfiltered +//! The signal source for this option is DCxEVTy. +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEventSource(uint32_t base, + EPWM_DigitalCompareModule dcModule, + EPWM_DigitalCompareEvent dcEvent, + EPWM_DigitalCompareEventSource dcEventSource) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Set the DC event 1 source source + // + EALLOW; + if(dcEvent == EPWM_DC_EVENT_1) + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SRCSEL) | + (uint16_t)dcEventSource); + } + else + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT2SRCSEL) | + ((uint16_t)dcEventSource << 8U)); + } + EDIS; +} + +//***************************************************************************** +// +//! Set up the Digital Compare input sync mode. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! \param dcEvent is the Digital Compare Event number. +//! \param syncMode is the Digital Compare Event sync mode. +//! +//! This function sets up the Digital Compare module Event sources. +//! The following are valid values for the parameters. +//! - dcModule +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! - dcEvent +//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1 +//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2 +//! - syncMode +//! - EPWM_DC_EVENT_INPUT_SYNCED - DC input signal is synced with +//! TBCLK +//! - EPWM_DC_EVENT_INPUT_NOT SYNCED - DC input signal is not synced with +//! TBCLK +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareEventSyncMode(uint32_t base, + EPWM_DigitalCompareModule dcModule, + EPWM_DigitalCompareEvent dcEvent, + EPWM_DigitalCompareSyncMode syncMode) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Set the DC event sync mode + // + EALLOW; + if(dcEvent == EPWM_DC_EVENT_1) + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1FRCSYNCSEL) | + ((uint16_t)syncMode << 1U)); + } + else + { + HWREGH(base + registerOffset) = + ((HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT2FRCSYNCSEL) | + ((uint16_t)syncMode << 9U)); + } + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare to generate Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function enables the Digital Compare Event 1 to generate Start of +//! Conversion. +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareADCTrigger(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Enable Digital Compare start of conversion generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | EPWM_DCACTL_EVT1SOCE); + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare from generating Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function disables the Digital Compare Event 1 from generating Start of +//! Conversion. +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareADCTrigger(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Disable Digital Compare start of conversion generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SOCE); + EDIS; +} + +//***************************************************************************** +// +//! Enable Digital Compare to generate sync out pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function enables the Digital Compare Event 1 to generate sync out +//! pulse +//! The following are valid values for the \e dcModule parameter. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareSyncEvent(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Enable Digital Compare sync out pulse generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | EPWM_DCACTL_EVT1SYNCE); + EDIS; +} + +//***************************************************************************** +// +//! Disable Digital Compare from generating Start of Conversion. +//! +//! \param base is the base address of the EPWM module. +//! \param dcModule is the Digital Compare module. +//! +//! This function disables the Digital Compare Event 1 from generating synch +//! out pulse. +//! The following are valid values for the \e dcModule parameters. +//! - EPWM_DC_MODULE_A - Digital Compare Module A +//! - EPWM_DC_MODULE_B - Digital Compare Module B +//! +//! \return None +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareSyncEvent(uint32_t base, + EPWM_DigitalCompareModule dcModule) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + registerOffset = EPWM_O_DCACTL + (uint32_t)dcModule; + + // + // Disable Digital Compare sync out pulse generation + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~EPWM_DCACTL_EVT1SYNCE); + EDIS; +} + +// +// DC capture mode +// +//***************************************************************************** +// +//! Enables the Time Base Counter Capture controller. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the time Base Counter Capture. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareCounterCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable Time base counter capture + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_CAPE; + EDIS; +} + +//***************************************************************************** +// +//! Disables the Time Base Counter Capture controller. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disable the time Base Counter Capture. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareCounterCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Disable Time base counter capture + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPE; + EDIS; +} + +//***************************************************************************** +// +//! Set the Time Base Counter Capture mode. +//! +//! \param base is the base address of the EPWM module. +//! \param enableShadowMode is the shadow read mode flag. +//! +//! This function sets the mode the Time Base Counter value is read from. If +//! enableShadowMode is true, CPU reads of the DCCAP register will return the +//! shadow register contents.If enableShadowMode is false, CPU reads of the +//! DCCAP register will return the active register contents. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setDigitalCompareCounterShadowMode(uint32_t base, bool enableShadowMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + EALLOW; + if(enableShadowMode) + { + // + // Enable DC counter shadow mode + // + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_SHDWMODE; + } + else + { + // + // Disable DC counter shadow mode + // + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_SHDWMODE; + } + EDIS; +} + +//***************************************************************************** +// +//! Return the DC Capture event status. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the DC capture event status. +//! +//! \return Returns true if a DC capture event has occurs. +//! Returns false if no DC Capture event has occurred. +//! +//! \return None. +// +//***************************************************************************** +static inline bool +EPWM_getDigitalCompareCaptureStatus(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the DC compare status + // + return((HWREGH(base + EPWM_O_DCCAPCTL) & EPWM_DCCAPCTL_CAPSTS) == + EPWM_DCCAPCTL_CAPSTS); +} + +//***************************************************************************** +// +//! Clears DC capture latched status flag +//! +//! \param base is the base address of the EPWM module. +//! This function is used to clear the CAPSTS (set) condition. +//! +//! \return None. +//***************************************************************************** +static inline void +EPWM_clearDigitalCompareCaptureStatusFlag(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear digital compare capture status flag + // + EALLOW; + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPCLR; + EDIS; +} + +//***************************************************************************** +// +//! Configures DC capture operating mode +//! +//! \param base is the base address of the EPWM module. +//! \param disableClearMode is the clear mode bit. +//! +//! This function is used to configure the DC capture operating mode. If +//! \e disableClearMode is false, the TBCNT value is captured in active register +//! on occurance of DCEVTFILT event. The trip events are ignored until next +//! PRD or ZRO event re-triggers the capture mechanism. +//! If \e disableClearMode is true, the TBCNT value is captured, CAPSTS flag is +//! set and further trips are ignored until CAPSTS bit is cleared. +//! +//! \return None. +//***************************************************************************** +static inline void +EPWM_configureDigitalCompareCounterCaptureMode(uint32_t base, + bool disableClearMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + EALLOW; + if(disableClearMode) + { + // + // Disable DC counter auto-clear on PULSESEL event + // + HWREGH(base + EPWM_O_DCCAPCTL) |= EPWM_DCCAPCTL_CAPMODE; + } + else + { + // + // Enable DC counter clear on PULSESEL events + // + HWREGH(base + EPWM_O_DCCAPCTL) &= ~EPWM_DCCAPCTL_CAPMODE; + } + EDIS; +} + +//***************************************************************************** +// +//! Return the DC Time Base Counter capture value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the DC Time Base Counter capture value. The value +//! read is determined by the mode as set in the +//! EPWM_setTimeBaseCounterReadMode() function. +//! +//! \return Returns the DC Time Base Counter Capture count value. +// +//***************************************************************************** +static inline uint16_t +EPWM_getDigitalCompareCaptureCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the DC Time Base Counter Capture count value + // + return(HWREGH(base + EPWM_O_DCCAP)); +} + +//***************************************************************************** +// +//! Enable DC TRIP combinational input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripInput is the Trip number. +//! \param dcType is the Digital Compare module. +//! +//! This function enables the specified Trip input. +//! Valid values for the parameters are: +//! - tripInput +//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15 +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableDigitalCompareTripCombinationInput(uint32_t base, + uint16_t tripInput, + EPWM_DigitalCompareType dcType) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register + // offset with respect to DCAHTRIPSEL + // + registerOffset = EPWM_O_DCAHTRIPSEL + (uint32_t)dcType; + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) | tripInput); + + // + // Enable the combination input + // + HWREGH(base + EPWM_O_DCTRIPSEL) = + (HWREGH(base + EPWM_O_DCTRIPSEL) | (0xFU << ((uint16_t)dcType << 2U))); + EDIS; +} + +//***************************************************************************** +// +//! Disable DC TRIP combinational input. +//! +//! \param base is the base address of the EPWM module. +//! \param tripInput is the Trip number. +//! \param dcType is the Digital Compare module. +//! +//! This function disables the specified Trip input. +//! Valid values for the parameters are: +//! - tripInput +//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15 +//! - dcType +//! - EPWM_DC_TYPE_DCAH - Digital Compare A High +//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low +//! - EPWM_DC_TYPE_DCBH - Digital Compare B High +//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableDigitalCompareTripCombinationInput(uint32_t base, + uint16_t tripInput, + EPWM_DigitalCompareType dcType) +{ + uint32_t registerOffset; + + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register + // offset with respect to DCAHTRIPSEL + // + registerOffset = EPWM_O_DCAHTRIPSEL + (uint32_t)dcType; + + // + // Set the DC trip input + // + EALLOW; + HWREGH(base + registerOffset) = + (HWREGH(base + registerOffset) & ~tripInput); + EDIS; +} + +// +// Valley switching +// +//***************************************************************************** +// +//! Enable valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Valley Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set VCAPE bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_VCAPE; + EDIS; +} + +//***************************************************************************** +// +//! Disable valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Valley Capture mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear VCAPE bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) &= ~EPWM_VCAPCTL_VCAPE; + EDIS; +} + +//***************************************************************************** +// +//! Start valley capture mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function starts Valley Capture sequence. +//! +//! \b Make sure you invoke EPWM_setValleyTriggerSource with the trigger +//! variable set to EPWM_VALLEY_TRIGGER_EVENT_SOFTWARE before calling this +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_startValleyCapture(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set VCAPSTART bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_VCAPSTART; + EDIS; +} + +//***************************************************************************** +// +//! Set valley capture trigger. +//! +//! \param base is the base address of the EPWM module. +//! \param trigger is the Valley counter trigger. +//! +//! This function sets the trigger value that initiates Valley Capture sequence +//! +//! \b Set the number of Trigger source events for starting and stopping the +//! valley capture using EPWM_setValleyTriggerEdgeCounts(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyTriggerSource(uint32_t base, EPWM_ValleyTriggerSource trigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to TRIGSEL bits + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) = + ((HWREGH(base + EPWM_O_VCAPCTL) & ~EPWM_VCAPCTL_TRIGSEL_M) | + ((uint16_t)trigger << 2U)); + EDIS; +} + +//***************************************************************************** +// +//! Set valley capture trigger source count. +//! +//! \param base is the base address of the EPWM module. +//! \param startCount +//! \param stopCount +//! +//! This function sets the number of trigger events required to start and stop +//! the valley capture count. +//! Maximum values for both startCount and stopCount is 15 corresponding to the +//! 15th edge of the trigger event. +//! +//! \b Note: +//! A startCount value of 0 prevents starting the valley counter. +//! A stopCount value of 0 prevents the valley counter from stopping. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyTriggerEdgeCounts(uint32_t base, uint16_t startCount, + uint16_t stopCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((startCount < 16U) && (stopCount < 16U)); + + // + // Write to STARTEDGE and STOPEDGE bits + // + EALLOW; + HWREGH(base + EPWM_O_VCNTCFG) = + ((HWREGH(base + EPWM_O_VCNTCFG) & + ~(EPWM_VCNTCFG_STARTEDGE_M | EPWM_VCNTCFG_STOPEDGE_M)) | + (startCount | (stopCount << 8U))); + EDIS; +} + +//***************************************************************************** +// +//! Enable valley switching delay. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Valley switching delay. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set EDGEFILTDLYSEL bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) |= EPWM_VCAPCTL_EDGEFILTDLYSEL; + EDIS; +} + +//***************************************************************************** +// +//! Disable valley switching delay. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Valley switching delay. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Clear EDGEFILTDLYSEL bit + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) &= ~EPWM_VCAPCTL_EDGEFILTDLYSEL; + EDIS; +} + +//***************************************************************************** +// +//! Set Valley delay values. +//! +//! \param base is the base address of the EPWM module. +//! \param delayOffsetValue is the software defined delay offset value. +//! +//! This function sets the Valley delay value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleySWDelayValue(uint32_t base, uint16_t delayOffsetValue) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to SWVDELVAL bits + // + HWREGH(base + EPWM_O_SWVDELVAL) = delayOffsetValue; +} + +//***************************************************************************** +// +//! Set Valley delay mode. +//! +//! \param base is the base address of the EPWM module. +//! \param delayMode is the Valley delay mode. +//! +//! This function sets the Valley delay mode values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setValleyDelayDivider(uint32_t base, EPWM_ValleyDelayMode delayMode) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Write to VDELAYDIV bits + // + EALLOW; + HWREGH(base + EPWM_O_VCAPCTL) = + ((HWREGH(base + EPWM_O_VCAPCTL) & ~EPWM_VCAPCTL_VDELAYDIV_M) | + ((uint16_t)delayMode << 7U)); + EDIS; +} + +//***************************************************************************** +// +//! Get the valley edge status bit. +//! +//! \param base is the base address of the EPWM module. +//! \param edge is the start or stop edge. +//! +//! This function returns the status of the start or stop valley status +//! depending on the value of edge. +//! If a start or stop edge has occurred, the function returns true, if not it +//! returns false. +//! +//! \return Returns true if the specified edge has occurred, +//! Returns false if the specified edge has not occurred. +// +//***************************************************************************** +static inline bool +EPWM_getValleyEdgeStatus(uint32_t base, EPWM_ValleyCounterEdge edge) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + if(edge == EPWM_VALLEY_COUNT_START_EDGE) + { + // + // Returns STARTEDGESTS status + // + return(((HWREGH(base + EPWM_O_VCNTCFG) & EPWM_VCNTCFG_STARTEDGESTS) == + EPWM_VCNTCFG_STARTEDGESTS ) ? true : false); + } + else + { + // + // Returns STOPEDGESTS status + // + return(((HWREGH(base + EPWM_O_VCNTCFG) & EPWM_VCNTCFG_STOPEDGESTS) == + EPWM_VCNTCFG_STOPEDGESTS) ? true : false); + } +} + +//***************************************************************************** +// +//! Get the Valley Counter value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the valley time base count value which is captured +//! upon occurrence of the stop edge condition selected by +//! EPWM_setValleyTriggerSource() and by the stopCount variable of the +//! EPWM_setValleyTriggerEdgeCounts() function. +//! +//! \return Returns the valley base time count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getValleyCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read VCNTVAL register + // + return(HWREGH(base + EPWM_O_VCNTVAL)); +} + +//***************************************************************************** +// +//! Get the Valley delay value. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the hardware valley delay count. +//! +//! \return Returns the valley delay count. +// +//***************************************************************************** +static inline uint16_t +EPWM_getValleyHWDelay(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Read HWVDELVAL register + // + return(HWREGH(base + EPWM_O_HWVDELVAL)); +} + +//***************************************************************************** +// +//! Enable Global shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables Global shadow to active load mode of registers. +//! The trigger source for loading shadow to active is determined by +//! EPWM_setGlobalLoadTrigger() function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Shadow to active load is controlled globally + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) |= EPWM_GLDCTL_GLD; + EDIS; +} + +//***************************************************************************** +// +//! Disable Global shadow load mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables Global shadow to active load mode of registers. +//! Loading shadow to active is determined individually. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Shadow to active load is controlled individually + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) &= ~EPWM_GLDCTL_GLD; + EDIS; +} + +//***************************************************************************** +// +//! Set the Global shadow load pulse. +//! +//! \param base is the base address of the EPWM module. +//! \param loadTrigger is the pulse that causes global shadow load. +//! +//! This function sets the pulse that causes Global shadow to active load. +//! Valid values for the loadTrigger parameter are: +//! +//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO - load when counter is equal +//! to zero +//! - EPWM_GL_LOAD_PULSE_CNTR_PERIOD - load when counter is equal +//! to period +//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO_PERIOD - load when counter is equal +//! to zero or period +//! - EPWM_GL_LOAD_PULSE_SYNC - load on sync event +//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_ZERO - load on sync event or when +//! counter is equal to zero +//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_PERIOD - load on sync event or when +//! counter is equal to period +//! - EPWM_GL_LOAD_PULSE_SYNC_CNTR_ZERO_PERIOD - load on sync event or when +//! counter is equal to period +//! or zero +//! - EPWM_GL_LOAD_PULSE_GLOBAL_FORCE - load on global force +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadTrigger(uint32_t base, EPWM_GlobalLoadTrigger loadTrigger) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set the Global shadow to active load pulse + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) = + ((HWREGH(base + EPWM_O_GLDCTL) & ~EPWM_GLDCTL_GLDMODE_M) | + ((uint16_t)loadTrigger << EPWM_GLDCTL_GLDMODE_S)); + EDIS; +} + +//***************************************************************************** +// +//! Set the number of Global load pulse event counts +//! +//! \param base is the base address of the EPWM module. +//! \param prescalePulseCount is the pulse event counts. +//! +//! This function sets the number of Global Load pulse events that have to +//! occurred before a global load pulse is issued. Valid values for +//! prescaleCount range from 0 to 7. 0 being no event (disables counter), and 7 +//! representing 7 events. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadEventPrescale(uint32_t base, uint16_t prescalePulseCount) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT(prescalePulseCount < 8U); + + // + // Set the number of counts that have to occur before + // a load strobe is issued + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) = + ((HWREGH(base + EPWM_O_GLDCTL) & ~EPWM_GLDCTL_GLDPRD_M) | + (prescalePulseCount << EPWM_GLDCTL_GLDPRD_S)); + EDIS; +} + +//***************************************************************************** +// +//! Return the number of Global load pulse event counts +//! +//! \param base is the base address of the EPWM module. +//! +//! This function returns the number of Global Load pulse events that have +//! occurred. These pulse events are set by the EPWM_setGlobalLoadTrigger() +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline uint16_t +EPWM_getGlobalLoadEventCount(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Return the number of events that have occurred + // + return((HWREGH(base + EPWM_O_GLDCTL) >> EPWM_GLDCTL_GLDCNT_S) & 0x7U); +} + +//***************************************************************************** +// +//! Enable continuous global shadow to active load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables global continuous shadow to active load. Register +//! load happens every time the event set by the +//! EPWM_setGlobalLoadTrigger() occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoadOneShotMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable global continuous shadow to active load + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) &= ~EPWM_GLDCTL_OSHTMODE; + EDIS; +} + +//***************************************************************************** +// +//! Enable One shot global shadow to active load. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables a one time global shadow to active load. Register +//! load happens every time the event set by the +//! EPWM_setGlobalLoadTrigger() occurs. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoadOneShotMode(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Enable global continuous shadow to active load + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL) |= EPWM_GLDCTL_OSHTMODE; + EDIS; +} + +//***************************************************************************** +// +//! Set One shot global shadow to active load pulse. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function sets a one time global shadow to active load pulse. The pulse +//! propagates to generate a load signal if any of the events set by +//! EPWM_setGlobalLoadTrigger() occur. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_setGlobalLoadOneShotLatch(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Set a one shot Global shadow load pulse. + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL2) |= EPWM_GLDCTL2_OSHTLD; + EDIS; +} + +//***************************************************************************** +// +//! Force a software One shot global shadow to active load pulse. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function forces a software a one time global shadow to active load +//! pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_forceGlobalLoadOneShotEvent(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + + // + // Force a Software Global shadow load pulse + // + EALLOW; + HWREGH(base + EPWM_O_GLDCTL2) |= EPWM_GLDCTL2_GFRCLD; + EDIS; +} + +//***************************************************************************** +// +//! Enable a register to be loaded Globally. +//! +//! \param base is the base address of the EPWM module. +//! \param loadRegister is the register. +//! +//! This function enables the register specified by loadRegister to be globally +//! loaded. +//! Valid values for loadRegister are: +//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR +//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR +//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR +//! - EPWM_GL_REGISTER_CMPC - Register CMPC +//! - EPWM_GL_REGISTER_CMPD - Register CMPD +//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR +//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR +//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL +//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2 +//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2 +//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_enableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((loadRegister > 0x0000U) && (loadRegister < 0x0800U)); + + // + // The register specified by loadRegister is loaded globally + // + EALLOW; + HWREGH(base + EPWM_O_GLDCFG) |= loadRegister; + EDIS; +} + +//***************************************************************************** +// +//! Disable a register to be loaded Globally. +//! +//! \param base is the base address of the EPWM module. +//! \param loadRegister is the register. +//! +//! This function disables the register specified by loadRegister from being +//! loaded globally. The shadow to active load happens as specified by the +//! register control +//! Valid values for loadRegister are: +//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR +//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR +//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR +//! - EPWM_GL_REGISTER_CMPC - Register CMPC +//! - EPWM_GL_REGISTER_CMPD - Register CMPD +//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR +//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR +//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL +//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2 +//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2 +//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC +//! +//! \return None. +// +//***************************************************************************** +static inline void +EPWM_disableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister) +{ + // + // Check the arguments + // + ASSERT(EPWM_isBaseValid(base)); + ASSERT((loadRegister > 0x0000U) && (loadRegister < 0x0800U)); + + // + // The register specified by loadRegister is loaded by individual + // register configuration setting + // + EALLOW; + HWREGH(base + EPWM_O_GLDCFG) &= ~loadRegister; + EDIS; +} + +//***************************************************************************** +// +//! Set emulation mode +//! +//! \param base is the base address of the EPWM module. +//! \param emulationMode is the emulation mode. +//! +//! This function sets the emulation behaviours of the time base counter. Valid +//! values for emulationMode are: +//! - EPWM_EMULATION_STOP_AFTER_NEXT_TB - Stop after next Time Base counter +//! increment or decrement. +//! - EPWM_EMULATION_STOP_AFTER_FULL_CYCLE - Stop when counter completes whole +//! cycle. +//! - EPWM_EMULATION_FREE_RUN - Free run. +//! +//! \return None. +// +//***************************************************************************** +extern void +EPWM_setEmulationMode(uint32_t base, EPWM_EmulationMode emulationMode); + +//***************************************************************************** +// +//! Configures ePWM signal with desired frequency & duty +//! +//! \param base is the base address of the EPWM module. +//! \param signalParams is the desired signal parameters. +//! +//! This function configures the ePWM module to generate a signal with +//! desired frequency & duty. +//! +//! \return None. +// +//***************************************************************************** +extern void +EPWM_configureSignal(uint32_t base, const EPWM_SignalParams *signalParams); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EPWM_H diff --git a/gpio_driverlib_cpu1/device/driverlib/eqep.c b/gpio_driverlib_cpu1/device/driverlib/eqep.c new file mode 100644 index 0000000..64caf47 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/eqep.c @@ -0,0 +1,149 @@ +//########################################################################### +// +// FILE: eqep.c +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "eqep.h" + +//***************************************************************************** +// +// EQEP_setCompareConfig +// +//***************************************************************************** +void +EQEP_setCompareConfig(uint32_t base, uint16_t config, uint32_t compareValue, + uint16_t cycles) +{ + uint16_t regValue; + + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + ASSERT(cycles <= (EQEP_QPOSCTL_PCSPW_M + 1U)); + + // + // Set the compare match value + // + HWREG(base + EQEP_O_QPOSCMP) = compareValue; + + // + // Set the shadow register settings and pulse width. + // + regValue = (config & (uint16_t)(EQEP_QPOSCTL_PCSHDW | + EQEP_QPOSCTL_PCLOAD)) | (cycles - 1U); + + HWREGH(base + EQEP_O_QPOSCTL) = (HWREGH(base + EQEP_O_QPOSCTL) & + ~(EQEP_QPOSCTL_PCSPW_M | + EQEP_QPOSCTL_PCLOAD | + EQEP_QPOSCTL_PCSHDW)) | regValue; + + // + // Set position compare sync-output mode. + // + regValue = config & (uint16_t)(EQEP_QDECCTL_SOEN | EQEP_QDECCTL_SPSEL); + + HWREGH(base + EQEP_O_QDECCTL) = (HWREGH(base + EQEP_O_QDECCTL) & + ~(EQEP_QDECCTL_SOEN | + EQEP_QDECCTL_SPSEL)) | regValue; +} + +//***************************************************************************** +// +// EQEP_setInputPolarity +// +//***************************************************************************** +void +EQEP_setInputPolarity(uint32_t base, bool invertQEPA, bool invertQEPB, + bool invertIndex, bool invertStrobe) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Configure QEPA signal + // + if(invertQEPA) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QAP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QAP; + } + + // + // Configure QEPB signal + // + if(invertQEPB) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QBP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QBP; + } + + // + // Configure index signal + // + if(invertIndex) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QIP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QIP; + } + + // + // Configure strobe signal + // + if(invertStrobe) + { + HWREGH(base + EQEP_O_QDECCTL) |= EQEP_QDECCTL_QSP; + } + else + { + HWREGH(base + EQEP_O_QDECCTL) &= ~EQEP_QDECCTL_QSP; + } +} diff --git a/gpio_driverlib_cpu1/device/driverlib/eqep.h b/gpio_driverlib_cpu1/device/driverlib/eqep.h new file mode 100644 index 0000000..4f1eaa2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/eqep.h @@ -0,0 +1,1691 @@ +//########################################################################### +// +// FILE: eqep.h +// +// TITLE: C28x eQEP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef EQEP_H +#define EQEP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup eqep_api eQEP +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_eqep.h" +#include "inc/hw_types.h" +#include "debug.h" + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to EQEP_setDecoderConfig() as the config +// parameter. +// +//***************************************************************************** + +// +// Operation Mode +// +#define EQEP_CONFIG_QUADRATURE 0x0000U //!< Quadrature-clock mode +#define EQEP_CONFIG_CLOCK_DIR 0x4000U //!< Direction-count mode +#define EQEP_CONFIG_UP_COUNT 0x8000U //!< Up-count mode, QDIR = 1 +#define EQEP_CONFIG_DOWN_COUNT 0xC000U //!< Down-count mode, QDIR = 0 + +// +// Resolution +// +#define EQEP_CONFIG_2X_RESOLUTION 0x0000U //!< Count rising and falling edge +#define EQEP_CONFIG_1X_RESOLUTION 0x0800U //!< Count rising edge only + +// +// Swap QEPA and QEPB +// +#define EQEP_CONFIG_NO_SWAP 0x0000U //!< Do not swap QEPA and QEPB +#define EQEP_CONFIG_SWAP 0x0400U //!< Swap QEPA and QEPB + +// +// Index pulse gating option +// +#define EQEP_CONFIG_IGATE_DISABLE 0x0000U //!< Disable gating of Index pulse +#define EQEP_CONFIG_IGATE_ENABLE 0x0200U //!< Gate the index pin with strobe + +//***************************************************************************** + +// +// Values that can be passed to EQEP_setCompareConfig() as the config +// parameter. +// +//***************************************************************************** + +// +// Sync pulse pin +// +#define EQEP_COMPARE_NO_SYNC_OUT 0x0000U //!< Disable sync output +#define EQEP_COMPARE_IDX_SYNC_OUT 0x2000U //!< Sync output on index pin +#define EQEP_COMPARE_STROBE_SYNC_OUT 0x3000U //!< Sync output on strobe pin + +// +// Shadow register use +// +#define EQEP_COMPARE_NO_SHADOW 0x0000U //!< Disable shadow of QPOSCMP +#define EQEP_COMPARE_LOAD_ON_ZERO 0x8000U //!< Load on QPOSCNT = 0 +#define EQEP_COMPARE_LOAD_ON_MATCH 0xC000U //!< Load on QPOSCNT = QPOSCMP + +//***************************************************************************** +// +// Values that can be passed to EQEP_enableInterrupt(), +// EQEP_disableInterrupt(), and EQEP_clearInterruptStatus() as the +// intFlags parameter and returned by EQEP_clearInterruptStatus(). +// +//***************************************************************************** +#define EQEP_INT_GLOBAL 0x0001U //!< Global interrupt flag +#define EQEP_INT_POS_CNT_ERROR 0x0002U //!< Position counter error +#define EQEP_INT_PHASE_ERROR 0x0004U //!< Quadrature phase error +#define EQEP_INT_DIR_CHANGE 0x0008U //!< Quadrature direction change +#define EQEP_INT_WATCHDOG 0x0010U //!< Watchdog time-out +#define EQEP_INT_UNDERFLOW 0x0020U //!< Position counter underflow +#define EQEP_INT_OVERFLOW 0x0040U //!< Position counter overflow +#define EQEP_INT_POS_COMP_READY 0x0080U //!< Position-compare ready +#define EQEP_INT_POS_COMP_MATCH 0x0100U //!< Position-compare match +#define EQEP_INT_STROBE_EVNT_LATCH 0x0200U //!< Strobe event latch +#define EQEP_INT_INDEX_EVNT_LATCH 0x0400U //!< Index event latch +#define EQEP_INT_UNIT_TIME_OUT 0x0800U //!< Unit time-out + +//***************************************************************************** +// +// Values that can be returned by EQEP_getStatus(). +// +//***************************************************************************** +//! Unit position event detected +#define EQEP_STS_UNIT_POS_EVNT 0x0080U +//! Direction was clockwise on first index event +#define EQEP_STS_DIR_ON_1ST_IDX 0x0040U +//! Direction is CW (forward) +#define EQEP_STS_DIR_FLAG 0x0020U +//! Direction was CW on index +#define EQEP_STS_DIR_LATCH 0x0010U +//! Capture timer overflow +#define EQEP_STS_CAP_OVRFLW_ERROR 0x0008U +//! Direction changed between position capture events +#define EQEP_STS_CAP_DIR_ERROR 0x0004U +//! First index pulse occurred +#define EQEP_STS_1ST_IDX_FLAG 0x0002U +//! Position counter error +#define EQEP_STS_POS_CNT_ERROR 0x0001U + +//***************************************************************************** +// +// Values that can be passed to EQEP_setLatchMode() as the latchMode parameter. +// +//***************************************************************************** + +// +// Position counter latch event +// +#define EQEP_LATCH_CNT_READ_BY_CPU 0x0000U //!< On position counter read +#define EQEP_LATCH_UNIT_TIME_OUT 0x0004U //!< On unit time-out event + +// +// Strobe position counter latch event +// +//! On rising edge of strobe +#define EQEP_LATCH_RISING_STROBE 0x0000U +//! On rising edge when clockwise, on falling when counter clockwise +#define EQEP_LATCH_EDGE_DIR_STROBE 0x0040U + +// +// Index position counter latch event +// +#define EQEP_LATCH_RISING_INDEX 0x0010U //!< On rising edge of index +#define EQEP_LATCH_FALLING_INDEX 0x0020U //!< On falling edge of index + +#define EQEP_LATCH_SW_INDEX_MARKER 0x0030U //!< On software index marker + +//***************************************************************************** +// +// Values that can be passed to EQEP_setPositionInitMode() as the initMode +// parameter. +// +//***************************************************************************** +#define EQEP_INIT_DO_NOTHING 0x0000U //!< Action is disabled + +// +// Strobe events +// +//! On rising edge of strobe +#define EQEP_INIT_RISING_STROBE 0x0800U +//! On rising edge when clockwise, on falling when counter clockwise +#define EQEP_INIT_EDGE_DIR_STROBE 0x0C00U + +// +// Index events +// +#define EQEP_INIT_RISING_INDEX 0x0200U //!< On rising edge of index +#define EQEP_INIT_FALLING_INDEX 0x0300U //!< On falling edge of index +#endif + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setPositionCounterConfig() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Reset position on index pulse + EQEP_POSITION_RESET_IDX = 0x0000, + //! Reset position on maximum position + EQEP_POSITION_RESET_MAX_POS = 0x1000, + //! Reset position on the first index pulse + EQEP_POSITION_RESET_1ST_IDX = 0x2000, + //! Reset position on a unit time event + EQEP_POSITION_RESET_UNIT_TIME_OUT = 0x3000 +} EQEP_PositionResetMode; + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setCaptureConfig() as the \e capPrescale +//! parameter. CAPCLK is the capture timer clock frequency. +// +//***************************************************************************** +typedef enum +{ + EQEP_CAPTURE_CLK_DIV_1 = 0x00, //!< CAPCLK = SYSCLKOUT/1 + EQEP_CAPTURE_CLK_DIV_2 = 0x10, //!< CAPCLK = SYSCLKOUT/2 + EQEP_CAPTURE_CLK_DIV_4 = 0x20, //!< CAPCLK = SYSCLKOUT/4 + EQEP_CAPTURE_CLK_DIV_8 = 0x30, //!< CAPCLK = SYSCLKOUT/8 + EQEP_CAPTURE_CLK_DIV_16 = 0x40, //!< CAPCLK = SYSCLKOUT/16 + EQEP_CAPTURE_CLK_DIV_32 = 0x50, //!< CAPCLK = SYSCLKOUT/32 + EQEP_CAPTURE_CLK_DIV_64 = 0x60, //!< CAPCLK = SYSCLKOUT/64 + EQEP_CAPTURE_CLK_DIV_128 = 0x70 //!< CAPCLK = SYSCLKOUT/128 +} EQEP_CAPCLKPrescale; + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setCaptureConfig() as the \e evntPrescale +//! parameter. UPEVNT is the unit position event frequency. +// +//***************************************************************************** +typedef enum +{ + EQEP_UNIT_POS_EVNT_DIV_1, //!< UPEVNT = QCLK/1 + EQEP_UNIT_POS_EVNT_DIV_2, //!< UPEVNT = QCLK/2 + EQEP_UNIT_POS_EVNT_DIV_4, //!< UPEVNT = QCLK/4 + EQEP_UNIT_POS_EVNT_DIV_8, //!< UPEVNT = QCLK/8 + EQEP_UNIT_POS_EVNT_DIV_16, //!< UPEVNT = QCLK/16 + EQEP_UNIT_POS_EVNT_DIV_32, //!< UPEVNT = QCLK/32 + EQEP_UNIT_POS_EVNT_DIV_64, //!< UPEVNT = QCLK/64 + EQEP_UNIT_POS_EVNT_DIV_128, //!< UPEVNT = QCLK/128 + EQEP_UNIT_POS_EVNT_DIV_256, //!< UPEVNT = QCLK/256 + EQEP_UNIT_POS_EVNT_DIV_512, //!< UPEVNT = QCLK/512 + EQEP_UNIT_POS_EVNT_DIV_1024, //!< UPEVNT = QCLK/1024 + EQEP_UNIT_POS_EVNT_DIV_2048 //!< UPEVNT = QCLK/2048 +} EQEP_UPEVNTPrescale; + + +//***************************************************************************** +// +//! Values that can be passed to EQEP_setEmulationMode() as the \e emuMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + EQEP_EMULATIONMODE_STOPIMMEDIATELY, //!< Counters stop immediately + EQEP_EMULATIONMODE_STOPATROLLOVER, //!< Counters stop at period rollover + EQEP_EMULATIONMODE_RUNFREE //!< Counter unaffected by suspend +}EQEP_EmulationMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an eQEP base address. +//! +//! \param base specifies the eQEP module base address. +//! +//! This function determines if a eQEP module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +EQEP_isBaseValid(uint32_t base) +{ + return( + (base == EQEP1_BASE) || + (base == EQEP2_BASE) || + (base == EQEP3_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the eQEP module. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the enhanced quadrature encoder pulse +//! (eQEP) module. The module must be configured before it is enabled. +//! +//! \sa EQEP_setConfig() +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable the eQEP module. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_QPEN; +} + +//***************************************************************************** +// +//! Disables the eQEP module. +//! +//! \param base is the base address of the enhanced quadrature encoder pulse +//! (eQEP) module +//! +//! This function disables operation of the eQEP module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable the eQEP module. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_QPEN); +} + +//***************************************************************************** +// +//! Configures eQEP module's quadrature decoder unit. +//! +//! \param base is the base address of the eQEP module. +//! \param config is the configuration for the eQEP module decoder unit. +//! +//! This function configures the operation of the eQEP module's quadrature +//! decoder unit. The \e config parameter provides the configuration +//! of the decoder and is the logical OR of several values: +//! +//! - \b EQEP_CONFIG_2X_RESOLUTION or \b EQEP_CONFIG_1X_RESOLUTION specify +//! if both rising and falling edges should be counted or just rising edges. +//! - \b EQEP_CONFIG_QUADRATURE, \b EQEP_CONFIG_CLOCK_DIR, +//! \b EQEP_CONFIG_UP_COUNT, or \b EQEP_CONFIG_DOWN_COUNT specify if +//! quadrature signals are being provided on QEPA and QEPB, if a direction +//! signal and a clock are being provided, or if the direction should be +//! hard-wired for a single direction with QEPA used for input. +//! - \b EQEP_CONFIG_NO_SWAP or \b EQEP_CONFIG_SWAP to specify if the +//! signals provided on QEPA and QEPB should be swapped before being +//! processed. +//! - \b EQEP_CONFIG_IGATE_DISABLE or \b EQEP_CONFIG_IGATE_ENABLE to specify +//! if the gating of the index pulse should be enabled or disabled +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setDecoderConfig(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the new decoder configuration to the hardware. + // + HWREGH(base + EQEP_O_QDECCTL) = (HWREGH(base + EQEP_O_QDECCTL) & + ~(EQEP_QDECCTL_SWAP | + EQEP_QDECCTL_XCR | + EQEP_QDECCTL_QSRC_M | + EQEP_QDECCTL_IGATE)) | config; +} + +//***************************************************************************** +// +//! Configures eQEP module position counter unit. +//! +//! \param base is the base address of the eQEP module. +//! \param mode is the configuration for the eQEP module position counter. +//! \param maxPosition specifies the maximum position value. +//! +//! This function configures the operation of the eQEP module position +//! counter. The \e mode parameter determines the event on which the position +//! counter gets reset. It should be passed one of the following values: +//! \b EQEP_POSITION_RESET_IDX, \b EQEP_POSITION_RESET_MAX_POS, +//! \b EQEP_POSITION_RESET_1ST_IDX, or \b EQEP_POSITION_RESET_UNIT_TIME_OUT. +//! +//! \e maxPosition is the maximum value of the position counter and is +//! the value used to reset the position capture when moving in the reverse +//! (negative) direction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPositionCounterConfig(uint32_t base, EQEP_PositionResetMode mode, + uint32_t maxPosition) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the position counter reset configuration to the hardware. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~EQEP_QEPCTL_PCRM_M) | (uint16_t)mode; + + // + // Set the maximum position. + // + HWREG(base + EQEP_O_QPOSMAX) = maxPosition; +} + +//***************************************************************************** +// +//! Gets the current encoder position. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the current position of the encoder. Depending upon +//! the configuration of the encoder, and the incident of an index pulse, this +//! value may or may not contain the expected data (that is, if in reset on +//! index mode, if an index pulse has not been encountered, the position +//! counter is not yet aligned with the index pulse). +//! +//! \return The current position of the encoder. +// +//***************************************************************************** +static inline uint32_t +EQEP_getPosition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSCNT)); +} + +//***************************************************************************** +// +//! Sets the current encoder position. +//! +//! \param base is the base address of the eQEP module. +//! \param position is the new position for the encoder. +//! +//! This function sets the current position of the encoder; the encoder +//! position is then measured relative to this value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPosition(uint32_t base, uint32_t position) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the position counter. + // + HWREG(base + EQEP_O_QPOSCNT) = position; +} + +//***************************************************************************** +// +//! Gets the current direction of rotation. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the current direction of rotation. In this case, +//! current means the most recently detected direction of the encoder; it may +//! not be presently moving but this is the direction it last moved before it +//! stopped. +//! +//! \return Returns 1 if moving in the forward direction or -1 if moving in the +//! reverse direction. +// +//***************************************************************************** +static inline int16_t +EQEP_getDirection(uint32_t base) +{ + int16_t direction; + + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the direction of rotation. + // + if((HWREGH(base + EQEP_O_QEPSTS) & EQEP_QEPSTS_QDF) != 0U) + { + direction = 1; + } + else + { + direction = -1; + } + + return(direction); +} + +//***************************************************************************** +// +//! Enables individual eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables eQEP module interrupt sources. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable the specified interrupts. + // + HWREGH(base + EQEP_O_QEINT) |= intFlags; +} + +//***************************************************************************** +// +//! Disables individual eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! +//! This function disables eQEP module interrupt sources. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable the specified interrupts. + // + HWREGH(base + EQEP_O_QEINT) &= ~(intFlags); +} + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the interrupt status for the eQEP module +//! module. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! the following values: +//! - \b EQEP_INT_GLOBAL - Global interrupt flag +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +// +//***************************************************************************** +static inline uint16_t +EQEP_getInterruptStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + return(HWREGH(base + EQEP_O_QFLG)); +} + +//***************************************************************************** +// +//! Clears eQEP module interrupt sources. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! This function clears eQEP module interrupt flags. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_GLOBAL - Global interrupt flag +//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error +//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error +//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change +//! - \b EQEP_INT_WATCHDOG - Watchdog time-out +//! - \b EQEP_INT_UNDERFLOW - Position counter underflow +//! - \b EQEP_INT_OVERFLOW - Position counter overflow +//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready +//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match +//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch +//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch +//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out +//! +//! Note that the \b EQEP_INT_GLOBAL value is the global interrupt flag. In +//! order to get any further eQEP interrupts, this flag must be cleared. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_clearInterruptStatus(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + HWREGH(base + EQEP_O_QCLR) = intFlags; +} + +//***************************************************************************** +// +//! Forces individual eQEP module interrupts. +//! +//! \param base is the base address of the eQEP module. +//! \param intFlags is a bit mask of the interrupt sources to be forced. +//! +//! This function forces eQEP module interrupt flags. The \e intFlags +//! parameter can be any of the following values OR'd together: +//! - \b EQEP_INT_POS_CNT_ERROR +//! - \b EQEP_INT_PHASE_ERROR +//! - \b EQEP_INT_DIR_CHANGE +//! - \b EQEP_INT_WATCHDOG +//! - \b EQEP_INT_UNDERFLOW +//! - \b EQEP_INT_OVERFLOW +//! - \b EQEP_INT_POS_COMP_READY +//! - \b EQEP_INT_POS_COMP_MATCH +//! - \b EQEP_INT_STROBE_EVNT_LATCH +//! - \b EQEP_INT_INDEX_EVNT_LATCH +//! - \b EQEP_INT_UNIT_TIME_OUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_forceInterrupt(uint32_t base, uint16_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Force the specified interrupts. + // + HWREGH(base + EQEP_O_QFRC) |= intFlags; +} + +//***************************************************************************** +// +//! Gets the encoder error indicator. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the error indicator for the eQEP module. It is an +//! error for both of the signals of the quadrature input to change at the same +//! time. +//! +//! \return Returns \b true if an error has occurred and \b false otherwise. +// +//***************************************************************************** +static inline bool +EQEP_getError(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the error indicator. + // + return((HWREGH(base + EQEP_O_QFLG) & EQEP_QFLG_PHE) != 0U); +} + +//***************************************************************************** +// +//! Returns content of the eQEP module status register +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the contents of the status register. The value it +//! returns is an OR of the following values: +//! +//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected +//! - \b EQEP_STS_DIR_ON_1ST_IDX - If set, clockwise rotation (forward +//! movement) occurred on the first index event +//! - \b EQEP_STS_DIR_FLAG - If set, movement is clockwise rotation +//! - \b EQEP_STS_DIR_LATCH - If set, clockwise rotation occurred on last +//! index event marker +//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer +//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position +//! capture events +//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index +//! pulse +//! - \b EQEP_STS_POS_CNT_ERROR - Position counter error occurred +//! +//! \return Returns the value of the QEP status register. +// +//***************************************************************************** +static inline uint16_t +EQEP_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the status register. + // + return(HWREGH(base + EQEP_O_QEPSTS) & 0x00FFU); +} + +//***************************************************************************** +// +//! Clears selected fields of the eQEP module status register +//! +//! \param base is the base address of the eQEP module. +//! \param statusFlags is the bit mask of the status flags to be cleared. +//! +//! This function clears the status register fields indicated by +//! \e statusFlags. The \e statusFlags parameter is the logical OR of any of +//! the following: +//! +//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected +//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer +//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position +//! capture events +//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index +//! pulse +//! +//! \note Only the above status fields can be cleared. All others are +//! read-only, non-sticky fields. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_clearStatus(uint32_t base, uint16_t statusFlags) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + HWREGH(base + EQEP_O_QEPSTS) = statusFlags; +} + +//***************************************************************************** +// +//! Configures eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! \param capPrescale is the prescaler setting of the eQEP capture timer clk. +//! \param evntPrescale is the prescaler setting of the unit position event +//! frequency. +//! +//! This function configures the operation of the eQEP module edge-capture +//! unit. The \e capPrescale parameter provides the configuration of the eQEP +//! capture timer clock rate. It determines by which power of 2 between 1 and +//! 128 inclusive SYSCLKOUT is divided. The macros for this parameter are in +//! the format of EQEP_CAPTURE_CLK_DIV_X, where X is the divide value. For +//! example, \b EQEP_CAPTURE_CLK_DIV_32 will give a capture timer clock +//! frequency that is SYSCLKOUT/32. +//! +//! The \e evntPrescale parameter determines how frequently a unit position +//! event occurs. The macro that can be passed this parameter is in the format +//! EQEP_UNIT_POS_EVNT_DIV_X, where X is the number of quadrature clock +//! periods between unit position events. For example, +//! \b EQEP_UNIT_POS_EVNT_DIV_16 will result in a unit position event +//! frequency of QCLK/16. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setCaptureConfig(uint32_t base, EQEP_CAPCLKPrescale capPrescale, + EQEP_UPEVNTPrescale evntPrescale) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write new prescaler configurations to the appropriate registers. + // + HWREGH(base + EQEP_O_QCAPCTL) = + (HWREGH(base + EQEP_O_QCAPCTL) & + ~(EQEP_QCAPCTL_UPPS_M | EQEP_QCAPCTL_CCPS_M)) | + ((uint16_t)evntPrescale | (uint16_t)capPrescale); +} + +//***************************************************************************** +// +//! Enables the eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the eQEP module's edge-capture unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableCapture(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable edge capture. + // + HWREGH(base + EQEP_O_QCAPCTL) |= EQEP_QCAPCTL_CEN; +} + +//***************************************************************************** +// +//! Disables the eQEP module edge-capture unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's edge-capture unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableCapture(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable edge capture. + // + HWREGH(base + EQEP_O_QCAPCTL) &= ~(EQEP_QCAPCTL_CEN); +} + +//***************************************************************************** +// +//! Gets the encoder capture period. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the period count value between the last successive +//! eQEP position events. +//! +//! \return The period count value between the last successive position events. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCapturePeriod(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the capture period. + // + return(HWREGH(base + EQEP_O_QCPRD)); +} + +//***************************************************************************** +// +//! Gets the encoder capture timer value. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the time base for the edge capture unit. +//! +//! \return The capture timer value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCaptureTimer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the capture timer value. + // + return(HWREGH(base + EQEP_O_QCTMR)); +} + +//***************************************************************************** +// +//! Enables the eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function enables operation of the eQEP module's position-compare unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableCompare(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Enable position compare. + // + HWREGH(base + EQEP_O_QPOSCTL) |= EQEP_QPOSCTL_PCE; +} + +//***************************************************************************** +// +//! Disables the eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's position-compare +//! unit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableCompare(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable position compare. + // + HWREGH(base + EQEP_O_QPOSCTL) &= ~(EQEP_QPOSCTL_PCE); +} + +//***************************************************************************** +// +//! Configures the position-compare unit's sync output pulse width. +//! +//! \param base is the base address of the eQEP module. +//! \param cycles is the width of the pulse that can be generated on a +//! position-compare event. It is in units of 4 SYSCLKOUT cycles. +//! +//! This function configures the width of the sync output pulse. The width of +//! the pulse will be \e cycles * 4 * the width of a SYSCLKOUT cycle. The +//! maximum width is 4096 * 4 * SYSCLKOUT cycles. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setComparePulseWidth(uint32_t base, uint16_t cycles) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + ASSERT(cycles <= (EQEP_QPOSCTL_PCSPW_M + 1U)); + + // + // Set the pulse width. + // + HWREGH(base + EQEP_O_QPOSCTL) = (HWREGH(base + EQEP_O_QPOSCTL) & + ~(uint16_t)EQEP_QPOSCTL_PCSPW_M) | + (cycles - 1U); +} + +//***************************************************************************** +// +//! Loads the eQEP module unit timer period as number of SYSCLK cycles. +//! +//! \param base is the base address of the eQEP module. +//! \param period is period value at which a unit time-out interrupt is set. +//! +//! This function sets the unit time-out interrupt when it matches the value +//! specified by \e period +//! The unit timer is clocked by SYSCLKOUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_loadUnitTimer(uint32_t base, uint32_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the period of the unit timer. + // + HWREG(base + EQEP_O_QUPRD) = period; +} + +//***************************************************************************** +// +//! Enables the eQEP module unit timer. +//! +//! \param base is the base address of the eQEP module. +//! \param period is period value at which a unit time-out interrupt is set. +//! +//! This function enables operation of the eQEP module's peripheral unit timer. +//! The unit timer is clocked by SYSCLKOUT and will set the unit time-out +//! interrupt when it matches the value specified by \e period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableUnitTimer(uint32_t base, uint32_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the period of the unit timer. + // + HWREG(base + EQEP_O_QUPRD) = period; + + // + // Enable peripheral unit timer. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_UTE; +} + +//***************************************************************************** +// +//! Disables the eQEP module unit timer. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's peripheral +//! unit timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableUnitTimer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable peripheral unit timer. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_UTE); +} + +//***************************************************************************** +// +//! Enables the eQEP module watchdog timer. +//! +//! \param base is the base address of the eQEP module. +//! \param period is watchdog period value at which a time-out will occur if +//! no quadrature-clock event is detected. +//! +//! This function enables operation of the eQEP module's peripheral watchdog +//! timer. +//! +//! \note When selecting \e period, note that the watchdog timer is clocked +//! from SYSCLKOUT/64. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_enableWatchdog(uint32_t base, uint16_t period) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the timeout count for the eQEP peripheral watchdog timer. + // + HWREGH(base + EQEP_O_QWDPRD) = period; + + // + // Enable peripheral watchdog. + // + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_WDE; +} + +//***************************************************************************** +// +//! Disables the eQEP module watchdog timer. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function disables operation of the eQEP module's peripheral watchdog +//! timer. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_disableWatchdog(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Disable peripheral watchdog. + // + HWREGH(base + EQEP_O_QEPCTL) &= ~(EQEP_QEPCTL_WDE); +} + +//***************************************************************************** +// +//! Sets the eQEP module watchdog timer value. +//! +//! \param base is the base address of the eQEP module. +//! \param value is the value to be written to the watchdog timer. +//! +//! This function sets the eQEP module's watchdog timer value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setWatchdogTimerValue(uint32_t base, uint16_t value) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the value to the watchdog timer register. + // + HWREGH(base + EQEP_O_QWDTMR) = value; +} + +//***************************************************************************** +// +//! Gets the eQEP module watchdog timer value. +//! +//! \param base is the base address of the eQEP module. +//! +//! \return Returns the current watchdog timer value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getWatchdogTimerValue(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Read the value from the watchdog timer register. + // + return(HWREGH(base + EQEP_O_QWDTMR)); +} + +//***************************************************************************** +// +//! Configures the mode in which the position counter is initialized. +//! +//! \param base is the base address of the eQEP module. +//! \param initMode is the configuration for initializing the position count. +//! See below for a description of this parameter. +//! +//! This function configures the events on which the position count can be +//! initialized. The \e initMode parameter provides the mode as either +//! \b EQEP_INIT_DO_NOTHING (no action configured) or one of the following +//! strobe events, index events, or a logical OR of both a strobe event and an +//! index event. +//! +//! - \b EQEP_INIT_RISING_STROBE or \b EQEP_INIT_EDGE_DIR_STROBE specify +//! which strobe event will initialize the position counter. +//! - \b EQEP_INIT_RISING_INDEX or \b EQEP_INIT_FALLING_INDEX specify +//! which index event will initialize the position counter. +//! +//! Use EQEP_setSWPositionInit() to cause a software initialization and +//! EQEP_setInitialPosition() to set the value that gets loaded into the +//! position counter upon initialization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setPositionInitMode(uint32_t base, uint16_t initMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the init mode in the QEP Control register. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~(EQEP_QEPCTL_IEI_M | EQEP_QEPCTL_SEI_M)) | + initMode; +} + +//***************************************************************************** +// +//! Sets the software initialization of the encoder position counter. +//! +//! \param base is the base address of the eQEP module. +//! \param initialize is a flag to specify if software initialization of the +//! position counter is enabled. +//! +//! This function does a software initialization of the position counter when +//! the \e initialize parameter is \b true. When \b false, the QEPCTL[SWI] bit +//! is cleared and no action is taken. +//! +//! The init value to be loaded into the position counter can be set with +//! EQEP_setInitialPosition(). Additional initialization causes can be +//! configured with EQEP_setPositionInitMode(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setSWPositionInit(uint32_t base, bool initialize) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set or clear the software initialization bit. + // + if(initialize) + { + HWREGH(base + EQEP_O_QEPCTL) |= EQEP_QEPCTL_SWI; + } + else + { + HWREGH(base + EQEP_O_QEPCTL) &= ~EQEP_QEPCTL_SWI; + } +} + +//***************************************************************************** +// +//! Sets the init value for the encoder position counter. +//! +//! \param base is the base address of the eQEP module. +//! \param position is the value to be written to the position counter upon. +//! initialization. +//! +//! This function sets the init value for position of the encoder. See +//! EQEP_setPositionInitMode() to set the initialization cause or +//! EQEP_setSWPositionInit() to cause a software initialization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setInitialPosition(uint32_t base, uint32_t position) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write position to position counter init register + // + HWREG(base + EQEP_O_QPOSINIT) = position; +} + +//***************************************************************************** +// +//! Configures the quadrature modes in which the position count can be latched. +//! +//! \param base is the base address of the eQEP module. +//! \param latchMode is the configuration for latching of the position count +//! and several other registers. See below for a description of this +//! parameter. +//! +//! This function configures the events on which the position count and several +//! other registers can be latched. The \e latchMode parameter provides the +//! mode as the logical OR of several values. +//! +//! - \b EQEP_LATCH_CNT_READ_BY_CPU or \b EQEP_LATCH_UNIT_TIME_OUT specify +//! the event that latches the position counter. This latch register can be +//! read using EQEP_getPositionLatch(). The capture timer and capture +//! period are also latched based on this setting, and can be read using +//! EQEP_getCaptureTimerLatch() and EQEP_getCapturePeriodLatch(). +//! - \b EQEP_LATCH_RISING_STROBE or \b EQEP_LATCH_EDGE_DIR_STROBE +//! specify which strobe event will latch the position counter into the +//! strobe position latch register. This register can be read with +//! EQEP_getStrobePositionLatch(). +//! - \b EQEP_LATCH_RISING_INDEX, \b EQEP_LATCH_FALLING_INDEX, or +//! \b EQEP_LATCH_SW_INDEX_MARKER specify which index event will latch the +//! position counter into the index position latch register. This register +//! can be read with EQEP_getIndexPositionLatch(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setLatchMode(uint32_t base, uint32_t latchMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Set the latch mode in the QEP Control register. + // + HWREGH(base + EQEP_O_QEPCTL) = (HWREGH(base + EQEP_O_QEPCTL) & + ~(EQEP_QEPCTL_QCLM | EQEP_QEPCTL_IEL_M | + EQEP_QEPCTL_SEL)) | latchMode; +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on an index event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the index position latch register. The +//! position counter is latched into this register on either a rising index +//! edge, a falling index edge, or a software index marker. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The position count latched on an index event. +// +//***************************************************************************** +static inline uint32_t +EQEP_getIndexPositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSILAT)); +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on a strobe event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the strobe position latch register. The +//! position counter can be configured to be latched into this register on +//! rising strobe edges only or on rising strobe edges while moving clockwise +//! and falling strobe edges while moving counter-clockwise. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The position count latched on a strobe event. +// +//***************************************************************************** +static inline uint32_t +EQEP_getStrobePositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSSLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder position that was latched on a unit time-out event. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the position latch register. The +//! position counter is latched into this register either on a unit time-out +//! event. +//! +//! \return The position count latch register value. +// +//***************************************************************************** +static inline uint32_t +EQEP_getPositionLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREG(base + EQEP_O_QPOSLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder capture timer latch. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the capture timer latch register. The +//! capture timer value is latched into this register either on a unit time-out +//! event or upon the CPU reading the eQEP position counter. This is configured +//! using EQEP_setLatchMode(). +//! +//! \return The edge-capture timer latch value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCaptureTimerLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREGH(base + EQEP_O_QCTMRLAT)); +} + +//***************************************************************************** +// +//! Gets the encoder capture period latch. +//! +//! \param base is the base address of the eQEP module. +//! +//! This function returns the value in the capture period latch register. The +//! capture period value is latched into this register either on a unit +//! time-out event or upon the CPU reading the eQEP position counter. This is +//! configured using EQEP_setLatchMode(). +//! +//! \return The edge-capture period latch value. +// +//***************************************************************************** +static inline uint16_t +EQEP_getCapturePeriodLatch(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Return the current position counter. + // + return(HWREGH(base + EQEP_O_QCPRDLAT)); +} + +//***************************************************************************** +// +//! Set the emulation mode of the eQEP module. +//! +//! \param base is the base address of the eQEP module. +//! \param emuMode is the mode operation upon an emulation suspend. +//! +//! This function sets the eQEP module's emulation mode. This mode determines +//! how the timers are affected by an emulation suspend. Valid values for the +//! \e emuMode parameter are the following: +//! +//! - \b EQEP_EMULATIONMODE_STOPIMMEDIATELY - The position counter, watchdog +//! counter, unit timer, and capture timer all stop immediately. +//! - \b EQEP_EMULATIONMODE_STOPATROLLOVER - The position counter, watchdog +//! counter, unit timer all count until period rollover. The capture timer +//! counts until the next unit period event. +//! - \b EQEP_EMULATIONMODE_RUNFREE - The position counter, watchdog counter, +//! unit timer, and capture timer are all unaffected by an emulation suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +EQEP_setEmulationMode(uint32_t base, EQEP_EmulationMode emuMode) +{ + // + // Check the arguments. + // + ASSERT(EQEP_isBaseValid(base)); + + // + // Write the emulation mode to the FREE_SOFT bits. + // + HWREGH(base + EQEP_O_QEPCTL) = + (HWREGH(base + EQEP_O_QEPCTL) & ~EQEP_QEPCTL_FREE_SOFT_M) | + ((uint16_t)emuMode << EQEP_QEPCTL_FREE_SOFT_S); +} + +//***************************************************************************** +// +//! Configures eQEP module position-compare unit. +//! +//! \param base is the base address of the eQEP module. +//! \param config is the configuration for the eQEP module +//! position-compare unit. See below for a description of this parameter. +//! \param compareValue is the value to which the position count value is +//! compared for a position-compare event. +//! \param cycles is the width of the pulse that can be generated on a +//! position-compare event. It is in units of 4 SYSCLKOUT cycles. +//! +//! This function configures the operation of the eQEP module position-compare +//! unit. The \e config parameter provides the configuration of the +//! position-compare unit and is the logical OR of several values: +//! +//! - \b EQEP_COMPARE_NO_SYNC_OUT, \b EQEP_COMPARE_IDX_SYNC_OUT, or +//! \b EQEP_COMPARE_STROBE_SYNC_OUT specify if there is a sync output pulse +//! and which pin should be used. +//! - \b EQEP_COMPARE_NO_SHADOW, \b EQEP_COMPARE_LOAD_ON_ZERO, or +//! \b EQEP_COMPARE_LOAD_ON_MATCH specify if a shadow is enabled and when +//! should the load should occur--QPOSCNT = 0 or QPOSCNT = QPOSCOMP. +//! +//! The \e cycles is used to select the width of the sync output pulse. The +//! width of the resulting pulse will be \e cycles * 4 * the width of a +//! SYSCLKOUT cycle. The maximum width is 4096 * 4 * SYSCLKOUT cycles. +//! +//! \note You can set the sync pulse width independently using the +//! EQEP_setComparePulseWidth() function. +//! +//! \return None. +// +//***************************************************************************** +extern void +EQEP_setCompareConfig(uint32_t base, uint16_t config, uint32_t compareValue, + uint16_t cycles); + +//***************************************************************************** +// +//! Sets the polarity of the eQEP module's input signals. +//! +//! \param base is the base address of the eQEP module. +//! \param invertQEPA is the flag to negate the QEPA input. +//! \param invertQEPB is the flag to negate the QEPA input. +//! \param invertIndex is the flag to negate the index input. +//! \param invertStrobe is the flag to negate the strobe input. +//! +//! This function configures the polarity of the inputs to the eQEP module. To +//! negate the polarity of any of the input signals, pass \b true into its +//! corresponding parameter in this function. Pass \b false to leave it as-is. +//! +//! \return None. +// +//***************************************************************************** +extern void +EQEP_setInputPolarity(uint32_t base, bool invertQEPA, bool invertQEPB, + bool invertIndex, bool invertStrobe); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // EQEP_H diff --git a/gpio_driverlib_cpu1/device/driverlib/flash.c b/gpio_driverlib_cpu1/device/driverlib/flash.c new file mode 100644 index 0000000..372b77b --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/flash.c @@ -0,0 +1,175 @@ +//########################################################################### +// +// FILE: flash.c +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "flash.h" + +#ifndef __cplusplus +#pragma CODE_SECTION(Flash_initModule, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_powerDown, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_wakeFromLPM, ".TI.ramfunc"); +#endif + +//***************************************************************************** +// +// Flash_initModule +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT(waitstates <= 0xFU); + + // + // Set the bank power up delay so that the bank will power up properly. + // + Flash_setBankPowerUpDelay(ctrlBase, 0x14); + + // + // Set the bank fallback power mode to active. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_ACTIVE); + + // + // Power up flash bank and pump and this also sets the fall back mode of + // flash and pump as active + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_ACTIVE); + + // + // Disable cache and prefetch mechanism before changing wait states + // + Flash_disableCache(ctrlBase); + Flash_disablePrefetch(ctrlBase); + + // + // Set waitstates according to frequency. + // + Flash_setWaitstates(ctrlBase, waitstates); + + + // + // Enable cache and prefetch mechanism to improve performance of code + // executed from flash. + // + Flash_enableCache(ctrlBase); + Flash_enablePrefetch(ctrlBase); + + // + // At reset, ECC is enabled. If it is disabled by application software and + // if application again wants to enable ECC. + // + Flash_enableECC(eccBase); + + // + // Force a pipeline flush to ensure that the write to the last register + // configured occurs before returning. + // + + FLASH_DELAY_CONFIG; +} + +//***************************************************************************** +// +// Flash_powerDown +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_powerDown(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // Set the bank power up delay so that it will power up properly. + // + Flash_setBankPowerUpDelay(ctrlBase, 0x14); + + // + // Power down the flash bank. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_SLEEP); + + // + // Power down the flash pump. + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_SLEEP); +} + +//***************************************************************************** +// +// Flash_wakeFromLPM +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +void +Flash_wakeFromLPM(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // Set the bank fallback power modes to active. + // + Flash_setBankPowerMode(ctrlBase, FLASH_BANK, FLASH_BANK_PWR_ACTIVE); + + // + // Set the flash pump power mode to active. + // + Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_ACTIVE); +} diff --git a/gpio_driverlib_cpu1/device/driverlib/flash.h b/gpio_driverlib_cpu1/device/driverlib/flash.h new file mode 100644 index 0000000..a60a2f2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/flash.h @@ -0,0 +1,1671 @@ +//########################################################################### +// +// FILE: flash.h +// +// TITLE: C28x Flash driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef FLASH_H +#define FLASH_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif +#ifndef __TMS320C28XX_CLA__ + +//***************************************************************************** +// +//! \addtogroup flash_api Flash +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_flash.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +#ifndef __cplusplus +#pragma CODE_SECTION(Flash_setBankPowerMode, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_setPumpPowerMode, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_disableCache, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_disablePrefetch, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_setWaitstates, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enableCache, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enablePrefetch, ".TI.ramfunc"); +#pragma CODE_SECTION(Flash_enableECC, ".TI.ramfunc"); +#endif + + +//***************************************************************************** +// +//! Values that can be passed to Flash_setBankPowerMode() as the bank parameter +// +//***************************************************************************** +typedef enum +{ + FLASH_BANK = 0x0 //!< Bank +} Flash_BankNumber; + +//***************************************************************************** +// +//! Values that can be passed to Flash_claimPumpSemaphore() in order to claim +//! the pump semaphore. +// +//***************************************************************************** +typedef enum +{ + FLASH_CPU1_WRAPPER = 0x2, //!< CPU1 Wrapper + FLASH_CPU2_WRAPPER = 0x1 //!< CPU2 Wrapper +}Flash_PumpOwnership; + +//***************************************************************************** +// +//! Values that can be passed to Flash_setBankPowerMode() as the powerMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + FLASH_BANK_PWR_SLEEP = 0x0, //!< Sleep fallback mode + FLASH_BANK_PWR_STANDBY = 0x1, //!< Standby fallback mode + FLASH_BANK_PWR_ACTIVE = 0x3 //!< Active fallback mode +} Flash_BankPowerMode; + +//***************************************************************************** +// +//! Values that can be passed to Flash_setPumpPowerMode() as the powerMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + FLASH_PUMP_PWR_SLEEP = 0x0, //!< Sleep fallback mode + FLASH_PUMP_PWR_ACTIVE = 0x1 //!< Active fallback mode +} Flash_PumpPowerMode; + +//***************************************************************************** +// +//! Type that correspond to values returned from Flash_getLowErrorStatus() and +//! Flash_getHighErrorStatus() determining the error status code. +// +//***************************************************************************** +typedef enum +{ + FLASH_NO_ERR = 0x0, //!< No error + FLASH_FAIL_0 = 0x1, //!< Fail on 0 + FLASH_FAIL_1 = 0x2, //!< Fail on 1 + FLASH_UNC_ERR = 0x4 //!< Uncorrectable error +} Flash_ErrorStatus; + +//***************************************************************************** +// +//! Values that can be returned from Flash_getLowErrorType() and +//! Flash_getHighErrorType() determining the error type. +// +//***************************************************************************** +typedef enum +{ + FLASH_DATA_ERR = 0x0, //!< Data error + FLASH_ECC_ERR = 0x1 //!< ECC error +} Flash_ErrorType; + +//***************************************************************************** +// +//! Values that can be returned from Flash_getECCTestSingleBitErrorType(). +// +//***************************************************************************** +typedef enum +{ + FLASH_DATA_BITS = 0x0, //!< Data bits + FLASH_CHECK_BITS = 0x1 //!< ECC bits +} Flash_SingleBitErrorIndicator; + +//***************************************************************************** +// +// Values that can be passed to Flash_clearLowErrorStatus and +// Flash_clearHighErrorStatus. +// +//***************************************************************************** +#define FLASH_FAIL_0_CLR 0x1 //!< Fail-0 clear +#define FLASH_FAIL_1_CLR 0x2 //!< Fail-1 clear +#define FLASH_UNC_ERR_CLR 0x4 //!< Uncorrectable error Clear + +//***************************************************************************** +// +// Values that can be returned from Flash_getInterruptFlag and +// Flash_getECCTestStatus. +// +//***************************************************************************** +#define FLASH_NO_ERROR 0x0 //!< No error +#define FLASH_SINGLE_ERROR 0x1 //!< Single bit error +#define FLASH_UNC_ERROR 0x2 //!< Uncorrectable error + +//***************************************************************************** +// +// Delay instruction that allows for register configuration to complete. +// +//***************************************************************************** +#define FLASH_DELAY_CONFIG __asm(" RPT #7 || NOP") + +//***************************************************************************** +// +// Key value for claiming the pump semaphore. +// +//***************************************************************************** +#define FLASH_PUMP_KEY 0x5A5A0000UL //!< Pump semaphore key + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a flash wrapper base address for the control registers. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function determines if a flash wrapper control base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isCtrlBaseValid(uint32_t ctrlBase) +{ + return((ctrlBase == FLASH0CTRL_BASE)); +} +#endif + +//***************************************************************************** +// +//! \internal +//! Checks a flash wrapper base address for the ECC registers. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function determines if a flash wrapper ECC base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isECCBaseValid(uint32_t eccBase) +{ + return((eccBase == FLASH0ECC_BASE)); +} +#endif + +//***************************************************************************** +// +//! \internal +//! Checks a flash pump semaphore base address. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! +//! This function determines if a flash pump semaphore base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +Flash_isPumpSemBaseValid(uint32_t pumpSemBase) +{ + return((pumpSemBase == FLASHPUMPSEMAPHORE_BASE)); +} +#endif + +//***************************************************************************** +// +//! Sets the random read wait state amount. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param waitstates is the wait-state value. +//! +//! This function sets the number of wait states for a flash read access. The +//! \e waitstates parameter is a number between 0 and 15. It is \b important +//! to look at your device's datasheet for information about what the required +//! minimum flash wait-state is for your selected SYSCLK frequency. +//! +//! By default the wait state amount is configured to the maximum 15. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setWaitstates(uint32_t ctrlBase, uint16_t waitstates) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // waitstates is 4 bits wide. + // + ASSERT(waitstates <= 0xFU); + + EALLOW; + // + // Write flash read wait-state amount to appropriate register. + // + HWREG(ctrlBase + FLASH_O_FRDCNTL) = + (HWREG(ctrlBase + FLASH_O_FRDCNTL) & + ~(uint32_t)FLASH_FRDCNTL_RWAIT_M) | + ((uint32_t)waitstates << FLASH_FRDCNTL_RWAIT_S); + EDIS; +} + +//***************************************************************************** +// +//! Sets the fallback power mode of a flash bank. +//! +//! \param ctrlBase is the base address of the flash wrapper registers. +//! \param bank is the flash bank that is being configured. +//! \param powerMode is the power mode to be entered. +//! +//! This function sets the fallback power mode of the flash bank specified by +//! them \e bank parameter. The power mode is specified by the \e powerMode +//! parameter with one of the following values: +//! +//! - \b FLASH_BANK_PWR_SLEEP - Sense amplifiers and sense reference disabled. +//! - \b FLASH_BANK_PWR_STANDBY - Sense amplifiers disabled but sense reference +//! enabled. +//! - \b FLASH_BANK_PWR_ACTIVE - Sense amplifiers and sense reference enabled. +//! +//! +//! Note: There is only one Flash_BankNumber value on this device (FLASH_BANK). +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setBankPowerMode(uint32_t ctrlBase, Flash_BankNumber bank, + Flash_BankPowerMode powerMode) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Write the power mode to the appropriate register. + // + HWREG(ctrlBase + FLASH_O_FBFALLBACK) = + (HWREG(ctrlBase + FLASH_O_FBFALLBACK) & + ~((FLASH_FBFALLBACK_BNKPWR0_M) << ((uint32_t)bank * 2U))) | + ((uint32_t)powerMode << ((uint32_t)bank * 2U)); + EDIS; +} + +//***************************************************************************** +// +//! Sets the fallback power mode of the charge pump. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param powerMode is the power mode to be entered. +//! +//! This function sets the fallback power mode flash charge pump. +//! +//! - \b FLASH_PUMP_PWR_SLEEP - All circuits disabled. +//! - \b FLASH_PUMP_PWR_ACTIVE - All pump circuits active. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_setPumpPowerMode(uint32_t ctrlBase, Flash_PumpPowerMode powerMode) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Write the power mode to the appropriate register. + // + HWREG(ctrlBase + FLASH_O_FPAC1) = + (HWREG(ctrlBase + FLASH_O_FPAC1) & + ~(uint32_t)FLASH_FPAC1_PMPPWR) | (uint32_t)powerMode; + EDIS; +} + +//***************************************************************************** +// +//! Enables prefetch mechanism. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enablePrefetch(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Set the prefetch enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) |= + FLASH_FRD_INTF_CTRL_PREFETCH_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables prefetch mechanism. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_disablePrefetch(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Clear the prefetch enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) &= + ~(uint32_t)FLASH_FRD_INTF_CTRL_PREFETCH_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enables data cache. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enableCache(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Set the data cache enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) |= + FLASH_FRD_INTF_CTRL_DATA_CACHE_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables data cache. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_disableCache(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + EALLOW; + + // + // Clear the data cache enable bit. + // + HWREG(ctrlBase + FLASH_O_FRD_INTF_CTRL) &= + ~(uint32_t)FLASH_FRD_INTF_CTRL_DATA_CACHE_EN; + EDIS; +} + +//***************************************************************************** +// +//! Enables flash error correction code (ECC) protection. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +#ifdef __cplusplus +#pragma CODE_SECTION(".TI.ramfunc"); +#endif +static inline void +Flash_enableECC(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + + // + // Write the key value 0xA to ECC_ENABLE register. + // + HWREG(eccBase + FLASH_O_ECC_ENABLE) = + (HWREG(eccBase + FLASH_O_ECC_ENABLE) & + ~(uint32_t)FLASH_ECC_ENABLE_ENABLE_M) | 0xAU; + EDIS; +} + +//***************************************************************************** +// +//! Disables flash error correction code (ECC) protection. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_disableECC(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + + // + // Clear ECC enable field with the one's complement of the key. + // + HWREG(eccBase + FLASH_O_ECC_ENABLE) = + (HWREG(eccBase + FLASH_O_ECC_ENABLE) & + ~(uint32_t)FLASH_ECC_ENABLE_ENABLE_M) | 0x5U; + EDIS; +} + + +//***************************************************************************** +// +//! Sets the bank power up delay. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param delay is the number of HCLK cycles. +//! +//! This function sets the VREADST delay to ensure that the requisite delay is +//! introduced for the flash pump/bank to come out of low-power mode, so that +//! the flash/OTP is ready for CPU access. +//! +//! Note: Refer to TRM before configuring VREADST. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setBankPowerUpDelay(uint32_t ctrlBase, uint16_t delay) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + ASSERT(delay <= 0xFF); + + EALLOW; + + // + // Write period to the BAGP of the FBAC register. + // + HWREG(ctrlBase + FLASH_O_FBAC) = (HWREG(ctrlBase + FLASH_O_FBAC) & + ~(uint32_t)FLASH_FBAC_VREADST_M) | delay; + EDIS; +} + +//***************************************************************************** +// +//! Sets the pump wake up time. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param sysclkCycles is the number of SYSCLK cycles it takes for the pump +//! to wakeup. +//! +//! This function sets the wakeup time with \e sysclkCycles parameter. +//! The \e sysclkCycles is a value between 0 and 8190. When the charge pump +//! exits sleep power mode, it will take sysclkCycles to wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setPumpWakeupTime(uint32_t ctrlBase, uint16_t sysclkCycles) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + // + // PSLEEP = sysclkCycles/2. PSLEEP maximum value is 4095(12 bits wide) + // + ASSERT( sysclkCycles <= 8190U ); + + EALLOW; + + // + // Write sysclkCycles/2 to PSLEEP of the FPAC1 register. + // + HWREG(ctrlBase + FLASH_O_FPAC1) = + (HWREG(ctrlBase + FLASH_O_FPAC1) & + ~(uint32_t)FLASH_FPAC1_PSLEEP_M) | + (((uint32_t)sysclkCycles / (uint32_t)2) << + (uint32_t)FLASH_FPAC1_PSLEEP_S); + EDIS; +} + +//***************************************************************************** +// +//! Reads the bank active power state. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param bank is the flash bank that is being used. +//! +//! \return Returns \b true if the Bank is in Active power state and \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +Flash_isBankReady(uint32_t ctrlBase, Flash_BankNumber bank) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + bool ready; + uint32_t bitMask = (uint32_t)FLASH_FBPRDY_BANKRDY << (uint32_t)bank; + // + // Return the BANKXRDY bit in FBPRDY. + // + if((HWREG(ctrlBase + FLASH_O_FBPRDY) & bitMask) == bitMask) + { + ready = true; + } + else + { + ready = false; + } + return(ready); +} + +//***************************************************************************** +// +//! Reads the pump active power state. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! \return Returns \b true if the Pump is in Active power state and \b false +//! otherwise. +// +//***************************************************************************** +static inline bool +Flash_isPumpReady(uint32_t ctrlBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isCtrlBaseValid(ctrlBase)); + + bool ready; + + // + // Return the PUMPRDY bit in FBPRDY. + // + if((HWREG(ctrlBase + FLASH_O_FBPRDY) & + (uint32_t)FLASH_FBPRDY_PUMPRDY) == FLASH_FBPRDY_PUMPRDY) + { + ready = true; + } + else + { + ready = false; + } + return(ready); +} + + +//***************************************************************************** +// +//! Gets the single error address low. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the single bit error that +//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where a single bit +//! error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getSingleBitErrorAddressLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_SINGLE_ERR_ADDR_LOW)); +} + +//***************************************************************************** +// +//! Gets the single error address high. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the single bit error that +//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where a single bit +//! error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getSingleBitErrorAddressHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_SINGLE_ERR_ADDR_HIGH)); +} + +//***************************************************************************** +// +//! Gets the uncorrectable error address low. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the 32-bit address of the uncorrectable error that +//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where an +//! uncorrectable error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getUncorrectableErrorAddressLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_UNC_ERR_ADDR_LOW)); +} + +//***************************************************************************** +// +//! Gets the uncorrectable error address high. +//! +//! \param eccBase is the base address of the flash wrapper ECC base. +//! +//! This function returns the 32-bit address of the uncorrectable error that +//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The +//! returned address is to that 64-bit aligned data. +//! +//! \return Returns the 32 bits of a 64-bit aligned address where an +//! uncorrectable error occurred. +// +//***************************************************************************** +static inline uint32_t +Flash_getUncorrectableErrorAddressHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_UNC_ERR_ADDR_HIGH)); +} + +//***************************************************************************** +// +//! Gets the error status of the Lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error status of the lower 64-bits of a 128-bit +//! aligned address. +//! +//! \return Returns value of the low error status bits which can be used with +//! Flash_ErrorStatus type. +// +//***************************************************************************** +static inline Flash_ErrorStatus +Flash_getLowErrorStatus(uint32_t eccBase) +{ + uint32_t errorStatus; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Get the Low Error Status bits + // + errorStatus = (HWREG(eccBase + FLASH_O_ERR_STATUS) & 0x7UL); + return((Flash_ErrorStatus)errorStatus); +} + +//***************************************************************************** +// +//! Gets the error status of the Upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error status of the upper 64-bits of a 128-bit +//! aligned address. +//! +//! \return Returns value of the high error status bits which can be used with +//! Flash_ErrorStatus type. +// +//***************************************************************************** +static inline Flash_ErrorStatus +Flash_getHighErrorStatus(uint32_t eccBase) +{ + uint32_t errorStatus; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Get the High Error Status bits + // + errorStatus = ((HWREG(eccBase + FLASH_O_ERR_STATUS) >> 16U) & 0x7UL); + return((Flash_ErrorStatus)errorStatus); +} + +//***************************************************************************** +// +//! Gets the error position of the lower 64-bits for a single bit error. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error position of the lower 64-bits. If the +//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges +//! from 0-63 for FLASH_DATA_ERR. +//! +//! \return Returns the position of the lower error bit. +// +//***************************************************************************** +static inline uint32_t +Flash_getLowErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return((HWREG(eccBase + FLASH_O_ERR_POS) & + (uint32_t)FLASH_ERR_POS_ERR_POS_L_M) >> + FLASH_ERR_POS_ERR_POS_L_S); +} + +//***************************************************************************** +// +//! Gets the error position of the upper 64-bits for a single bit error. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error position of the upper 64-bits. If the +//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges +//! from 0-63 for FLASH_DATA_ERR. +//! +//! \return Returns the position of the upper error bit. +// +//***************************************************************************** +static inline uint32_t +Flash_getHighErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return((HWREG(eccBase + FLASH_O_ERR_POS) & + (uint32_t)FLASH_ERR_POS_ERR_POS_H_M) >> + FLASH_ERR_POS_ERR_POS_H_S); +} + +//***************************************************************************** +// +//! Gets the error type of the lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error type of the lower 64-bits. The error type +//! can be FLASH_ECC_ERR or FLASH_DATA_ERR. +//! +//! \return Returns the type of the lower 64-bit error. +// +//***************************************************************************** +static inline Flash_ErrorType +Flash_getLowErrorType(uint32_t eccBase) +{ + Flash_ErrorType errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Check which error type. + // If bit is 1 then ECC error, else it is a Data error. + // + if((HWREG(eccBase + FLASH_O_ERR_POS) & FLASH_ERR_POS_ERR_TYPE_L) + == FLASH_ERR_POS_ERR_TYPE_L) + { + errorType = FLASH_ECC_ERR; + } + else + { + errorType = FLASH_DATA_ERR; + } + + return(errorType); +} + +//***************************************************************************** +// +//! Gets the error type of the upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the error type of the upper 64-bits. The error type +//! can be FLASH_ECC_ERR or FLASH_DATA_ERR. +//! +//! \return Returns the type of the upper 64-bit error. +// +//***************************************************************************** +static inline Flash_ErrorType +Flash_getHighErrorType(uint32_t eccBase) +{ + Flash_ErrorType errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Check which error type. + // If bit is 1 then ECC error, else it is a Data error. + // + if((HWREG(eccBase + FLASH_O_ERR_POS) & FLASH_ERR_POS_ERR_TYPE_H) + == FLASH_ERR_POS_ERR_TYPE_H) + { + errorType = FLASH_ECC_ERR; + } + else + { + errorType = FLASH_DATA_ERR; + } + + return(errorType); +} +//***************************************************************************** +// +//! Clears the errors status of the lower 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param errorStatus is the error status to clear. errorStatus is a uint16_t. +//! errorStatus is a bitwise OR of the following value: +//! +//! - \b FLASH_FAIL_0_CLR +//! - \b FLASH_FAIL_1_CLR +//! - \b FLASH_UNC_ERR_CLR +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearLowErrorStatus(uint32_t eccBase, uint16_t errorStatus) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT( errorStatus <= 7U ); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_STATUS_CLR) |= ((uint32_t)errorStatus); + EDIS; +} + +//***************************************************************************** +// +//! Clears the errors status of the upper 64-bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param errorStatus is the error status to clear. errorStatus is a uint16_t. +//! errorStatus is a bitwise OR of the following value: +//! +//! - \b FLASH_FAIL_0_CLR +//! - \b FLASH_FAIL_1_CLR +//! - \b FLASH_UNC_ERR_CLR +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearHighErrorStatus(uint32_t eccBase, uint16_t errorStatus) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + ASSERT( errorStatus <= 7U ); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_STATUS_CLR) |= ((uint32_t)errorStatus << 16U); + EDIS; +} + +//***************************************************************************** +// +//! Gets the single bit error count. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the single bit error count. +// +//***************************************************************************** +static inline uint32_t +Flash_getErrorCount(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_ERR_CNT) & + (uint32_t)FLASH_ERR_CNT_ERR_CNT_M); +} + +//***************************************************************************** +// +//! Sets the single bit error threshold. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param threshold is the single bit error threshold. Valid ranges are from +//! 0-65535. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setErrorThreshold(uint32_t eccBase, uint16_t threshold) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_THRESHOLD) = ((uint32_t)threshold & + (uint32_t)FLASH_ERR_THRESHOLD_ERR_THRESHOLD_M); + EDIS; +} + +//***************************************************************************** +// +//! Gets the error interrupt. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the type of error interrupt that occurred. The +//! values can be used with +//! - \b FLASH_NO_ERROR +//! - \b FLASH_SINGLE_ERROR +//! - \b FLASH_UNC_ERROR +//! +//! \return Returns the interrupt flag. +// +//***************************************************************************** +static inline uint32_t +Flash_getInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read which type of error occurred. + // + return((HWREG(eccBase + FLASH_O_ERR_INTFLG) & (uint32_t)0x3U)); +} + +//***************************************************************************** +// +//! Clears the single error interrupt flag. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearSingleErrorInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_INTCLR) |= + FLASH_ERR_INTCLR_SINGLE_ERR_INTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Clears the uncorrectable error interrupt flag. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_clearUncorrectableInterruptFlag(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_ERR_INTCLR) |= + FLASH_ERR_INTCLR_UNC_ERR_INTCLR; + EDIS; +} + +//***************************************************************************** +// +//! Sets the Data Low Test register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param data is a 32-bit value that is the low double word of selected +//! 64-bit data +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setDataLowECCTest(uint32_t eccBase, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FDATAL_TEST) = data; + EDIS; +} + +//***************************************************************************** +// +//! Sets the Data High Test register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param data is a 32-bit value that is the high double word of selected +//! 64-bit data +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setDataHighECCTest(uint32_t eccBase, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FDATAH_TEST) = data; + EDIS; +} + +//***************************************************************************** +// +//! Sets the test address register for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param address is a 32-bit value containing an address. Bits 21-3 will be +//! used as the flash word (128-bit) address. +//! +//! This function left shifts the address 1 bit to convert it to a byte address +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setECCTestAddress(uint32_t eccBase, uint32_t address) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Left shift the address 1 bit to make it byte-addressable + // + uint32_t byteAddress = address << 1; + + EALLOW; + + // + // Write bits 21-3 to the register. + // + HWREG(eccBase + FLASH_O_FADDR_TEST) = byteAddress; + + EDIS; + +} + +//***************************************************************************** +// +//! Sets the ECC test bits for ECC testing. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param ecc is a 32-bit value. The least significant 8 bits are used as +//! the ECC Control Bits in the ECC Test. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_setECCTestECCBits(uint32_t eccBase, uint16_t ecc) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + ASSERT( ecc <= 255U ); + EALLOW; + + // + // Write the 8 ECC Control Bits. + // + HWREG(eccBase + FLASH_O_FECC_TEST) = + ((uint32_t)ecc & (uint32_t)FLASH_FECC_TEST_ECC_M); + EDIS; +} + +//***************************************************************************** +// +//! Enables ECC Test mode. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_enableECCTestMode(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_ECC_TEST_EN; + EDIS; +} + +//***************************************************************************** +// +//! Disables ECC Test mode. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_disableECCTestMode(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) &= + ~(uint32_t)FLASH_FECC_CTRL_ECC_TEST_EN; + EDIS; +} + +//***************************************************************************** +// +//! Selects the ECC block on bits [63:0] of bank data. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_selectLowECCBlock(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) &= + ~(uint32_t)FLASH_FECC_CTRL_ECC_SELECT; + EDIS; +} + +//***************************************************************************** +// +//! Selects the ECC block on bits [127:64] of bank data. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_selectHighECCBlock(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_ECC_SELECT; + EDIS; +} + +//***************************************************************************** +// +//! Performs the ECC calculation on the test block. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_performECCCalculation(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + EALLOW; + HWREG(eccBase + FLASH_O_FECC_CTRL) |= FLASH_FECC_CTRL_DO_ECC_CALC; + EDIS; +} + +//***************************************************************************** +// +//! Gets the ECC Test data out high 63:32 bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC TEst data out High. +// +//***************************************************************************** +static inline uint32_t +Flash_getTestDataOutHigh(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_FOUTH_TEST)); +} + +//***************************************************************************** +// +//! Gets the ECC Test data out low 31:0 bits. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC Test data out Low. +// +//***************************************************************************** +static inline uint32_t +Flash_getTestDataOutLow(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + return(HWREG(eccBase + FLASH_O_FOUTL_TEST)); +} + +//***************************************************************************** +// +//! Gets the ECC Test status. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! This function returns the ECC test status. The values can be used with +//! - \b FLASH_NO_ERROR +//! - \b FLASH_SINGLE_ERROR +//! - \b FLASH_UNC_ERROR +//! +//! \return Returns the ECC test status. +// +//***************************************************************************** +static inline uint32_t +Flash_getECCTestStatus(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read which type of error occurred. + // + return((HWREG(eccBase + FLASH_O_FECC_STATUS)) & (uint32_t)0x3U); +} + +//***************************************************************************** +// +//! Gets the ECC Test single bit error position. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the ECC Test single bit error position. If the error type +//! is check bits than the position can range from 0 to 7. If the error type +//! is data bits than the position can range from 0 to 63. +// +//***************************************************************************** +static inline uint32_t +Flash_getECCTestErrorPosition(uint32_t eccBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read the position bits and shift it to the right. + // + return((HWREG(eccBase + FLASH_O_FECC_STATUS) & + (uint32_t)FLASH_FECC_STATUS_DATA_ERR_POS_M) >> + FLASH_FECC_STATUS_DATA_ERR_POS_S); +} + +//***************************************************************************** +// +//! Gets the single bit error type. +//! +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! +//! \return Returns the single bit error type as a +//! Flash_SingleBitErrorIndicator. FLASH_DATA_BITS and FLASH_CHECK_BITS +//! indicate where the single bit error occurred. +// +//***************************************************************************** +static inline Flash_SingleBitErrorIndicator +Flash_getECCTestSingleBitErrorType(uint32_t eccBase) +{ + uint32_t errorType; + // + // Check the arguments. + // + ASSERT(Flash_isECCBaseValid(eccBase)); + + // + // Read the ERR_TYPE bit to see where the single bit error was. + // + errorType = ((HWREG(eccBase + FLASH_O_FECC_STATUS) & + (uint32_t)FLASH_FECC_STATUS_ERR_TYPE) >> 8U); + return((Flash_SingleBitErrorIndicator)errorType); +} + +//***************************************************************************** +// +//! Claim the flash pump semaphore. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! \param wrapper is the Flash_PumpOwnership wrapper claiming the pump +//! semaphore. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_claimPumpSemaphore(uint32_t pumpSemBase, Flash_PumpOwnership wrapper) +{ + // + // Check the arguments. + // + ASSERT(Flash_isPumpSemBaseValid(pumpSemBase)); + + // + // Block until the pump semaphore is claimed. + // + EALLOW; + while((HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) + & FLASH_PUMPREQUEST_PUMP_OWNERSHIP_M) != wrapper) + { + HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) = + FLASH_PUMP_KEY | (uint32_t)wrapper; + } + EDIS; +} + +//***************************************************************************** +// +//! Release the flash pump semaphore. +//! +//! \param pumpSemBase is the base address of the flash pump semaphore. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Flash_releasePumpSemaphore(uint32_t pumpSemBase) +{ + // + // Check the arguments. + // + ASSERT(Flash_isPumpSemBaseValid(pumpSemBase)); + + // + // Relinquish the pump semaphore. + // + EALLOW; + HWREG(pumpSemBase + FLASH_O_PUMPREQUEST) = FLASH_PUMP_KEY; + EDIS; +} + +//***************************************************************************** +// +//! Initializes the flash control registers. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! \param eccBase is the base address of the flash wrapper ECC registers. +//! \param waitstates is the wait-state value. +//! +//! This function initializes the flash control registers. At reset bank and +//! pump are in sleep. A flash access will power up the bank and pump +//! automatically. This function will power up Flash bank and pump and set the +//! fallback mode of flash and pump as active. +//! +//! This function also sets the number of wait-states for a flash access +//! (see Flash_setWaitstates() for more details), and enables cache, the +//! prefetch mechanism, and ECC. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates); + + +//***************************************************************************** +// +//! Powers down the flash. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function powers down the flash bank(s) and the flash pump. +//! +//! Note: For this device, you must claim the flash pump semaphore before +//! calling this function and powering down the pump. Afterwards, you may want +//! to relinquish the flash pump. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_powerDown(uint32_t ctrlBase); + +//***************************************************************************** +// +//! Wakes the flash from low power mode. +//! +//! \param ctrlBase is the base address of the flash wrapper control registers. +//! +//! This function will power up Flash bank and pump and set the +//! fallback mode of flash and pump as active. +//! +//! \return None. +// +//***************************************************************************** +extern void +Flash_wakeFromLPM(uint32_t ctrlBase); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** +#endif // #ifdef __TMS320C28XX_CLA__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // FLASH_H diff --git a/gpio_driverlib_cpu1/device/driverlib/gpio.c b/gpio_driverlib_cpu1/device/driverlib/gpio.c new file mode 100644 index 0000000..be20285 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/gpio.c @@ -0,0 +1,489 @@ +//########################################################################### +// +// FILE: gpio.c +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "gpio.h" + +//***************************************************************************** +// +// GPIO_setDirectionMode +// +//***************************************************************************** +void +GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + EALLOW; + + // + // Set the data direction + // + if(pinIO == GPIO_DIR_MODE_OUT) + { + // + // Output + // + gpioBaseAddr[GPIO_GPxDIR_INDEX] |= pinMask; + } + else + { + // + // Input + // + gpioBaseAddr[GPIO_GPxDIR_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getDirectionMode +// +//***************************************************************************** +GPIO_Direction +GPIO_getDirectionMode(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + return((GPIO_Direction)((uint32_t)((gpioBaseAddr[GPIO_GPxDIR_INDEX] >> + (pin % 32U)) & 1U))); + +} + +//***************************************************************************** +// +// GPIO_setInterruptPin +// +//***************************************************************************** +void +GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum) +{ + XBAR_InputNum input; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + // + // Pick the X-BAR input that corresponds to the requested XINT. + // + switch(extIntNum) + { + case GPIO_INT_XINT1: + input = XBAR_INPUT4; + break; + + case GPIO_INT_XINT2: + input = XBAR_INPUT5; + break; + + case GPIO_INT_XINT3: + input = XBAR_INPUT6; + break; + + case GPIO_INT_XINT4: + input = XBAR_INPUT13; + break; + + case GPIO_INT_XINT5: + input = XBAR_INPUT14; + break; + + default: + // + // Invalid interrupt. Shouldn't happen if enum value is used. + // XBAR_INPUT1 isn't tied to an XINT, so we'll use it to check for + // a bad value. + // + input = XBAR_INPUT1; + break; + } + + if(input != XBAR_INPUT1) + { + XBAR_setInputPin(input, (uint16_t)pin); + } +} + +//***************************************************************************** +// +// GPIO_setPadConfig +// +//***************************************************************************** +void +GPIO_setPadConfig(uint32_t pin, uint32_t pinType) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + EALLOW; + + // + // Enable open drain if necessary + // + if((pinType & GPIO_PIN_TYPE_OD) != 0U) + { + gpioBaseAddr[GPIO_GPxODR_INDEX] |= pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxODR_INDEX] &= ~pinMask; + } + + // + // Enable pull-up if necessary + // + if((pinType & GPIO_PIN_TYPE_PULLUP) != 0U) + { + gpioBaseAddr[GPIO_GPxPUD_INDEX] &= ~pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxPUD_INDEX] |= pinMask; + } + + // + // Invert polarity if necessary + // + if((pinType & GPIO_PIN_TYPE_INVERT) != 0U) + { + gpioBaseAddr[GPIO_GPxINV_INDEX] |= pinMask; + } + else + { + gpioBaseAddr[GPIO_GPxINV_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getPadConfig +// +//***************************************************************************** +uint32_t +GPIO_getPadConfig(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + uint32_t pinTypeRes; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + pinMask = (uint32_t)1U << (pin % 32U); + + pinTypeRes = GPIO_PIN_TYPE_STD; + + // + // Get open drain value + // + if((gpioBaseAddr[GPIO_GPxODR_INDEX] & pinMask) != 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_OD; + } + + // + // Get pull-up value + // + if((gpioBaseAddr[GPIO_GPxPUD_INDEX] & pinMask) == 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_PULLUP; + } + + // + // Get polarity value + // + if((gpioBaseAddr[GPIO_GPxINV_INDEX] & pinMask) != 0U) + { + pinTypeRes |= GPIO_PIN_TYPE_INVERT; + } + + return(pinTypeRes); +} + +//***************************************************************************** +// +// GPIO_setQualificationMode +// +//***************************************************************************** +void +GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t qSelIndex; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPAQSEL1_GPIO1_S * (pin % 16U); + qSelIndex = GPIO_GPxQSEL_INDEX + ((pin % 32U) / 16U); + + // + // Write the input qualification mode to the register. + // + EALLOW; + + gpioBaseAddr[qSelIndex] &= ~((uint32_t)GPIO_GPAQSEL1_GPIO0_M << shiftAmt); + gpioBaseAddr[qSelIndex] |= (uint32_t)qualification << shiftAmt; + + EDIS; +} + +//***************************************************************************** +// +// GPIO_getQualificationMode +// +//***************************************************************************** +GPIO_QualificationMode +GPIO_getQualificationMode(uint32_t pin) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t qSelIndex; + uint32_t qualRes; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPAQSEL1_GPIO1_S * (pin % 16U); + qSelIndex = GPIO_GPxQSEL_INDEX + ((pin % 32U) / 16U); + + // + // Read the qualification mode register and shift and mask to get the + // value for the specified pin. + // + qualRes = (gpioBaseAddr[qSelIndex] >> shiftAmt) & + (uint32_t)GPIO_GPAQSEL1_GPIO0_M; + return((GPIO_QualificationMode)qualRes); +} + +//***************************************************************************** +// +// GPIO_setQualificationPeriod +// +//***************************************************************************** +void +GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask, regVal, shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + ASSERT((divider >= 1U) && (divider <= 510U)); + + shiftAmt = (pin % 32U) & ~((uint32_t)0x7U); + pinMask = (uint32_t)0xFFU << shiftAmt; + + // + // Divide divider by two to get the value that needs to go into the field. + // Then shift it into the right place. + // + regVal = (divider / 2U) << shiftAmt; + + // + // Write the divider parameter into the register. + // + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioBaseAddr[GPIO_GPxCTRL_INDEX] &= ~pinMask; + gpioBaseAddr[GPIO_GPxCTRL_INDEX] |= regVal; + EDIS; +} + +//***************************************************************************** +// +// GPIO_setControllerCore +// +//***************************************************************************** +void +GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t cSelIndex; + uint32_t shiftAmt; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + shiftAmt = (uint32_t)GPIO_GPACSEL1_GPIO1_S * (pin % 8U); + cSelIndex = GPIO_GPxCSEL_INDEX + ((pin % 32U) / 8U); + + // + // Write the core parameter into the register. + // + EALLOW; + gpioBaseAddr[cSelIndex] &= ~((uint32_t)GPIO_GPACSEL1_GPIO0_M << shiftAmt); + gpioBaseAddr[cSelIndex] |= (uint32_t)core << shiftAmt; + EDIS; +} + +//***************************************************************************** +// +// GPIO_setAnalogMode +// +//***************************************************************************** +void +GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode) +{ + volatile uint32_t *gpioBaseAddr; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT((pin == 42U) || (pin == 43U)); + + pinMask = (uint32_t)1U << (pin % 32U); + gpioBaseAddr = (uint32_t *)GPIOCTRL_BASE + + ((pin / 32U) * GPIO_CTRL_REGS_STEP); + + EALLOW; + + // + // Set the analog mode selection. + // + if(mode == GPIO_ANALOG_ENABLED) + { + // + // Enable analog mode + // + gpioBaseAddr[GPIO_GPxAMSEL_INDEX] |= pinMask; + } + else + { + // + // Disable analog mode + // + gpioBaseAddr[GPIO_GPxAMSEL_INDEX] &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +// GPIO_setPinConfig +// +//***************************************************************************** +void +GPIO_setPinConfig(uint32_t pinConfig) +{ + uint32_t muxRegAddr; + uint32_t pinMask, shiftAmt; + + muxRegAddr = (uint32_t)GPIOCTRL_BASE + (pinConfig >> 16); + shiftAmt = ((pinConfig >> 8) & (uint32_t)0xFFU); + pinMask = (uint32_t)0x3U << shiftAmt; + + EALLOW; + + // + // Clear fields in MUX register first to avoid glitches + // + HWREG(muxRegAddr) &= ~pinMask; + + // + // Write value into GMUX register + // + HWREG(muxRegAddr + GPIO_MUX_TO_GMUX) = + (HWREG(muxRegAddr + GPIO_MUX_TO_GMUX) & ~pinMask) | + (((pinConfig >> 2) & (uint32_t)0x3U) << shiftAmt); + + // + // Write value into MUX register + // + HWREG(muxRegAddr) |= ((pinConfig & (uint32_t)0x3U) << shiftAmt); + EDIS; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/gpio.h b/gpio_driverlib_cpu1/device/driverlib/gpio.h new file mode 100644 index 0000000..05ae80a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/gpio.h @@ -0,0 +1,1047 @@ +//########################################################################### +// +// FILE: gpio.h +// +// TITLE: C28x GPIO driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef GPIO_H +#define GPIO_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup gpio_api GPIO +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_gpio.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_xint.h" +#include "cpu.h" +#include "xbar.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions to access gpio registers. +// Not intended for use by application code. +// +// Divide by 2 is for C28x which has word access +// +//***************************************************************************** +#define GPIO_CTRL_REGS_STEP ((GPIO_O_GPBCTRL - GPIO_O_GPACTRL) / 2U) +#define GPIO_DATA_REGS_STEP ((GPIO_O_GPBDAT - GPIO_O_GPADAT) / 2U) + +#define GPIO_GPxCTRL_INDEX (GPIO_O_GPACTRL / 2U) +#define GPIO_GPxQSEL_INDEX (GPIO_O_GPAQSEL1 / 2U) +#define GPIO_GPxMUX_INDEX (GPIO_O_GPAMUX1 / 2U) +#define GPIO_GPxDIR_INDEX (GPIO_O_GPADIR / 2U) +#define GPIO_GPxAMSEL_INDEX (0x00000014U / 2U) // Address rsvd for GPAAMSEL +#define GPIO_GPxPUD_INDEX (GPIO_O_GPAPUD / 2U) +#define GPIO_GPxINV_INDEX (GPIO_O_GPAINV / 2U) +#define GPIO_GPxODR_INDEX (GPIO_O_GPAODR / 2U) +#define GPIO_GPxGMUX_INDEX (GPIO_O_GPAGMUX1 / 2U) +#define GPIO_GPxCSEL_INDEX (GPIO_O_GPACSEL1 / 2U) +#define GPIO_GPxLOCK_INDEX (GPIO_O_GPALOCK / 2U) +#define GPIO_GPxCR_INDEX (GPIO_O_GPACR / 2U) + +#define GPIO_GPxDAT_INDEX (GPIO_O_GPADAT / 2U) +#define GPIO_GPxSET_INDEX (GPIO_O_GPASET / 2U) +#define GPIO_GPxCLEAR_INDEX (GPIO_O_GPACLEAR / 2U) +#define GPIO_GPxTOGGLE_INDEX (GPIO_O_GPATOGGLE / 2U) + +#define GPIO_MUX_TO_GMUX (GPIO_O_GPAGMUX1 - GPIO_O_GPAMUX1) + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to GPIO_setPadConfig() as the pinType parameter +// and returned by GPIO_getPadConfig(). +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x0000U //!< Push-pull output or floating input +#define GPIO_PIN_TYPE_PULLUP 0x0001U //!< Pull-up enable for input +#define GPIO_PIN_TYPE_INVERT 0x0002U //!< Invert polarity on input +#define GPIO_PIN_TYPE_OD 0x0004U //!< Open-drain on output +#endif + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setDirectionMode() as the \e pinIO +//! parameter and returned from GPIO_getDirectionMode(). +// +//***************************************************************************** +typedef enum +{ + GPIO_DIR_MODE_IN, //!< Pin is a GPIO input + GPIO_DIR_MODE_OUT //!< Pin is a GPIO output +} GPIO_Direction; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setInterruptType() as the \e intType +//! parameter and returned from GPIO_getInterruptType(). +// +//***************************************************************************** +typedef enum +{ + GPIO_INT_TYPE_FALLING_EDGE = 0x00, //!< Interrupt on falling edge + GPIO_INT_TYPE_RISING_EDGE = 0x04, //!< Interrupt on rising edge + GPIO_INT_TYPE_BOTH_EDGES = 0x0C //!< Interrupt on both edges +} GPIO_IntType; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setQualificationMode() as the +//! \e qualification parameter and returned by GPIO_getQualificationMode(). +// +//***************************************************************************** +typedef enum +{ + GPIO_QUAL_SYNC, //!< Synchronization to SYSCLK + GPIO_QUAL_3SAMPLE, //!< Qualified with 3 samples + GPIO_QUAL_6SAMPLE, //!< Qualified with 6 samples + GPIO_QUAL_ASYNC //!< No synchronization +} GPIO_QualificationMode; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setAnalogMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_ANALOG_DISABLED, //!< Pin is in digital mode + GPIO_ANALOG_ENABLED //!< Pin is in analog mode +} GPIO_AnalogMode; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setControllerCore() as the \e core +//! parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_CORE_CPU1, //!< CPU1 selected as controller core + GPIO_CORE_CPU1_CLA1, //!< CPU1's CLA1 selected as controller core + GPIO_CORE_CPU2, //!< CPU2 selected as controller core + GPIO_CORE_CPU2_CLA1 //!< CPU2's CLA1 selected as controller core +} GPIO_CoreSelect; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_readPortData(), GPIO_setPortPins(), +//! GPIO_clearPortPins(), and GPIO_togglePortPins() as the \e port parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_PORT_A = 0, //!< GPIO port A + GPIO_PORT_B = 1, //!< GPIO port B + GPIO_PORT_C = 2, //!< GPIO port C + GPIO_PORT_D = 3, //!< GPIO port D + GPIO_PORT_E = 4, //!< GPIO port E + GPIO_PORT_F = 5 //!< GPIO port F +} GPIO_Port; + +//***************************************************************************** +// +//! Values that can be passed to GPIO_setInterruptPin(), +//! GPIO_setInterruptType(), GPIO_getInterruptType(), GPIO_enableInterrupt(), +//! GPIO_disableInterrupt(), as the \e extIntNum parameter. +// +//***************************************************************************** +typedef enum +{ + GPIO_INT_XINT1, //!< External Interrupt 1 + GPIO_INT_XINT2, //!< External Interrupt 2 + GPIO_INT_XINT3, //!< External Interrupt 3 + GPIO_INT_XINT4, //!< External Interrupt 4 + GPIO_INT_XINT5 //!< External Interrupt 5 +} GPIO_ExternalIntNum; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks that a pin number is valid for a device. +//! +//! Note that this function reflects the highest possible GPIO number of a +//! device on its biggest package. Check the datasheet to see what the actual +//! range of valid pin numbers is for a specific package. +//! +//! \return None. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +GPIO_isPinValid(uint32_t pin) +{ + return(pin <= 168U); +} +#endif + +//***************************************************************************** +// +//! Sets the interrupt type for the specified pin. +//! +//! \param extIntNum specifies the external interrupt. +//! \param intType specifies the type of interrupt trigger mechanism. +//! +//! This function sets up the various interrupt trigger mechanisms for the +//! specified pin on the selected GPIO port. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! One of the following flags can be used to define the \e intType +//! parameter: +//! +//! - \b GPIO_INT_TYPE_FALLING_EDGE sets detection to edge and trigger to +//! falling +//! - \b GPIO_INT_TYPE_RISING_EDGE sets detection to edge and trigger to rising +//! - \b GPIO_INT_TYPE_BOTH_EDGES sets detection to both edges +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_setInterruptType(GPIO_ExternalIntNum extIntNum, GPIO_IntType intType) +{ + // + // Write the selected polarity to the appropriate register. + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) = + (HWREGH(XINT_BASE + (uint16_t)extIntNum) & ~XINT_1CR_POLARITY_M) | + (uint16_t)intType; +} + +//***************************************************************************** +// +//! Gets the interrupt type for a pin. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function gets the interrupt type for a interrupt. The interrupt can be +//! configured as a falling-edge, rising-edge, or both-edges detected +//! interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return Returns one of the flags described for GPIO_setInterruptType(). +// +//***************************************************************************** +static inline GPIO_IntType +GPIO_getInterruptType(GPIO_ExternalIntNum extIntNum) +{ + // + // Read the selected polarity from the appropriate register. + // + return((GPIO_IntType)((uint16_t)(HWREGH(XINT_BASE + (uint16_t)extIntNum) & + XINT_1CR_POLARITY_M))); +} + +//***************************************************************************** +// +//! Enables the specified external interrupt. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function enables the indicated external interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_enableInterrupt(GPIO_ExternalIntNum extIntNum) +{ + // + // Set the enable bit for the specified interrupt. + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) |= XINT_1CR_ENABLE; +} + +//***************************************************************************** +// +//! Disables the specified external interrupt. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! This function disables the indicated external interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_disableInterrupt(GPIO_ExternalIntNum extIntNum) +{ + // + // Clear the enable bit for the specified interrupt + // + HWREGH(XINT_BASE + (uint16_t)extIntNum) &= ~XINT_1CR_ENABLE; +} + +//***************************************************************************** +// +//! Gets the value of the external interrupt counter. +//! +//! \param extIntNum specifies the external interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! +//! \b Note: The counter is clocked at the SYSCLKOUT rate. +//! +//! \return Returns external interrupt counter value. +// +//***************************************************************************** +static inline uint16_t +GPIO_getInterruptCounter(GPIO_ExternalIntNum extIntNum) +{ + ASSERT(extIntNum <= GPIO_INT_XINT3); + + // + // Read the counter value from the appropriate register. + // + return((HWREGH(XINT_BASE + XINT_O_1CTR + (uint16_t)extIntNum))); +} + +//***************************************************************************** +// +//! Reads the value present on the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! The value at the specified pin are read, as specified by \e pin. The value +//! is returned for both input and output pins. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return Returns the value in the data register for the specified pin. +// +//***************************************************************************** +static inline uint32_t +GPIO_readPin(uint32_t pin) +{ + volatile uint32_t *gpioDataReg; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + return((gpioDataReg[GPIO_GPxDAT_INDEX] >> (pin % 32U)) & (uint32_t)0x1U); +} + + +//***************************************************************************** +// +//! Writes a value to the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param outVal is the value to write to the pin. +//! +//! Writes the corresponding bit values to the output pin specified by +//! \e pin. Writing to a pin configured as an input pin has no effect. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_writePin(uint32_t pin, uint32_t outVal) +{ + volatile uint32_t *gpioDataReg; + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + pinMask = (uint32_t)1U << (pin % 32U); + + if(outVal == 0U) + { + gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask; + } + else + { + gpioDataReg[GPIO_GPxSET_INDEX] = pinMask; + } +} + +//***************************************************************************** +// +//! Toggles the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! Writes the corresponding bit values to the output pin specified by +//! \e pin. Writing to a pin configured as an input pin has no effect. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_togglePin(uint32_t pin) +{ + volatile uint32_t *gpioDataReg; + + // + // Check the arguments. + // + ASSERT(GPIO_isPinValid(pin)); + + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((pin / 32U) * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxTOGGLE_INDEX] = (uint32_t)1U << (pin % 32U); +} + +//***************************************************************************** +// +//! Reads the data on the specified port. +//! +//! \param port is the GPIO port being accessed in the form of \b GPIO_PORT_X +//! where X is the port letter. +//! +//! \return Returns the value available on pin for the specified port. Each +//! bit of the the return value represents a pin on the port, where bit 0 +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, and so on. +// +//***************************************************************************** +static inline uint32_t +GPIO_readPortData(GPIO_Port port) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and return DATA. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + return(gpioDataReg[GPIO_GPxDAT_INDEX]); +} + + +//***************************************************************************** +// +//! Writes a value to the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param outVal is the value to write to the port. +//! +//! This function writes the value \e outVal to the port specified by the +//! \e port parameter which takes a value in the form of \b GPIO_PORT_X where X +//! is the port letter. For example, use \b GPIO_PORT_A to affect port A +//! (GPIOs 0-31). +//! +//! The \e outVal is a bit-packed value, where each bit represents a bit on a +//! GPIO port. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO port +//! pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_writePortData(GPIO_Port port, uint32_t outVal) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to DATA. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxDAT_INDEX] = outVal; +} + +//***************************************************************************** +// +//! Sets all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function sets all of the pins specified by the \e pinMask parameter on +//! the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be set. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO +//! port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_setPortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to SET. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxSET_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Clears all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function clears all of the pins specified by the \e pinMask parameter +//! on the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is \b set +//! identifies the pin to be cleared. Bit 0 represents GPIO port pin 0, bit 1 +//! represents GPIO port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_clearPortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to CLEAR. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxCLEAR_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Toggles all of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function toggles all of the pins specified by the \e pinMask parameter +//! on the port specified by the \e port parameter which takes a value in the +//! form of \b GPIO_PORT_X where X is the port letter. For example, use +//! \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be toggled. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_togglePortPins(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to TOGGLE. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIODATA_BASE) + + ((uint32_t)port * GPIO_DATA_REGS_STEP); + + gpioDataReg[GPIO_GPxTOGGLE_INDEX] = pinMask; +} + +//***************************************************************************** +// +//! Locks the configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function locks the configuration registers of the pins specified by +//! the \e pinMask parameter on the port specified by the \e port parameter +//! which takes a value in the form of \b GPIO_PORT_X where X is the port +//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! Note that this function is for locking the configuration of a pin such as +//! the pin muxing, direction, open drain mode, and other settings. It does not +//! affect the ability to change the value of the pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_lockPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxLOCK_INDEX] |= pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Unlocks the configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function unlocks the configuration registers of the pins specified by +//! the \e pinMask parameter on the port specified by the \e port parameter +//! which takes a value in the form of \b GPIO_PORT_X where X is the port +//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be unlocked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_unlockPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxLOCK_INDEX] &= ~pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Commits the lock configuration of the specified pins on the specified port. +//! +//! \param port is the GPIO port being accessed. +//! \param pinMask is a mask of which of the 32 pins on the port are affected. +//! +//! This function commits the lock configuration registers of the pins +//! specified by the \e pinMask parameter on the port specified by the \e port +//! parameter which takes a value in the form of \b GPIO_PORT_X where X is the +//! port letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31). +//! +//! The \e pinMask is a bit-packed value, where each bit that is set identifies +//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on. +//! +//! Note that once this function is called, GPIO_lockPortConfig() and +//! GPIO_unlockPortConfig() will no longer have any effect on the specified +//! pins. +//! +//! \return None. +// +//***************************************************************************** +static inline void +GPIO_commitPortConfig(GPIO_Port port, uint32_t pinMask) +{ + volatile uint32_t *gpioDataReg; + + // + // Get the starting address of the port's registers and write to the lock. + // + gpioDataReg = (uint32_t *)((uintptr_t)GPIOCTRL_BASE) + + ((uint32_t)port * GPIO_CTRL_REGS_STEP); + + EALLOW; + gpioDataReg[GPIO_GPxCR_INDEX] |= pinMask; + EDIS; +} + +//***************************************************************************** +// +//! Sets the direction and mode of the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param pinIO is the pin direction mode. +//! +//! This function configures the specified pin on the selected GPIO port as +//! either input or output. +//! +//! The parameter \e pinIO is an enumerated data type that can be one of the +//! following values: +//! +//! - \b GPIO_DIR_MODE_IN +//! - \b GPIO_DIR_MODE_OUT +//! +//! where \b GPIO_DIR_MODE_IN specifies that the pin is programmed as an input +//! and \b GPIO_DIR_MODE_OUT specifies that the pin is programmed as an output. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO); + +//***************************************************************************** +// +//! Gets the direction mode of a pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! This function gets the direction mode for a specified pin. The pin can be +//! configured as either an input or output The type of direction is returned +//! as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIO_setDirectionMode(). +// +//***************************************************************************** +extern GPIO_Direction +GPIO_getDirectionMode(uint32_t pin); + +//***************************************************************************** +// +//! Sets the pin for the specified external interrupt. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param extIntNum specifies the external interrupt. +//! +//! This function sets which pin triggers the selected external interrupt. +//! +//! The following defines can be used to specify the external interrupt for the +//! \e extIntNum parameter: +//! +//! - \b GPIO_INT_XINT1 +//! - \b GPIO_INT_XINT2 +//! - \b GPIO_INT_XINT3 +//! - \b GPIO_INT_XINT4 +//! - \b GPIO_INT_XINT5 +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \sa XBAR_setInputPin() +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum); + +//***************************************************************************** +// +//! Sets the pad configuration for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param pinType specifies the pin type. +//! +//! This function sets the pin type for the specified pin. The parameter +//! \e pinType can be the following values: +//! +//! - \b GPIO_PIN_TYPE_STD specifies a push-pull output or a floating input +//! - \b GPIO_PIN_TYPE_PULLUP specifies the pull-up is enabled for an input +//! - \b GPIO_PIN_TYPE_OD specifies an open-drain output pin +//! - \b GPIO_PIN_TYPE_INVERT specifies inverted polarity on an input +//! +//! \b GPIO_PIN_TYPE_INVERT may be OR-ed with \b GPIO_PIN_TYPE_STD or +//! \b GPIO_PIN_TYPE_PULLUP. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setPadConfig(uint32_t pin, uint32_t pinType); + +//***************************************************************************** +// +//! Gets the pad configuration for a pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! This function returns the pin type for the specified pin. The value +//! returned corresponds to the values used in GPIO_setPadConfig(). +//! +//! \return Returns a bit field of the values \b GPIO_PIN_TYPE_STD, +//! \b GPIO_PIN_TYPE_PULLUP, \b GPIO_PIN_TYPE_OD, and \b GPIO_PIN_TYPE_INVERT. +// +//***************************************************************************** +extern uint32_t +GPIO_getPadConfig(uint32_t pin); + +//***************************************************************************** +// +//! Sets the qualification mode for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param qualification specifies the qualification mode of the pin. +//! +//! This function sets the qualification mode for the specified pin. The +//! parameter \e qualification can be one of the following values: +//! - \b GPIO_QUAL_SYNC +//! - \b GPIO_QUAL_3SAMPLE +//! - \b GPIO_QUAL_6SAMPLE +//! - \b GPIO_QUAL_ASYNC +//! +//! To set the qualification sampling period, use +//! GPIO_setQualificationPeriod(). +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification); + +//***************************************************************************** +// +//! Gets the qualification type for the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! +//! \return Returns the qualification mode in the form of one of the values +//! \b GPIO_QUAL_SYNC, \b GPIO_QUAL_3SAMPLE, \b GPIO_QUAL_6SAMPLE, or +//! \b GPIO_QUAL_ASYNC. +// +//***************************************************************************** +extern GPIO_QualificationMode +GPIO_getQualificationMode(uint32_t pin); + +//***************************************************************************** +// +//! Sets the qualification period for a set of pins +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param divider specifies the output drive strength. +//! +//! This function sets the qualification period for a set of \b 8 \b pins, +//! specified by the \e pin parameter. For instance, passing in 3 as the value +//! of \e pin will set the qualification period for GPIO0 through GPIO7, and a +//! value of 98 will set the qualification period for GPIO96 through GPIO103. +//! This is because the register field that configures the divider is shared. +//! +//! To think of this in terms of an equation, configuring \e pin as \b n will +//! configure GPIO (n & ~(7)) through GPIO ((n & ~(7)) + 7). +//! +//! \e divider is the value by which the frequency of SYSCLKOUT is divided. It +//! can be 1 or an even value between 2 and 510 inclusive. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider); + +//***************************************************************************** +// +//! Selects the controller core of a specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param core is the core that is controller of the specified pin. +//! +//! This function configures which core owns the specified pin's data registers +//! (DATA, SET, CLEAR, and TOGGLE). The \e core parameter is an enumerated data +//! type that specifies the core, such as \b GPIO_CORE_CPU1_CLA1 to make CPU1's +//! CLA1 controller of the pin. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core); + +//***************************************************************************** +// +//! Sets the analog mode of the specified pin. +//! +//! \param pin is the identifying GPIO number of the pin. +//! \param mode is the selected analog mode. +//! +//! This function configures the specified pin for either analog or digital +//! mode. Not all GPIO pins have the ability to be switched to analog mode, +//! so refer to the technical reference manual for details. This setting should +//! be thought of as another level of muxing. +//! +//! The parameter \e mode is an enumerated data type that can be one of the +//! following values: +//! +//! - \b GPIO_ANALOG_DISABLED - Pin is in digital mode +//! - \b GPIO_ANALOG_ENABLED - Pin is in analog mode +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \b Note: The pin parameter is applicable for both AIO and GPIO because +//! the GPAxMSEL.GPIOy register configures for both +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode); + +//***************************************************************************** +// +//! Configures the alternate function of a GPIO pin. +//! +//! \param pinConfig is the pin configuration value, specified as only one +//! of the \b GPIO_#_???? values. +//! +//! This function configures the pin mux that selects the peripheral function +//! associated with a particular GPIO pin. Only one peripheral function at a +//! time can be associated with a GPIO pin, and each peripheral function should +//! only be associated with a single GPIO pin at a time (despite the fact that +//! many of them can be associated with more than one GPIO pin). +//! +//! The available mappings are supplied in pin_map.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +GPIO_setPinConfig(uint32_t pinConfig); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // GPIO_H diff --git a/gpio_driverlib_cpu1/device/driverlib/hrpwm.c b/gpio_driverlib_cpu1/device/driverlib/hrpwm.c new file mode 100644 index 0000000..04aa22c --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/hrpwm.c @@ -0,0 +1,47 @@ +//########################################################################### +// +// FILE: hrpwm.c +// +// TITLE: C28x HRPWM driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "hrpwm.h" + +// +// All the API functions are in-lined in hrpwm.h +// diff --git a/gpio_driverlib_cpu1/device/driverlib/hrpwm.h b/gpio_driverlib_cpu1/device/driverlib/hrpwm.h new file mode 100644 index 0000000..2561d67 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/hrpwm.h @@ -0,0 +1,1657 @@ +//############################################################################# +// +// FILE: hrpwm.h +// +// TITLE: C28x HRPWM Driver +// +//############################################################################# +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//############################################################################# + +#ifndef HRPWM_H +#define HRPWM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup hrpwm_api HRPWM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_hrpwm.h" +#include "cpu.h" +#include "debug.h" +#include "epwm.h" +#include "hrpwm.h" + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setMEPEdgeSelect(), +//! HRPWM_setMEPControlMode(), HRPWM_setCounterCompareShadowLoadEvent() +//! as the \e channel parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_CHANNEL_A = 0, //!< HRPWM A + HRPWM_CHANNEL_B = 8 //!< HRPWM B +} HRPWM_Channel; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setMEPEdgeSelect() as the \e mepEdgeMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! HRPWM is disabled + HRPWM_MEP_CTRL_DISABLE = 0, + //! MEP controls rising edge + HRPWM_MEP_CTRL_RISING_EDGE = 1, + //! MEP controls falling edge + HRPWM_MEP_CTRL_FALLING_EDGE = 2, + //! MEP controls both rising and falling edge + HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE = 3 +} HRPWM_MEPEdgeMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setHRMEPCtrlMode() as the \e +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! CMPAHR/CMPBHR or TBPRDHR controls MEP edge + HRPWM_MEP_DUTY_PERIOD_CTRL = 0, + //! TBPHSHR controls MEP edge + HRPWM_MEP_PHASE_CTRL = 1 +} HRPWM_MEPCtrlMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setCounterCompareShadowLoadEvent(), +//! HRPWM_setRisingEdgeDelayLoadMode() and HRPWM_setFallingEdgeDelayLoadMode +//! as the \e loadEvent parameter. +// +//***************************************************************************** +typedef enum +{ + //! load when counter equals zero + HRPWM_LOAD_ON_CNTR_ZERO = 0, + //! load when counter equals period + HRPWM_LOAD_ON_CNTR_PERIOD = 1, + //! load when counter equals zero or period + HRPWM_LOAD_ON_CNTR_ZERO_PERIOD = 2, +} HRPWM_LoadMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setChannelBOutputPath() as the \e +//! outputOnB parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_OUTPUT_ON_B_NORMAL = 0, //!< ePWMxB output is normal. + HRPWM_OUTPUT_ON_B_INV_A = 1 //!< ePWMxB output is inverted + //!< version of ePWMxA signal +} HRPWM_ChannelBOutput; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setSyncPulseSource() as the \e +//! syncPulseSource parameter. +// +//***************************************************************************** +typedef enum +{ + //! Counter equals Period + HRPWM_PWMSYNC_SOURCE_PERIOD = 0, + //! Counter equals zero + HRPWM_PWMSYNC_SOURCE_ZERO = 1, + //! Counter equals COMPC when counting up + HRPWM_PWMSYNC_SOURCE_COMPC_UP = 4, + //! Counter equals COMPC when counting down + HRPWM_PWMSYNC_SOURCE_COMPC_DOWN = 5, + //! Counter equals COMPD when counting up + HRPWM_PWMSYNC_SOURCE_COMPD_UP = 6, + //! Counter equals COMPD when counting down + HRPWM_PWMSYNC_SOURCE_COMPD_DOWN = 7 +} HRPWM_SyncPulseSource; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setCounterCompareValue() as the \e +//! compModule parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_COUNTER_COMPARE_A = 0, //!< counter compare A + HRPWM_COUNTER_COMPARE_B = 4 //!< counter compare B +} HRPWM_CounterCompareModule; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_setDeadbandMEPEdgeSelect() as the \e +//! mepDBEdge. +// +//***************************************************************************** +typedef enum +{ + //! HRPWM is disabled + HRPWM_DB_MEP_CTRL_DISABLE = 0, + //! MEP controls Rising Edge Delay + HRPWM_DB_MEP_CTRL_RED = 1, + //! MEP controls Falling Edge Delay + HRPWM_DB_MEP_CTRL_FED = 2, + //! MEP controls both Falling and Rising edge delay + HRPWM_DB_MEP_CTRL_RED_FED = 3 +} HRPWM_MEPDeadBandEdgeMode; + +//***************************************************************************** +// +//! Values that can be passed to HRPWM_lockRegisters() as the \e registerGroup +//! parameter. +// +//***************************************************************************** +typedef enum +{ + HRPWM_REGISTER_GROUP_HRPWM = 0x1, //!< HRPWM register group + HRPWM_REGISTER_GROUP_GLOBAL_LOAD = 0x2, //!< Global load register group + HRPWM_REGISTER_GROUP_TRIP_ZONE = 0x4, //!< Trip zone register group + HRPWM_REGISTER_GROUP_TRIP_ZONE_CLEAR = 0x8, //!< Trip zone clear group + HRPWM_REGISTER_GROUP_DIGITAL_COMPARE = 0x10 //!< Digital compare group +} HRPWM_LockRegisterGroup; + +//***************************************************************************** +// +// Functions APIs shared with ePWM module +// +//***************************************************************************** + +// +// Time Base Sub Module related APIs +// +#define HRPWM_setTimeBaseCounter EPWM_setTimeBaseCounter +#define HRPWM_setCountModeAfterSync EPWM_setCountModeAfterSync +#define HRPWM_setClockPrescaler EPWM_setClockPrescaler +#define HRPWM_swForceSyncPulse EPWM_forceSyncPulse +#define HRPWM_setSyncOutPulseMode EPWM_setSyncOutPulseMode +#define HRPWM_setPeriodLoadMode EPWM_setPeriodLoadMode +#define HRPWM_setTimeBaseCounterMode EPWM_setTimeBaseCounterMode +#define HRPWM_selectPeriodLoadEvent EPWM_selectPeriodLoadEvent +#define HRPWM_enableOneShotSync EPWM_enableOneShotSync +#define HRPWM_disableOneShotSync EPWM_disableOneShotSync +#define HRPWM_startOneShotSync EPWM_startOneShotSync +#define HRPWM_getTimeBaseCounterOverflowStatus \ + EPWM_getTimeBaseCounterOverflowStatus +#define HRPWM_clearTimeBaseCounterOverflowEvent \ + EPWM_clearTimeBaseCounterOverflowEvent +#define HRPWM_getSyncStatus EPWM_getSyncStatus +#define HRPWM_clearSyncEvent EPWM_clearSyncEvent +#define HRPWM_getTimeBaseCounterDirection EPWM_getTimeBaseCounterDirection +#define HRPWM_setupEPWMLinks EPWM_setupEPWMLinks +#define HRPWM_setCounterCompareShadowLoadMode \ + EPWM_setCounterCompareShadowLoadMode +#define HRPWM_disableCounterCompareShadowLoadMode \ + EPWM_disableCounterCompareShadowLoadMode +#define HRPWM_getCounterCompareShadowStatus \ + EPWM_getCounterCompareShadowStatus + +// +// Action Qualifier module related APIs +// +#define HRPWM_setActionQualifierShadowLoadMode \ + EPWM_setActionQualifierShadowLoadMode +#define HRPWM_disableActionQualifierShadowLoadMode \ + EPWM_disableActionQualifierShadowLoadMode +#define HRPWM_setActionQualifierT1TriggerSource \ + EPWM_setActionQualifierT1TriggerSource +#define HRPWM_setActionQualifierT2TriggerSource \ + EPWM_setActionQualifierT2TriggerSource +#define HRPWM_setActionQualifierAction EPWM_setActionQualifierAction +#define HRPWM_setActionQualifierContSWForceShadowMode \ + EPWM_setActionQualifierContSWForceShadowMode +#define HRPWM_setActionQualifierContSWForceAction \ + EPWM_setActionQualifierContSWForceAction +/* HRPWM_setActionQualifierSwAction is kept for compatibility, +use HRPWM_setActionQualifierSWAction*/ +#define HRPWM_setActionQualifierSwAction EPWM_setActionQualifierSwAction +#define HRPWM_setActionQualifierSWAction EPWM_setActionQualifierSWAction +/* HRPWM_forceActionQualifierSwAction is kept for compatibility, +use HRPWM_forceActionQualifierSWAction*/ +#define HRPWM_forceActionQualifierSwAction EPWM_forceActionQualifierSwAction +#define HRPWM_forceActionQualifierSWAction EPWM_forceActionQualifierSWAction +// +// Dead Band Module related APIs +// +#define HRPWM_setDeadBandOutputSwapMode EPWM_setDeadBandOutputSwapMode +#define HRPWM_setDeadBandDelayMode EPWM_setDeadBandDelayMode +#define HRPWM_setDeadBandDelayPolarity EPWM_setDeadBandDelayPolarity +#define HRPWM_setRisingEdgeDeadBandDelayInput \ + EPWM_setRisingEdgeDeadBandDelayInput +#define HRPWM_setFallingEdgeDeadBandDelayInput \ + EPWM_setFallingEdgeDeadBandDelayInput +#define HRPWM_setDeadBandControlShadowLoadMode \ + EPWM_setDeadBandControlShadowLoadMode +#define HRPWM_disableDeadBandControlShadowLoadMode \ + EPWM_disableDeadBandControlShadowLoadMode +#define HRPWM_setRisingEdgeDelayCountShadowLoadMode \ + EPWM_setRisingEdgeDelayCountShadowLoadMode +#define HRPWM_disableRisingEdgeDelayCountShadowLoadMode \ + EPWM_disableRisingEdgeDelayCountShadowLoadMode +#define HRPWM_setFallingEdgeDelayCountShadowLoadMode \ + EPWM_setFallingEdgeDelayCountShadowLoadMode +#define HRPWM_disableFallingEdgeDelayCountShadowLoadMode \ + EPWM_disableFallingEdgeDelayCountShadowLoadMode +#define HRPWM_setDeadBandCounterClock EPWM_setDeadBandCounterClock +#define HRPWM_setRisingEdgeDelayCount EPWM_setRisingEdgeDelayCount +#define HRPWM_setFallingEdgeDelayCount EPWM_setFallingEdgeDelayCount + +// +// Chopper module related APIs +// +#define HRPWM_enableChopper EPWM_enableChopper +#define HRPWM_disableChopper EPWM_disableChopper +#define HRPWM_setChopperDutyCycle EPWM_setChopperDutyCycle +#define HRPWM_setChopperFreq EPWM_setChopperFreq +#define HRPWM_setChopperFirstPulseWidt EPWM_setChopperFirstPulseWidth + +// +// Trip Zone module related APIs +// +#define HRPWM_enableTripZoneSignals EPWM_enableTripZoneSignals +#define HRPWM_disableTripZoneSignals EPWM_disableTripZoneSignals +#define HRPWM_setTripZoneDigitalCompareEventCondition \ + EPWM_setTripZoneDigitalCompareEventCondition +#define HRPWM_enableTripZoneAdvAction EPWM_enableTripZoneAdvAction +#define HRPWM_disableTripZoneAdvAction EPWM_disableTripZoneAdvAction +#define HRPWM_setTripZoneAction EPWM_setTripZoneAction +#define HRPWM_setTripZoneAdvAction EPWM_setTripZoneAdvAction +#define HRPWM_setTripZoneAdvDigitalCompareActionA \ + EPWM_setTripZoneAdvDigitalCompareActionA +#define HRPWM_setTripZoneAdvDigitalCompareActionB \ + EPWM_setTripZoneAdvDigitalCompareActionB +#define HRPWM_enableTripZoneInterrupt EPWM_enableTripZoneInterrupt +#define HRPWM_disableTripZoneInterrupt EPWM_disableTripZoneInterrupt + +// +// HRPWM_getTripZoneInterruptStatus API define is obsolete please use +// HRPWM_getTripZoneFlagStatus going forward. +// +#define HRPWM_getTripZoneInterruptStatus EPWM_getTripZoneFlagStatus +#define HRPWM_getTripZoneFlagStatus EPWM_getTripZoneFlagStatus + +// +// HRPWM_getCycleByCycleTripZoneInterruptStatus API define is obsolete +// please use HRPWM_getCycleByCycleTripZoneFlagStatus going forward. +// +#define HRPWM_getCycleByCycleTripZoneInterruptStatus \ + HRPWM_getCycleByCycleTripZoneFlagStatus +#define HRPWM_getCycleByCycleTripZoneFlagStatus \ + EPWM_getCycleByCycleTripZoneFlagStatus + +// +// HRPWM_getOneShotTripZoneInterruptStatus is obsolete please use +// HRPWM_getOneShotTripZoneFlagStatus going forward. +// +#define HRPWM_getOneShotTripZoneInterruptStatus \ + HRPWM_getOneShotTripZoneFlagStatus +#define HRPWM_getOneShotTripZoneFlagStatus \ + EPWM_getOneShotTripZoneFlagStatus +#define HRPWM_selectCycleByCycleTripZoneClearEvent \ + EPWM_selectCycleByCycleTripZoneClearEvent + +// +// HRPWM_clearTripZoneInterruptFlag is obsolete please use +// HRPWM_clearTripZoneFlag going forward. +// +#define HRPWM_clearTripZoneInterruptFlag HRPWM_clearTripZoneFlag +#define HRPWM_clearTripZoneFlag EPWM_clearTripZoneFlag + +// +// HRPWM_clearCycleByCycleTripZoneInterruptFlag is obsolete please use +// HRPWM_clearCycleByCycleTripZoneFlag going forward. +// +#define HRPWM_clearCycleByCycleTripZoneInterruptFlag \ + HRPWM_clearCycleByCycleTripZoneFlag +#define HRPWM_clearCycleByCycleTripZoneFlag \ + EPWM_clearCycleByCycleTripZoneFlag + +// +// HRPWM_clearOneShotTripZoneInterruptFlag is obsolete please use +// HRPWM_clearOneShotTripZoneFlag going forward. +// +#define HRPWM_clearOneShotTripZoneInterruptFlag \ + HRPWM_clearOneShotTripZoneFlag +#define HRPWM_clearOneShotTripZoneFlag \ + EPWM_clearOneShotTripZoneFlag +#define HRPWM_forceTripZoneEvent EPWM_forceTripZoneEvent + +// +// Event Trigger related APIs +// +#define HRPWM_enableInterrupt EPWM_enableInterrupt +#define HRPWM_disableInterrupt EPWM_disableInterrupt +#define HRPWM_setInterruptSource EPWM_setInterruptSource +#define HRPWM_setInterruptEventCount EPWM_setInterruptEventCount +#define HRPWM_getEventTriggerInterruptStatus \ + EPWM_getEventTriggerInterruptStatus +#define HRPWM_clearEventTriggerInterruptFlag \ + EPWM_clearEventTriggerInterruptFlag +#define HRPWM_enableInterruptEventCountInit \ + EPWM_enableInterruptEventCountInit +#define HRPWM_disableInterruptEventCountInit \ + EPWM_disableInterruptEventCountInit +#define HRPWM_forceInterruptEventCountInit \ + EPWM_forceInterruptEventCountInit +#define HRPWM_setInterruptEventCountInitValue \ + EPWM_setInterruptEventCountInitValue +#define HRPWM_getInterruptEventCount EPWM_getInterruptEventCount +#define HRPWM_forceEventTriggerInterrupt EPWM_forceEventTriggerInterrupt + +// +// ADC SOC configuration related APIs +// +#define HRPWM_enableADCTrigger EPWM_enableADCTrigger +#define HRPWM_disableADCTrigger EPWM_disableADCTrigger +#define HRPWM_setADCTriggerSource EPWM_setADCTriggerSource +#define HRPWM_setADCTriggerEventPrescale EPWM_setADCTriggerEventPrescale +#define HRPWM_getADCTriggerFlagStatus EPWM_getADCTriggerFlagStatus +#define HRPWM_clearADCTriggerFlag EPWM_clearADCTriggerFlag +#define HRPWM_enableADCTriggerEventCountInit \ + EPWM_enableADCTriggerEventCountInit +#define HRPWM_disableADCTriggerEventCountInit \ + EPWM_disableADCTriggerEventCountInit +#define HRPWM_forceADCTriggerEventCountInit \ + EPWM_forceADCTriggerEventCountInit +#define HRPWM_setADCTriggerEventCountInitValue \ + EPWM_setADCTriggerEventCountInitValue +#define HRPWM_getADCTriggerEventCount EPWM_getADCTriggerEventCount +#define HRPWM_forceADCTrigger EPWM_forceADCTrigger + +// +// Digital Compare Module related APIs +// +#define HRPWM_selectDigitalCompareTripInput \ + EPWM_selectDigitalCompareTripInput +#define HRPWM_enableDigitalCompareBlankingWindow \ + EPWM_enableDigitalCompareBlankingWindow +#define HRPWM_disableDigitalCompareBlankingWindow \ + EPWM_disableDigitalCompareBlankingWindow +#define HRPWM_enableDigitalCompareWindowInverseMode \ + EPWM_enableDigitalCompareWindowInverseMode +#define HRPWM_disableDigitalCompareWindowInverseMode \ + EPWM_disableDigitalCompareWindowInverseMode +#define HRPWM_setDigitalCompareBlankingEvent \ + EPWM_setDigitalCompareBlankingEvent +#define HRPWM_setDigitalCompareFilterInput \ + EPWM_setDigitalCompareFilterInput +#define HRPWM_setDigitalCompareWindowOffset \ + EPWM_setDigitalCompareWindowOffset +#define HRPWM_setDigitalCompareWindowLength \ + EPWM_setDigitalCompareWindowLength +#define HRPWM_getDigitalCompareBlankingWindowOffsetCount \ + EPWM_getDigitalCompareBlankingWindowOffsetCount +#define HRPWM_getDigitalCompareBlankingWindowLengthCount \ + EPWM_getDigitalCompareBlankingWindowLengthCount +#define HRPWM_setDigitalCompareEventSource \ + EPWM_setDigitalCompareEventSource +#define HRPWM_setDigitalCompareEventSyncMode \ + EPWM_setDigitalCompareEventSyncMode +#define HRPWM_enableDigitalCompareADCTrigger \ + EPWM_enableDigitalCompareADCTrigger +#define HRPWM_disableDigitalCompareADCTrigger \ + EPWM_disableDigitalCompareADCTrigger +#define HRPWM_enableDigitalCompareSyncEvent \ + EPWM_enableDigitalCompareSyncEvent +#define HRPWM_disableDigitalCompareSyncEvent \ + EPWM_disableDigitalCompareSyncEvent +#define HRPWM_enableDigitalCompareCounterCapture \ + EPWM_enableDigitalCompareCounterCapture +#define HRPWM_disableDigitalCompareCounterCapture \ + EPWM_disableDigitalCompareCounterCapture +#define HRPWM_setDigitalCompareCounterShadowMode \ + EPWM_setDigitalCompareCounterShadowMode +#define HRPWM_getDigitalCompareCaptureStatus \ + EPWM_getDigitalCompareCaptureStatus +#define HRPWM_getDigitalCompareCaptureCount \ + EPWM_getDigitalCompareCaptureCount +#define HRPWM_enableDigitalCompareTripCombinationInput \ + EPWM_enableDigitalCompareTripCombinationInput +#define HRPWM_disableDigitalCompareTripCombinationInput \ + EPWM_disableDigitalCompareTripCombinationInput + +// +// Valley switching related APIs +// +#define HRPWM_enableValleyCapture EPWM_enableValleyCapture +#define HRPWM_disableValleyCapture EPWM_disableValleyCapture +#define HRPWM_startValleyCapture EPWM_startValleyCapture +#define HRPWM_setValleyTriggerSource EPWM_setValleyTriggerSource +#define HRPWM_setValleyTriggerEdgeCounts EPWM_setValleyTriggerEdgeCounts +#define HRPWM_enableValleyHWDelay EPWM_enableValleyHWDelay +#define HRPWM_disableValleyHWDelay EPWM_disableValleyHWDelay +#define HRPWM_setValleySWDelayValue EPWM_setValleySWDelayValue +#define HRPWM_setValleyDelayDivider EPWM_setValleyDelayDivider +#define HRPWM_getValleyEdgeStatus EPWM_getValleyEdgeStatus +#define HRPWM_getValleyCount EPWM_getValleyCount +#define HRPWM_getValleyHWDelay EPWM_getValleyHWDelay + +// +// Global Load feature related APIs +// +#define HRPWM_enableGlobalLoad EPWM_enableGlobalLoad +#define HRPWM_disableGlobalLoad EPWM_disableGlobalLoad +#define HRPWM_setGlobalLoadTrigger EPWM_setGlobalLoadTrigger +#define HRPWM_setGlobalLoadEventPrescale EPWM_setGlobalLoadEventPrescale +#define HRPWM_getGlobalLoadEventCount EPWM_getGlobalLoadEventCount +#define HRPWM_disableGlobalLoadOneShotMode EPWM_disableGlobalLoadOneShotMode +#define HRPWM_enableGlobalLoadOneShotMode EPWM_enableGlobalLoadOneShotMode +#define HRPWM_setGlobalLoadOneShotLatch EPWM_setGlobalLoadOneShotLatch +#define HRPWM_forceGlobalLoadOneShotEvent EPWM_forceGlobalLoadOneShotEvent +#define HRPWM_enableGlobalLoadRegisters EPWM_enableGlobalLoadRegisters +#define HRPWM_disableGlobalLoadRegisters EPWM_disableGlobalLoadRegisters +#define HRPWM_setEmulationMode EPWM_setEmulationMode + +//***************************************************************************** +// +// Prototypes for the API. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \internal +//! Checks HRPWM base address. +//! +//! \param base specifies the HRPWM module base address. +//! +//! This function determines if an HRPWM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool HRPWM_isBaseValid(uint32_t base) +{ + return((base == EPWM1_BASE) || (base == EPWM2_BASE) || + (base == EPWM3_BASE) || (base == EPWM4_BASE) || + (base == EPWM5_BASE) || (base == EPWM6_BASE) || + (base == EPWM7_BASE) || (base == EPWM8_BASE)); +} +#endif +//***************************************************************************** +// +//! Sets the consolidated phase shift value in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param phaseCount is the consolidated phase shift count value. +//! +//! This function sets the consolidated phase shift value, that is, both TBPHS +//! and TBPHSHR values are configured together. +//! +//! Call EPWM_enablePhaseShiftLoad & HRPWM_enableHRPhaseShiftLoad() functions +//! to enable loading of the phaseCount in high resolution mode. +//! +//! \b Note: phaseCount is a 24-bit value. +//! \b Note: For configuring TBPHS = 0x3C, TBPHSHR = 0x2; +//! phaseCount = 0x3C02 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setPhaseShift(uint32_t base, uint32_t phaseCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(phaseCount < 0x1000000U); + + // + // Write to TBPHS:TBPHSHR bits + // + HWREG(base + HRPWM_O_TBPHS) = phaseCount << 8U; +} + +//***************************************************************************** +// +//! Sets only the high resolution phase shift value. +//! +//! \param base is the base address of the EPWM module. +//! \param hrPhaseCount is the high resolution phase shift count value. +//! +//! This function sets only the high resolution phase shift(TBPHSHR) value. +//! Call the HRPWM_enableHRPhaseShiftLoad() function to enable loading of +//! the hrPhaseCount. +//! +//! \b Note: hrPhaseCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResPhaseShiftOnly(uint32_t base, uint16_t hrPhaseCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrPhaseCount < 256U); + + // + // Write to TBPHSHR bits + // + HWREGH(base + HRPWM_O_TBPHS) = hrPhaseCount << 8U; +} + +//***************************************************************************** +// +//! Sets the consolidated period of time base counter used in HR mode. +//! +//! \param base is the base address of the EPWM module. +//! \param periodCount is the consolidated period count value. +//! +//! This function sets the consolidated period of time base counter value +//! (TBPRD:TBPRDHR) required in high resolution mode. +//! +//! User should map the desired period or frequency of the waveform into +//! the correct periodCount. +//! +//! \b Note: periodCount is a 24 bit value. +//! \b Note: For configuring TBPRD = 0x3C, TBPRDHR = 0xA; +//! periodCount = 0x3C0A +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setTimeBasePeriod(uint32_t base, uint32_t periodCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(periodCount < 0x1000000U); + + // + // Write to TBPRD:TBPRDHR bits + // + HWREG(base + HRPWM_O_TBPRDHR) = periodCount << 8U; +} + +//***************************************************************************** +// +//! Sets only the high resolution time base counter. +//! +//! \param base is the base address of the EPWM module. +//! \param hrPeriodCount is the high resolution period count value. +//! +//! This function sets only the high resolution time base counter(TBPRDHR) +//! value. +//! +//! User should map the desired period or frequency of the waveform into +//! the correct hrPeriodCount. +//! +//! \b Note: hrPeriodCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResTimeBasePeriodOnly(uint32_t base, uint16_t hrPeriodCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrPeriodCount < 256U); + + // + // Write to TBPRDHR bits + // + HWREGH(base + HRPWM_O_TBPRDHR) = hrPeriodCount << 8U; +} + +//***************************************************************************** +// +//! Gets the consolidated time base period count used in HR mode +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets the consolidated time base period(TBPRD:TBPRDHR) value +//! used in high resolution mode. +//! +//! \return The consolidated time base period count value. +// +//***************************************************************************** +static inline uint32_t +HRPWM_getTimeBasePeriod(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Read from TBPRD:TBPRDHR bit + // + return(HWREG(base + HRPWM_O_TBPRDHR) >> 8U); +} + +//***************************************************************************** +// +//! Gets the only the high resolution time base period count. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function gets only the high resolution time base period(TBPRDHR) value. +//! +//! \return The high resolution time base period count value. +// +//***************************************************************************** +static inline uint16_t +HRPWM_getHiResTimeBasePeriodOnly(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Read from TBPRDHR bit + // + return(HWREGH(base + HRPWM_O_TBPRDHR) >> 8U); +} + +//***************************************************************************** +// +//! Sets the high resolution edge controlled by MEP (Micro Edge Positioner). +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param mepEdgeMode edge of the PWM that is controlled by MEP (Micro Edge +//! Positioner). +//! +//! This function sets the edge of the PWM that is controlled by MEP (Micro +//! Edge Positioner). Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - mepEdgeMode +//! - HRPWM_MEP_CTRL_DISABLE - HRPWM is disabled +//! - HRPWM_MEP_CTRL_RISING_EDGE - MEP (Micro Edge Positioner) +//! controls rising edge. +//! - HRPWM_MEP_CTRL_FALLING_EDGE - MEP (Micro Edge Positioner) +//! controls falling edge. +//! - HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE - MEP (Micro Edge Positioner) +//! controls both edges. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPEdgeSelect(uint32_t base, HRPWM_Channel channel, + HRPWM_MEPEdgeMode mepEdgeMode) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the edge mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x3U << (uint16_t)channel )) | + ((uint16_t)mepEdgeMode << (uint16_t)channel)); + EDIS; +} + +//***************************************************************************** +// +//! Sets the MEP (Micro Edge Positioner) control mode. +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param mepCtrlMode is the MEP (Micro Edge Positioner) control mode. +//! +//! This function sets the mode (register type) the MEP (Micro Edge Positioner) +//! will control. Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - mepCtrlMode +//! - HRPWM_MEP_DUTY_PERIOD_CTRL - MEP (Micro Edge Positioner) is +//! controlled by value of CMPAHR/ +//! CMPBHR(depending on the value of +//! channel) or TBPRDHR. +//! - HRPWM_MEP_PHASE_CTRL - MEP (Micro Edge Positioner) is +//! controlled by TBPHSHR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPControlMode(uint32_t base, HRPWM_Channel channel, + HRPWM_MEPCtrlMode mepCtrlMode) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the MEP control + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x1U << ((uint16_t)channel + 2U))) | + ((uint16_t)mepCtrlMode << ((uint16_t)channel + 2U))); + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution comparator load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param channel is high resolution period module. +//! \param loadEvent is the MEP (Micro Edge Positioner) control mode. +//! +//! This function sets the shadow load mode of the high resolution comparator. +//! The function sets the COMPA or COMPB register depending on the channel +//! variable. +//! Valid values for the parameters are: +//! - channel +//! - HRPWM_CHANNEL_A - HRPWM A +//! - HRPWM_CHANNEL_B - HRPWM B +//! - loadEvent +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or +//! period +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setCounterCompareShadowLoadEvent(uint32_t base, HRPWM_Channel channel, + HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the CMPAHR or CMPBHR load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(0x3U << ((uint16_t)channel + 3U))) | + ((uint16_t)loadEvent << ((uint16_t)channel + 3U))); + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution output swap mode. +//! +//! \param base is the base address of the EPWM module. +//! \param enableOutputSwap is the output swap flag. +//! +//! This function sets the HRPWM output swap mode. If enableOutputSwap is true, +//! ePWMxA signal appears on ePWMxB output and ePWMxB signal appears on ePWMxA +//! output. If it is false ePWMxA and ePWMxB outputs are unchanged. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setOutputSwapMode(uint32_t base, bool enableOutputSwap) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set output swap mode + // + EALLOW; + if(enableOutputSwap) + { + HWREGH(base + HRPWM_O_HRCNFG) |= HRPWM_HRCNFG_SWAPAB; + } + else + { + HWREGH(base + HRPWM_O_HRCNFG) &= ~HRPWM_HRCNFG_SWAPAB; + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the high resolution output on ePWMxB +//! +//! \param base is the base address of the EPWM module. +//! \param outputOnB is the output signal on ePWMxB. +//! +//! This function sets the HRPWM output signal on ePWMxB. If outputOnB is +//! HRPWM_OUTPUT_ON_B_INV_A, ePWMxB output is an inverted version of +//! ePWMxA. If outputOnB is HRPWM_OUTPUT_ON_B_NORMAL, ePWMxB output is +//! ePWMxB. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setChannelBOutputPath(uint32_t base, HRPWM_ChannelBOutput outputOnB) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the output on ePWM B + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) = + ((HWREGH(base + HRPWM_O_HRCNFG) & ~(HRPWM_HRCNFG_SELOUTB)) | + ((uint16_t)outputOnB << 5U)); + EDIS; +} + +//***************************************************************************** +// +//! Enables MEP (Micro Edge Positioner) automatic scale mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the MEP (Micro Edge Positioner) to automatically +//! scale HRMSTEP. +//! +//! The SFO library will calculate required MEP steps per coarse steps and +//! feed it to HRMSTEP register. The MEP calibration module will use the value +//! in HRMSTEP to determine appropriate number of MEP steps represented by +//! fractional duty cycle. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enableAutoConversion(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Enable MEP automatic scale + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) |= HRPWM_HRCNFG_AUTOCONV; + EDIS; +} + +//***************************************************************************** +// +//! Disables MEP automatic scale mode. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the MEP (Micro Edge Positioner) from automatically +//! scaling HRMSTEP. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_disableAutoConversion(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Disable MEP automatic scale + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG) &= ~HRPWM_HRCNFG_AUTOCONV; + EDIS; +} + +//***************************************************************************** +// +//! Enable high resolution period feature. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables the high resolution period feature. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enablePeriodControl(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set HRPE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) |= HRPWM_HRPCTL_HRPE; + EDIS; +} + +//***************************************************************************** +// +//! Disable high resolution period feature. +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables the high resolution period feature. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_disablePeriodControl(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Clear HRPE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) &= ~HRPWM_HRPCTL_HRPE; + EDIS; +} + +//***************************************************************************** +// +//! Enable high resolution phase load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function enables loading of high resolution phase shift value which is +//! set by the function HRPWM_setPhaseShift(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_enablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set TBPHSHRLOADE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) |= HRPWM_HRPCTL_TBPHSHRLOADE; + EDIS; +} + +//***************************************************************************** +// +//! Disable high resolution phase load +//! +//! \param base is the base address of the EPWM module. +//! +//! This function disables loading of high resolution phase shift value. +//! +//! \return +// +//***************************************************************************** +static inline void +HRPWM_disablePhaseShiftLoad(uint32_t base) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Clear TBPHSHRLOADE bit + // + EALLOW; + HWREGH(base + HRPWM_O_HRPCTL) &= ~HRPWM_HRPCTL_TBPHSHRLOADE; + EDIS; +} + +//***************************************************************************** +// +//! Set high resolution PWMSYNC source. +//! +//! \param base is the base address of the EPWM module. +//! \param syncPulseSource is the PWMSYNC source. +//! +//! This function sets the high resolution PWMSYNC pulse source. +//! Valid values for syncPulseSource are: +//! - HRPWM_PWMSYNC_SOURCE_PERIOD - Counter equals Period. +//! - HRPWM_PWMSYNC_SOURCE_ZERO - Counter equals zero. +//! - HRPWM_PWMSYNC_SOURCE_COMPC_UP - Counter equals COMPC when +//! counting up. +//! - HRPWM_PWMSYNC_SOURCE_COMPC_DOWN - Counter equals COMPC when +//! counting down. +//! - HRPWM_PWMSYNC_SOURCE_COMPD_UP - Counter equals COMPD when +//! counting up. +//! - HRPWM_PWMSYNC_SOURCE_COMPD_DOWN - Counter equals COMPD when +//! counting down. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setSyncPulseSource(uint32_t base, HRPWM_SyncPulseSource syncPulseSource) +{ + // + // Set the PWMSYNC source + // + EALLOW; + + // + // Configuration for sync pulse source equal to HRPWM_PWMSYNC_SOURCE_PERIOD + // or HRPWM_PWMSYNC_SOURCE_ZERO + // + if(syncPulseSource < HRPWM_PWMSYNC_SOURCE_COMPC_UP) + { + HWREGH(base + HRPWM_O_HRPCTL) = + ((HWREGH(base + HRPWM_O_HRPCTL) & + ~(HRPWM_HRPCTL_PWMSYNCSELX_M | HRPWM_HRPCTL_PWMSYNCSEL)) | + ((uint16_t)syncPulseSource << 1U)); + } + else + { + HWREGH(base + HRPWM_O_HRPCTL) = + ((HWREGH(base + HRPWM_O_HRPCTL) & ~HRPWM_HRPCTL_PWMSYNCSELX_M) | + ((uint16_t)syncPulseSource << HRPWM_HRPCTL_PWMSYNCSELX_S)); + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the Translator Remainder value. +//! +//! \param base is the base address of the EPWM module. +//! \param trremVal is the translator remainder value. +//! +//! This function sets the Translator Remainder value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setTranslatorRemainder(uint32_t base, uint16_t trremVal) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(trremVal < 2048U); + + // + // Set Translator Remainder value + // + EALLOW; + HWREGH(base + HRPWM_O_TRREM) = (trremVal & HRPWM_TRREM_TRREM_M); + EDIS; +} + +//***************************************************************************** +// +//! Sets the consolidated counter compare values in HR mode. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module. +//! \param compCount is the consolidated counter compare count value. +//! +//! This function sets the consolidated counter compare(CMPx:CMPxHR) value +//! required in high resolution mode for counter compare registers. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \b Note: compCount is a 24 bit value. +//! \b Note: For configuring CMPA = 0xB4, CMPAHR = 0x64; value of +//! compCount = 0xB464 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setCounterCompareValue(uint32_t base, + HRPWM_CounterCompareModule compModule, + uint32_t compCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(compCount < 0x1000000U); + + // + // Write to counter compare registers + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Write to CMPA:CMPAHR + // + HWREG(base + HRPWM_O_CMPA) = compCount << 8U; + } + else + { + // + // Write to CMPB:CMPBHR + // + HWREG(base + HRPWM_O_CMPB) = compCount << 8U; + } +} + +//***************************************************************************** +// +//! Sets only the high resolution counter compare value. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module. +//! \param hrCompCount is the high resolution counter compare count value. +//! +//! This function sets the high resolution counter compare value(CMPxHR) for +//! counter compare registers. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \b Note: hrCompCount is an 8-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResCounterCompareValueOnly(uint32_t base, + HRPWM_CounterCompareModule compModule, + uint16_t hrCompCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrCompCount < 256U); + + // + // Write to the high resolution counter compare registers + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Write to CMPAHR + // + HWREGH(base + HRPWM_O_CMPA) = hrCompCount << 8U; + } + else + { + // + // Write to CMPBHR + // + HWREGH(base + HRPWM_O_CMPB) = hrCompCount << 8U; + } +} + +//***************************************************************************** +// +//! Gets the consolidated counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module value. +//! +//! This function gets the consolidated counter compare(CMPx:CMPxHR) value +//! used in high resolution for the counter compare module specified. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! +//! \return None. +// +//***************************************************************************** +static inline uint32_t +HRPWM_getCounterCompareValue(uint32_t base, + HRPWM_CounterCompareModule compModule) +{ + uint32_t compCount; + + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Get counter compare value for selected module + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Read from CMPAHR + // + compCount = HWREG(base + HRPWM_O_CMPA) >> 8U; + } + else + { + // + // Read from CMPBHR + // + compCount = HWREG(base + HRPWM_O_CMPB) >> 8U; + } + return(compCount); +} + +//***************************************************************************** +// +//! Gets only the high resolution counter compare values. +//! +//! \param base is the base address of the EPWM module. +//! \param compModule is the Counter Compare module value. +//! +//! This function gets only the high resolution counter compare(CMPxHR) value +//! for the counter compare module specified. +//! Valid values for compModule are: +//! - HRPWM_COUNTER_COMPARE_A - counter compare A. +//! - HRPWM_COUNTER_COMPARE_B - counter compare B. +//! +//! \return None. +// +//***************************************************************************** +static inline uint16_t +HRPWM_getHiResCounterCompareValueOnly(uint32_t base, + HRPWM_CounterCompareModule compModule) +{ + uint16_t hrCompCount; + + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Get counter compare value for selected module + // + if(compModule == HRPWM_COUNTER_COMPARE_A) + { + // + // Read from CMPAHR + // + hrCompCount = HWREGH(base + HRPWM_O_CMPA) >> 8U; + } + else + { + // + // Read from CMPBHR + // + hrCompCount = HWREGH(base + HRPWM_O_CMPB) >> 8U; + } + return(hrCompCount); +} + +//***************************************************************************** +// +//! Sets the consolidated RED count in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param redCount is the high resolution RED count. +//! +//! This function sets the consolidated RED (Rising Edge Delay) count +//! (DBRED:DBREDHR) value used in high resolution mode. The value of +//! redCount should be less than 0x200000. +//! +//! \b Note: redCount is a 21 bit value. +//! \b Note: For configuring DBRED = 0x4, DBREDHR = 0x1; value of +//! redCount = ((0x4 << 7) | 0x1) = 0x201 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setRisingEdgeDelay(uint32_t base, uint32_t redCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(redCount < 0x200000U); + + // + // Set the consolidated RED (Rising Edge Delay) count + // + HWREG(base + HRPWM_O_DBREDHR) = redCount << 9U; +} + +//***************************************************************************** +// +//! Sets the high resolution RED count only. +//! +//! \param base is the base address of the EPWM module. +//! \param hrRedCount is the high resolution RED count. +//! +//! This function sets only the high resolution RED (Rising Edge Delay) +//! count(DBREDHR) value. +//! The value of hrRedCount should be less than 128. +//! +//! \b Note: hrRedCount is a 7-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResRisingEdgeDelayOnly(uint32_t base, uint16_t hrRedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrRedCount < 128U); + + // + // Set the High Resolution RED (Rising Edge Delay) count only + // + HWREGH(base + HRPWM_O_DBREDHR) = hrRedCount << 9U; +} + +//***************************************************************************** +// +//! Sets the consolidated FED value in high resolution mode. +//! +//! \param base is the base address of the EPWM module. +//! \param fedCount is the high resolution FED count. +//! +//! This function sets the consolidated FED (Falling Edge Delay) count +//! (DBFED: DBFEDHR) value used in high resolution mode. The value of fedCount +//! should be less than 0x200000. +//! +//! \b Note: fedCount is a 21 bit value. +//! \b Note: For configuring DBFED = 0x4, DBFEDHR = 0x1; value of +//! fedCount = ((0x4 << 7) | 0x1) = 0x201 +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setFallingEdgeDelay(uint32_t base, uint32_t fedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(fedCount < 0x200000U); + + // + // Set the High Resolution FED (Falling Edge Delay) count + // + HWREG(base + HRPWM_O_DBFEDHR) = fedCount << 9U; +} + +//***************************************************************************** +// +//! Sets high resolution FED count only. +//! +//! \param base is the base address of the EPWM module. +//! \param hrFedCount is the high resolution FED count. +//! +//! This function sets only the high resolution FED (Falling Edge Delay) count +//! (DBFEDHR)value. The value of hrFedCount should be less than 128. +//! +//! \b Note: hrFedCount is a 7-bit value. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setHiResFallingEdgeDelayOnly(uint32_t base, uint16_t hrFedCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(hrFedCount < 128U); + + // + // Set the high resolution FED (Falling Edge Delay) count + // + HWREGH(base + HRPWM_O_DBFEDHR) = hrFedCount << 9U; +} + +//***************************************************************************** +// +//! Set high resolution MEP (Micro Edge Positioner) step. +//! +//! \param base is the base address of the EPWM module. +//! \param mepCount is the high resolution MEP (Micro Edge Positioner) step +//! count. +//! +//! This function sets the high resolution MEP (Micro Edge Positioner) step +//! count. The maximum value for the MEP count step is 255. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setMEPStep(uint32_t base, uint16_t mepCount) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + ASSERT(mepCount < 256U); + + // + // Set HRPWM MEP count + // + EALLOW; + HWREGH(base + HRPWM_O_HRMSTEP) = + ((HWREGH(base + HRPWM_O_HRMSTEP) & ~HRPWM_HRMSTEP_HRMSTEP_M) | + mepCount); + EDIS; +} + +//***************************************************************************** +// +//! Set high resolution Dead Band MEP (Micro Edge Positioner) control. +//! +//! \param base is the base address of the EPWM module. +//! \param mepDBEdge is the high resolution MEP (Micro Edge Positioner) control +//! edge. +//! +//! This function sets the high resolution Dead Band edge that the MEP (Micro +//! Edge Positioner) controls Valid values for mepDBEdge are: +//! - HRPWM_DB_MEP_CTRL_DISABLE - HRPWM is disabled +//! - HRPWM_DB_MEP_CTRL_RED - MEP (Micro Edge Positioner) controls +//! Rising Edge Delay +//! - HRPWM_DB_MEP_CTRL_FED - MEP (Micro Edge Positioner) controls +//! Falling Edge Delay +//! - HRPWM_DB_MEP_CTRL_RED_FED - MEP (Micro Edge Positioner) controls both +//! Falling and Rising edge delays +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setDeadbandMEPEdgeSelect(uint32_t base, + HRPWM_MEPDeadBandEdgeMode mepDBEdge) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM DB edge mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_EDGMODEDB_M) | + ((uint16_t)mepDBEdge)); + EDIS; +} + +//***************************************************************************** +// +//! Set the high resolution Dead Band RED load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadEvent is the shadow to active load event. +//! +//! This function sets the high resolution Rising Edge Delay(RED)Dead Band +//! count load mode. +//! Valid values for loadEvent are: +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero +//! or period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setRisingEdgeDelayLoadMode(uint32_t base, + HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM RED load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_CTLMODEDBRED_M) | + ((uint16_t)loadEvent << HRPWM_HRCNFG2_CTLMODEDBRED_S)); + EDIS; +} + +//***************************************************************************** +// +//! Set the high resolution Dead Band FED load mode. +//! +//! \param base is the base address of the EPWM module. +//! \param loadEvent is the shadow to active load event. +//! +//! This function sets the high resolution Falling Edge Delay(FED) Dead Band +//! count load mode. +//! Valid values for loadEvent are: +//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero. +//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period +//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero +//! or period. +//! +//! \return None. +// +//***************************************************************************** +static inline void +HRPWM_setFallingEdgeDelayLoadMode(uint32_t base, HRPWM_LoadMode loadEvent) +{ + // + // Check the arguments + // + ASSERT(HRPWM_isBaseValid(base)); + + // + // Set the HRPWM FED load mode + // + EALLOW; + HWREGH(base + HRPWM_O_HRCNFG2) = + ((HWREGH(base + HRPWM_O_HRCNFG2) & ~HRPWM_HRCNFG2_CTLMODEDBFED_M) | + ((uint16_t)loadEvent << HRPWM_HRCNFG2_CTLMODEDBFED_S)); + EDIS; +} + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // HRPWM_H + diff --git a/gpio_driverlib_cpu1/device/driverlib/hw_reg_inclusive_terminology.h b/gpio_driverlib_cpu1/device/driverlib/hw_reg_inclusive_terminology.h new file mode 100644 index 0000000..d3dc018 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/hw_reg_inclusive_terminology.h @@ -0,0 +1,29 @@ +#ifndef HW_REG_INCLUSIVE_TERMINOLOGY_H +#define HW_REG_INCLUSIVE_TERMINOLOGY_H + + + +//***************************************************************************** +// SPI +//***************************************************************************** +#define SPI_CTL_CONTROLLER_PERIPHERAL SPI_CTL_MASTER_SLAVE +#define SPI_PRI_PTEINV SPI_PRI_STEINV + +//***************************************************************************** +// I2C +//***************************************************************************** +#define I2C_O_TAR I2C_O_SAR + +#define I2C_TAR_TAR_S I2C_SAR_SAR_S +#define I2C_TAR_TAR_M I2C_SAR_SAR_M + +#define I2C_IER_AAT I2C_IER_AAS + +#define I2C_STR_AAT I2C_STR_AAS +#define I2C_STR_TDIR I2C_STR_SDIR + +#define I2C_MDR_CNT I2C_MDR_MST + + + +#endif // HW_REG_INCLUSIVE_TERMINOLOGY_H diff --git a/gpio_driverlib_cpu1/device/driverlib/i2c.c b/gpio_driverlib_cpu1/device/driverlib/i2c.c new file mode 100644 index 0000000..692f7a2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/i2c.c @@ -0,0 +1,351 @@ +//########################################################################### +// +// FILE: i2c.c +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "i2c.h" + +//***************************************************************************** +// +// I2C_initController +// +//***************************************************************************** +void +I2C_initController(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle) +{ + uint32_t modPrescale; + uint32_t divider; + uint32_t dValue; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT((10000000U / bitRate) > 10U); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / 10000000U) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; + + switch(modPrescale) + { + case 0U: + dValue = 7U; + break; + + case 1U: + dValue = 6U; + break; + + default: + dValue = 5U; + break; + } + + // + // Set the divider for the time low + // + divider = (10000000U / bitRate) - (2U * dValue); + + if(dutyCycle == I2C_DUTYCYCLE_50) + { + HWREGH(base + I2C_O_CLKH) = divider / 2U; + } + else + { + HWREGH(base + I2C_O_CLKH) = divider / 3U; + } + + HWREGH(base + I2C_O_CLKL) = divider - HWREGH(base + I2C_O_CLKH); +} + +//***************************************************************************** +// +// I2C_initControllerModuleFrequency +// +//***************************************************************************** +void +I2C_initControllerModuleFrequency(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle, uint32_t moduleFrequency) +{ + uint32_t modPrescale; + uint32_t divider; + uint32_t dValue; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT((moduleFrequency / bitRate) > 10U); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / moduleFrequency) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; + + switch(modPrescale) + { + case 0U: + dValue = 7U; + break; + + case 1U: + dValue = 6U; + break; + + default: + dValue = 5U; + break; + } + + // + // Set the divider for the time low + // + divider = (moduleFrequency / bitRate) - (2U * dValue); + + if(dutyCycle == I2C_DUTYCYCLE_50) + { + HWREGH(base + I2C_O_CLKH) = divider / 2U; + } + else + { + HWREGH(base + I2C_O_CLKH) = divider / 3U; + } + + HWREGH(base + I2C_O_CLKL) = divider - HWREGH(base + I2C_O_CLKH); +} + +//***************************************************************************** +// +// I2C_enableInterrupt +// +//***************************************************************************** +void +I2C_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Enable the desired basic interrupts + // + HWREGH(base + I2C_O_IER) |= (intFlags & 0xFFFFU); + + // + // Enabling addressed-as-target interrupt separately because its bit is + // different between the IER and STR registers. + // + if((intFlags & I2C_INT_ADDR_TARGET) != 0U) + { + HWREGH(base + I2C_O_IER) |= I2C_IER_AAT; + } + + // + // Enable desired FIFO interrupts. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_TXFFIENA; + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// I2C_disableInterrupt +// +//***************************************************************************** +void +I2C_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Disable the desired basic interrupts. + // + HWREGH(base + I2C_O_IER) &= ~(intFlags & 0xFFFFU); + + // + // Disabling addressed-as-target interrupt separately because its bit is + // different between the IER and STR registers. + // + if((intFlags & I2C_INT_ADDR_TARGET) != 0U) + { + HWREGH(base + I2C_O_IER) &= ~I2C_IER_AAT; + } + + // + // Disable the desired FIFO interrupts. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) &= ~(I2C_FFTX_TXFFIENA); + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) &= ~(I2C_FFRX_RXFFIENA); + } +} + +//***************************************************************************** +// +// I2C_getInterruptStatus +// +//***************************************************************************** +uint32_t +I2C_getInterruptStatus(uint32_t base) +{ + uint32_t temp; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return only the status bits associated with interrupts. + // + temp = (uint32_t)HWREGH(base + I2C_O_STR) & (uint32_t)I2C_STR_INTMASK; + + // + // Read FIFO interrupt flags. + // + if((HWREGH(base + I2C_O_FFTX) & I2C_FFTX_TXFFINT) != 0U) + { + temp |= I2C_INT_TXFF; + } + + if((HWREGH(base + I2C_O_FFRX) & I2C_FFRX_RXFFINT) != 0U) + { + temp |= I2C_INT_RXFF; + } + + return(temp); +} + +//***************************************************************************** +// +// I2C_clearInterruptStatus +// +//***************************************************************************** +void +I2C_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Clear the interrupt flags that are located in STR. + // + HWREGH(base + I2C_O_STR) = ((uint16_t)intFlags & I2C_STR_INTMASK); + + // + // Clear the FIFO interrupt flags if needed. + // + if((intFlags & I2C_INT_TXFF) != 0U) + { + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_TXFFINTCLR; + } + + if((intFlags & I2C_INT_RXFF) != 0U) + { + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFINTCLR; + } +} +//***************************************************************************** +// +// I2C_configureModuleFrequency +// +//***************************************************************************** +void +I2C_configureModuleFrequency(uint32_t base, uint32_t sysclkHz) +{ + uint32_t modPrescale; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / 10000000U) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; +} +//***************************************************************************** +// +// I2C_configureModuleClockFrequency +// +//***************************************************************************** +void +I2C_configureModuleClockFrequency(uint32_t base, uint32_t sysclkHz, uint32_t moduleFrequency) +{ + uint32_t modPrescale; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the prescaler for the module clock. + // + modPrescale = (sysclkHz / moduleFrequency) - 1U; + HWREGH(base + I2C_O_PSC) = I2C_PSC_IPSC_M & modPrescale; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/i2c.h b/gpio_driverlib_cpu1/device/driverlib/i2c.h new file mode 100644 index 0000000..634c4c8 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/i2c.h @@ -0,0 +1,1386 @@ +//########################################################################### +// +// FILE: i2c.h +// +// TITLE: C28x I2C driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef I2C_H +#define I2C_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup i2c_api I2C +//! @{ +// +//***************************************************************************** + +#include "inc/hw_i2c.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "hw_reg_inclusive_terminology.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// I2C Controller commands. +// +//***************************************************************************** +#define I2C_CONTROLLER_SEND_MODE 0x0600U //!< Controller-transmitter mode +#define I2C_CONTROLLER_RECEIVE_MODE 0x0400U //!< Controller-receiver mode +#define I2C_TARGET_SEND_MODE 0x0200U //!< Target-transmitter mode +#define I2C_TARGET_RECEIVE_MODE 0x0000U //!< Target-receiver mode + +#define I2C_REPEAT_MODE 0x0080U //!< Only applies to Controller mode +#define I2C_START_BYTE_MODE 0x0010U //!< Enable start byte mode +#define I2C_FREE_DATA_FORMAT 0x0008U //!< Enable free data (no addr) format + +//***************************************************************************** +// +// I2C interrupts for use with the intFlags parameter of I2C_enableInterrupt(), +// I2C_disableInterrupt(), and I2C_clearInterruptStatus() and to be returned by +// I2C_getInterruptStatus(). +// +//***************************************************************************** +#define I2C_INT_ARB_LOST 0x00001U //!< Arbitration-lost interrupt +#define I2C_INT_NO_ACK 0x00002U //!< NACK interrupt +#define I2C_INT_REG_ACCESS_RDY 0x00004U //!< Register-access-ready interrupt +#define I2C_INT_RX_DATA_RDY 0x00008U //!< Receive-data-ready interrupt +#define I2C_INT_TX_DATA_RDY 0x00010U //!< Transmit-data-ready interrupt +#define I2C_INT_STOP_CONDITION 0x00020U //!< Stop condition detected +#define I2C_INT_ADDR_TARGET 0x00200U //!< Addressed as target interrupt +#define I2C_INT_RXFF 0x10000U //!< RX FIFO level interrupt +#define I2C_INT_TXFF 0x20000U //!< TX FIFO level interrupt + + +// +// Helpful define to mask out the bits in the I2CSTR register that aren't +// associated with interrupts. +// +#define I2C_STR_INTMASK ((uint16_t)I2C_INT_ARB_LOST | \ + (uint16_t)I2C_INT_NO_ACK | \ + (uint16_t)I2C_INT_REG_ACCESS_RDY | \ + (uint16_t)I2C_INT_RX_DATA_RDY | \ + (uint16_t)I2C_INT_TX_DATA_RDY | \ + (uint16_t)I2C_INT_STOP_CONDITION | \ + (uint16_t)I2C_INT_ADDR_TARGET) + + + + +//***************************************************************************** +// +// Flags for use as the stsFlags parameter of I2C_clearStatus() and to be +// returned by I2C_getStatus(). +// +//***************************************************************************** +#define I2C_STS_ARB_LOST 0x0001U //!< Arbitration-lost +#define I2C_STS_NO_ACK 0x0002U //!< No-acknowledgment (NACK) +#define I2C_STS_REG_ACCESS_RDY 0x0004U //!< Register-access-ready (ARDY) +#define I2C_STS_RX_DATA_RDY 0x0008U //!< Receive-data-ready +#define I2C_STS_TX_DATA_RDY 0x0010U //!< Transmit-data-ready +#define I2C_STS_STOP_CONDITION 0x0020U //!< Stop condition detected +#define I2C_STS_ADDR_ZERO 0x0100U //!< Address of all zeros detected +#define I2C_STS_ADDR_TARGET 0x0200U //!< Addressed as target +#define I2C_STS_TX_EMPTY 0x0400U //!< Transmit shift register empty +#define I2C_STS_RX_FULL 0x0800U //!< Receive shift register full +#define I2C_STS_BUS_BUSY 0x1000U //!< Bus busy, wait for STOP or reset +#define I2C_STS_NACK_SENT 0x2000U //!< NACK was sent +#define I2C_STS_TARGET_DIR 0x4000U //!< Addressed as target transmitter + +#endif + + +//***************************************************************************** +// +//! I2C interrupts to be returned by I2C_getInterruptSource(). +// +//***************************************************************************** +typedef enum +{ + I2C_INTSRC_NONE, //!< No interrupt pending + I2C_INTSRC_ARB_LOST, //!< Arbitration-lost interrupt + I2C_INTSRC_NO_ACK, //!< NACK interrupt + I2C_INTSRC_REG_ACCESS_RDY, //!< Register-access-ready interrupt + I2C_INTSRC_RX_DATA_RDY, //!< Receive-data-ready interrupt + I2C_INTSRC_TX_DATA_RDY, //!< Transmit-data-ready interrupt + I2C_INTSRC_STOP_CONDITION, //!< Stop condition detected + I2C_INTSRC_ADDR_TARGET, //!< Addressed as target interrupt +} I2C_InterruptSource; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e txLevel +//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e txLevel +//! parameter, and returned by I2C_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + I2C_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty + I2C_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty + I2C_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full + I2C_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full + I2C_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full + I2C_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full + I2C_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full + I2C_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full + I2C_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full + I2C_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full + I2C_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full + I2C_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full + I2C_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full + I2C_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full + I2C_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full + I2C_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full + I2C_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full + I2C_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full + I2C_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full +} I2C_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e rxLevel +//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e rxLevel +//! parameter, and returned by I2C_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + I2C_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty + I2C_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty + I2C_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full + I2C_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full + I2C_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full + I2C_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full + I2C_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full + I2C_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full + I2C_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full + I2C_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full + I2C_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full + I2C_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full + I2C_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full + I2C_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full + I2C_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full + I2C_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full + I2C_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full + I2C_FIFO_RX16 = 0x0010U, //!< Receive FIFO full + I2C_FIFO_RXFULL = 0x0010U //!< Receive FIFO full +} I2C_RxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setBitCount() as the \e size parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_BITCOUNT_1 = 1U, //!< 1 bit per data byte + I2C_BITCOUNT_2 = 2U, //!< 2 bits per data byte + I2C_BITCOUNT_3 = 3U, //!< 3 bits per data byte + I2C_BITCOUNT_4 = 4U, //!< 4 bits per data byte + I2C_BITCOUNT_5 = 5U, //!< 5 bits per data byte + I2C_BITCOUNT_6 = 6U, //!< 6 bits per data byte + I2C_BITCOUNT_7 = 7U, //!< 7 bits per data byte + I2C_BITCOUNT_8 = 0U //!< 8 bits per data byte +} I2C_BitCount; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setAddressMode() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_ADDR_MODE_7BITS = 0x0000U, //!< 7-bit address + I2C_ADDR_MODE_10BITS = 0x0100U //!< 10-bit address +} I2C_AddressMode; + +//***************************************************************************** +// +//! Values that can be passed to I2C_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! If SCL is low, keep it low. If high, stop when it goes low again. + I2C_EMULATION_STOP_SCL_LOW = 0x0000U, + //! Continue I2C operation regardless + I2C_EMULATION_FREE_RUN = 0x4000U +} I2C_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to I2C_initController() as the \e dutyCycle +//! parameter. +// +//***************************************************************************** +typedef enum +{ + I2C_DUTYCYCLE_33, //!< Clock duty cycle is 33% + I2C_DUTYCYCLE_50 //!< Clock duty cycle is 55% +} I2C_DutyCycle; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an I2C base address. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function determines if a I2C module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +I2C_isBaseValid(uint32_t base) +{ + return( + (base == I2CA_BASE) || + (base == I2CB_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function enables operation of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + HWREGH(base + I2C_O_MDR) |= I2C_MDR_IRS; +} + +//***************************************************************************** +// +//! Disables the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function disables operation of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + HWREGH(base + I2C_O_MDR) &= ~(I2C_MDR_IRS); +} + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This functions enables the transmit and receive FIFOs in the I2C. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + I2C_O_FFTX) |= I2C_FFTX_I2CFFEN | I2C_FFTX_TXFFRST; + HWREGH(base + I2C_O_FFRX) |= I2C_FFRX_RXFFRST; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This functions disables the transmit and receive FIFOs in the I2C. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + I2C_O_FFTX) &= ~(I2C_FFTX_I2CFFEN | I2C_FFTX_TXFFRST); + HWREGH(base + I2C_O_FFRX) &= ~I2C_FFRX_RXFFRST; +} + +//***************************************************************************** +// +//! Sets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the I2C instance used. +//! \param txLevel is the transmit FIFO interrupt level, specified as +//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, . . . or +//! \b I2C_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as +//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, . . . or +//! \b I2C_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. The transmit FIFO interrupt flag will be set when the FIFO +//! reaches a value less than or equal to \e txLevel. The receive FIFO +//! flag will be set when the FIFO reaches a value greater than or equal to +//! \e rxLevel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel txLevel, + I2C_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + I2C_O_FFTX) = (HWREGH(base + I2C_O_FFTX) & + (~I2C_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + I2C_O_FFRX) = (HWREGH(base + I2C_O_FFRX) & + (~I2C_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the I2C instance used. +//! \param txLevel is a pointer to storage for the transmit FIFO level, +//! returned as one of \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, +//! \b I2C_FIFO_TX2, . . . or \b I2C_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO level, +//! returned as one of \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, +//! \b I2C_FIFO_RX2, . . . or \b I2C_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. The transmit FIFO interrupt flag will be set when the FIFO +//! reaches a value less than or equal to \e txLevel. The receive FIFO +//! flag will be set when the FIFO reaches a value greater than or equal to +//! \e rxLevel. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_getFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel *txLevel, + I2C_RxFIFOLevel *rxLevel) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (I2C_TxFIFOLevel)(HWREGH(base + I2C_O_FFTX) & + I2C_FFTX_TXFFIL_M); + *rxLevel = (I2C_RxFIFOLevel)(HWREGH(base + I2C_O_FFRX) & + I2C_FFRX_RXFFIL_M); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, \b I2C_FIFO_TX3, +//! ..., or \b I2C_FIFO_TX16 +// +//***************************************************************************** +static inline I2C_TxFIFOLevel +I2C_getTxFIFOStatus(uint32_t base) +{ + uint16_t level; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Get the current FIFO status + // + level = ((HWREGH(base + I2C_O_FFTX) & I2C_FFTX_TXFFST_M) >> + I2C_FFTX_TXFFST_S); + + return((I2C_TxFIFOLevel)level); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, \b I2C_FIFO_RX3, +//! ..., or \b I2C_FIFO_RX16 +// +//***************************************************************************** +static inline I2C_RxFIFOLevel +I2C_getRxFIFOStatus(uint32_t base) +{ + uint16_t level; + + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Get the current FIFO status + // + level = ((HWREGH(base + I2C_O_FFRX) & I2C_FFRX_RXFFST_M) >> + I2C_FFRX_RXFFST_S); + + return((I2C_RxFIFOLevel)level); +} + +//***************************************************************************** +// +//! Reads I2C Module clock prescaler value. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads the I2C prescaler value which configures the I2C module +//! clock by dividing down the SYSCLK. I2C_MODULE_CLK = SYSCLK / (I2CPSC + ) +//! +//! \return Returns the I2C prescaler(I2CPSC) cast as an uint16_t. +// +//***************************************************************************** +static inline uint16_t +I2C_getPreScaler(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the contents of the Prescaler register. + // + return(HWREGH(base + I2C_O_PSC)); +} + +//***************************************************************************** +// +//! Sets the address that the I2C Controller places on the bus. +//! +//! \param base is the base address of the I2C instance used. +//! \param targetAddr 7-bit or 10-bit target address +//! +//! This function configures the address that the I2C Controller places on the bus +//! when initiating a transaction. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setTargetAddress(uint32_t base, uint16_t targetAddr) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT(targetAddr <= I2C_TAR_TAR_M); + + HWREGH(base + I2C_O_TAR) = targetAddr; +} + +//***************************************************************************** +// +//! Sets the own address for this I2C module. +//! +//! \param base is the base address of the I2C Target module. +//! \param Addr is the 7-bit or 10-bit address +//! +//! This function writes the specified address. +//! +//! The parameter \e Addr is the value that is compared against the +//! target address sent by an I2C controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setOwnAddress(uint32_t base, uint16_t Addr) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + ASSERT(Addr <= I2C_OAR_OAR_M); + + HWREGH(base + I2C_O_OAR) = Addr; +} + +//***************************************************************************** +// +//! Indicates whether or not the I2C bus is busy. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns an indication of whether or not the I2C bus is busy. +//! This function can be used in a multi-controller environment to determine if the +//! bus is free for another data transfer. +//! +//! \return Returns \b true if the I2C bus is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +static inline bool +I2C_isBusBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + return((HWREGH(base + I2C_O_STR) & I2C_STR_BB) == I2C_STR_BB); +} + +//***************************************************************************** +// +//! Gets the current I2C module status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the status for the I2C module. +//! +//! \return The current module status, enumerated as a bit field of +//! - \b I2C_STS_ARB_LOST - Arbitration-lost +//! - \b I2C_STS_NO_ACK - No-acknowledgment (NACK) +//! - \b I2C_STS_REG_ACCESS_RDY - Register-access-ready (ARDY) +//! - \b I2C_STS_RX_DATA_RDY - Receive-data-ready +//! - \b I2C_STS_TX_DATA_RDY - Transmit-data-ready +//! - \b I2C_STS_STOP_CONDITION - Stop condition detected +//! - \b I2C_STS_ADDR_ZERO - Address of all zeros detected +//! - \b I2C_STS_ADDR_TARGET - Addressed as Target +//! - \b I2C_STS_TX_EMPTY - Transmit shift register empty +//! - \b I2C_STS_RX_FULL - Receive shift register full +//! - \b I2C_STS_BUS_BUSY - Bus busy, wait for STOP or reset +//! - \b I2C_STS_NACK_SENT - NACK was sent +//! - \b I2C_STS_TARGET_DIR- Addressed as Target transmitter +// +//***************************************************************************** +static inline uint16_t +I2C_getStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return contents of the status register + // + return(HWREGH(base + I2C_O_STR)); +} + +//***************************************************************************** +// +//! Clears I2C status flags. +//! +//! \param base is the base address of the I2C instance used. +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! +//! This function clears the specified I2C status flags. The \e stsFlags +//! parameter is the logical OR of the following values: +//! - \b I2C_STS_ARB_LOST +//! - \b I2C_STS_NO_ACK, +//! - \b I2C_STS_REG_ACCESS_RDY +//! - \b I2C_STS_RX_DATA_RDY +//! - \b I2C_STS_STOP_CONDITION +//! - \b I2C_STS_NACK_SENT +//! - \b I2C_STS_TARGET_DIR +//! +//! \note Note that some of the status flags returned by I2C_getStatus() cannot +//! be cleared by this function. Some may only be cleared by hardware or a +//! reset of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_clearStatus(uint32_t base, uint16_t stsFlags) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write to the status registers to clear them. + // + HWREGH(base + I2C_O_STR) = stsFlags; +} + +//***************************************************************************** +// +//! Controls the state of the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! \param config is the command to be issued to the I2C module. +//! +//! This function is used to control the state of the controller and target send and +//! receive operations. The \e config is a logical OR of the following options. +//! +//! One of the following four options: +//! - \b I2C_CONTROLLER_SEND_MODE - Controller-transmitter mode +//! - \b I2C_CONTROLLER_RECEIVE_MODE - Controller-receiver mode +//! - \b I2C_TARGET_SEND_MODE - Target-transmitter mode +//! - \b I2C_TARGET_RECEIVE_MODE - Target-receiver mode +//! +//! Any of the following: +//! - \b I2C_REPEAT_MODE - Sends data until stop bit is set, ignores data count +//! - \b I2C_START_BYTE_MODE - Use start byte mode +//! - \b I2C_FREE_DATA_FORMAT - Use free data format, transfers have no address +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setConfig(uint32_t base, uint16_t config) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the selected options to the mode register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & + ~(I2C_MDR_CNT | I2C_MDR_TRX | I2C_MDR_RM | + I2C_MDR_STB | I2C_MDR_FDF)) | config; +} + +//***************************************************************************** +// +//! Sets the data byte bit count the I2C module. +//! +//! \param base is the base address of the I2C instance used. +//! \param size is the number of bits per data byte. +//! +//! The \e size parameter is a value I2C_BITCOUNT_x where x is the number of +//! bits per data byte. The default and maximum size is 8 bits. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setBitCount(uint32_t base, I2C_BitCount size) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the selected options to the mode register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_BC_M) | + (uint16_t)size; +} + +//***************************************************************************** +// +//! Issues an I2C START condition. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a start condition. This +//! function is only valid when the I2C module specified by the \b base +//! parameter is a controller. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendStartCondition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the START condition bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_STT; +} + +//***************************************************************************** +// +//! Issues an I2C STOP condition. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a stop condition. This +//! function is only valid when the I2C module specified by the \b base +//! parameter is a controller. +//! +//! To check on the status of the STOP condition, I2C_getStopConditionStatus() +//! can be used. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendStopCondition(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the STOP condition bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_STP; +} + +//***************************************************************************** +// +//! Issues a no-acknowledge (NACK) bit. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function causes the I2C module to generate a NACK bit. This is only +//! applicable when the I2C module is acting as a receiver. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_sendNACK(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the NACK mode bit. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_NACKMOD; +} + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads a byte of data from the I2C Data Receive Register. +//! +//! \return Returns the byte received from by the I2C cast as an uint16_t. +// +//***************************************************************************** +static inline uint16_t +I2C_getData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the contents of the receive register. + // + return(HWREGH(base + I2C_O_DRR)); +} + +//***************************************************************************** +// +//! Transmits a byte from the I2C. +//! +//! \param base is the base address of the I2C instance used. +//! \param data is the data to be transmitted from the I2C Controller. +//! +//! This function places the supplied data into I2C Data Transmit Register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_putData(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Place the data into the transmit register. + // + HWREGH(base + I2C_O_DXR) = data; +} + +//***************************************************************************** +// +//! Get stop condition status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function reads and returns the stop condition bit status. +//! +//! \return Returns \b true if the STP bit has been set by the device to +//! generate a stop condition when the internal data counter of the I2C module +//! has reached 0. Returns \b false when the STP bit is zero. This bit is +//! automatically cleared after the stop condition has been generated. +// +//***************************************************************************** +static inline bool +I2C_getStopConditionStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Check the stop condition bit and return appropriately. + // + return((HWREGH(base + I2C_O_MDR) & I2C_MDR_STP) != 0U); +} + +//***************************************************************************** +// +//! Set number of bytes to be to transfer or receive when repeat mode is off. +//! +//! \param base is the base address of the I2C instance used. +//! \param count is the value to be put in the I2C data count register. +//! +//! This function sets the number of bytes to transfer or receive when repeat +//! mode is off. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setDataCount(uint32_t base, uint16_t count) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the count value to the appropriate register. + // + HWREGH(base + I2C_O_CNT) = count; +} + +//***************************************************************************** +// +//! Sets the addressing mode to either 7-bit or 10-bit. +//! +//! \param base is the base address of the I2C instance used. +//! \param mode is the address mode, 7-bit or 10-bit. +//! +//! This function configures the I2C module for either a 7-bit address +//! (default) or a 10-bit address. The \e mode parameter configures the address +//! length to 10 bits when its value is \b I2C_ADDR_MODE_10BITS and 7 bits when +//! \b I2C_ADDR_MODE_7BITS. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setAddressMode(uint32_t base, I2C_AddressMode mode) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the appropriate value to the address expansion bit. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_XA) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Sets I2C emulation mode. +//! +//! \param base is the base address of the I2C instance used. +//! \param mode is the emulation mode. +//! +//! This function sets the behavior of the I2C operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b I2C_EMULATION_STOP_SCL_LOW - If SCL is low when the breakpoint occurs, +//! the I2C module stops immediately. If SCL is high, the I2C module waits +//! until SCL becomes low and then stops. +//! - \b I2C_EMULATION_FREE_RUN - I2C operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_setEmulationMode(uint32_t base, I2C_EmulationMode mode) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Write the desired emulation mode to the register. + // + HWREGH(base + I2C_O_MDR) = (HWREGH(base + I2C_O_MDR) & ~I2C_MDR_FREE) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Enables I2C loopback mode. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function enables loopback mode. This mode is only valid during controller +//! mode and is helpful during device testing as it causes data transmitted out +//! of the data transmit register to be received in data receive register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Set the bit that enables loopback mode. + // + HWREGH(base + I2C_O_MDR) |= I2C_MDR_DLB; +} + +//***************************************************************************** +// +//! Disables I2C loopback mode. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function disables loopback mode. Loopback mode is disabled by default +//! after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +I2C_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Clear the bit that enables loopback mode. + // + HWREGH(base + I2C_O_MDR) &= ~I2C_MDR_DLB; +} + +//***************************************************************************** +// +//! Returns the current I2C interrupt source. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the event that generated an I2C basic (non-FIFO) +//! interrupt. The possible sources are the following: +//! - \b I2C_INTSRC_NONE +//! - \b I2C_INTSRC_ARB_LOST +//! - \b I2C_INTSRC_NO_ACK +//! - \b I2C_INTSRC_REG_ACCESS_RDY +//! - \b I2C_INTSRC_RX_DATA_RDY +//! - \b I2C_INTSRC_TX_DATA_RDY +//! - \b I2C_INTSRC_STOP_CONDITION +//! - \b I2C_INTSRC_ADDR_TARGET +//! +//! Calling this function will result in hardware automatically clearing the +//! current interrupt code and if ready, loading the next pending enabled +//! interrupt. It will also clear the corresponding interrupt flag if the +//! source is \b I2C_INTSRC_ARB_LOST, \b I2C_INTSRC_NO_ACK, or +//! \b I2C_INTSRC_STOP_CONDITION. +//! +//! \note Note that this function differs from I2C_getInterruptStatus() in that +//! it returns a single interrupt source. I2C_getInterruptSource() will return +//! the status of all interrupt flags possible, including the flags that aren't +//! necessarily enabled to generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline I2C_InterruptSource +I2C_getInterruptSource(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(I2C_isBaseValid(base)); + + // + // Return the interrupt source value + // + return((I2C_InterruptSource)(HWREGH(base + I2C_O_ISRC) & + I2C_ISRC_INTCODE_M)); +} + + + + + + + +//***************************************************************************** +// +//! Initializes the I2C Controller. +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param bitRate is the rate of the controller clock signal, SCL. +//! \param dutyCycle is duty cycle of the SCL signal. +//! +//! This function initializes operation of the I2C Controller by configuring the +//! bus speed for the controller. Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! A programmable prescaler in the I2C module divides down the input clock +//! (rate specified by \e sysclkHz) to produce the module clock (calculated to +//! be around 10 MHz in this function). That clock is then divided down further +//! to configure the SCL signal to run at the rate specified by \e bitRate. The +//! \e dutyCycle parameter determines the percentage of time high and time low +//! on the clock signal. The valid values are \b I2C_DUTYCYCLE_33 for 33% and +//! \b I2C_DUTYCYCLE_50 for 50%. +//! +//! The peripheral clock is the system clock. This value is returned by +//! SysCtl_getClock(), or it can be explicitly hard coded if it is +//! constant and known (to save the code/execution overhead of a call to +//! SysCtl_getClock()). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_initController(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle); + +//***************************************************************************** +// +//! Initializes the I2C Controller. +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param bitRate is the rate of the controller clock signal, SCL. +//! \param dutyCycle is duty cycle of the SCL signal. +//! \param moduleFrequency is the module clock used by I2C module +//! +//! This function initializes operation of the I2C Controller by configuring the +//! bus speed for the controller. Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! A programmable prescaler in the I2C module divides down the input clock +//! (rate specified by \e sysclkHz) to produce the module clock (calculated to +//! be around 10 MHz in this function). That clock is then divided down further +//! to configure the SCL signal to run at the rate specified by \e bitRate. The +//! \e dutyCycle parameter determines the percentage of time high and time low +//! on the clock signal. The valid values are \b I2C_DUTYCYCLE_33 for 33% and +//! \b I2C_DUTYCYCLE_50 for 50%. +//! +//! The peripheral clock is the system clock. This value is returned by +//! SysCtl_getClock(), or it can be explicitly hard coded if it is +//! constant and known (to save the code/execution overhead of a call to +//! SysCtl_getClock()). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_initControllerModuleFrequency(uint32_t base, uint32_t sysclkHz, uint32_t bitRate, + I2C_DutyCycle dutyCycle, uint32_t moduleFrequency); + +//***************************************************************************** +// +//! Enables I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated I2C Controller interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The \e intFlags parameter is the logical OR of any of the following: +//! +//! - \b I2C_INT_ARB_LOST - Arbitration-lost interrupt +//! - \b I2C_INT_NO_ACK - No-acknowledgment (NACK) interrupt +//! - \b I2C_INT_REG_ACCESS_RDY - Register-access-ready interrupt +//! - \b I2C_INT_RX_DATA_RDY - Receive-data-ready interrupt +//! - \b I2C_INT_TX_DATA_RDY - Transmit-data-ready interrupt +//! - \b I2C_INT_STOP_CONDITION - Stop condition detected +//! - \b I2C_INT_ADDR_TARGET - Addressed as target interrupt +//! - \b I2C_INT_RXFF - RX FIFO level interrupt +//! - \b I2C_INT_TXFF - TX FIFO level interrupt +//! +//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO +//! interrupt vector. All others are associated with the I2C basic interrupt. +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! This function disables the indicated I2C Target interrupt sources. Only +//! the sources that are enabled can be reflected to the processor interrupt. +//! Disabled sources have no effect on the processor. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to I2C_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current I2C interrupt status. +//! +//! \param base is the base address of the I2C instance used. +//! +//! This function returns the interrupt status for the I2C module. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! - \b I2C_INT_ARB_LOST +//! - \b I2C_INT_NO_ACK +//! - \b I2C_INT_REG_ACCESS_RDY +//! - \b I2C_INT_RX_DATA_RDY +//! - \b I2C_INT_TX_DATA_RDY +//! - \b I2C_INT_STOP_CONDITION +//! - \b I2C_INT_ADDR_TARGET +//! - \b I2C_INT_RXFF +//! - \b I2C_INT_TXFF +//! +//! \note This function will only return the status flags associated with +//! interrupts. However, a flag may be set even if its corresponding interrupt +//! is disabled. +// +//***************************************************************************** +extern uint32_t +I2C_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears I2C interrupt sources. +//! +//! \param base is the base address of the I2C instance used. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified I2C interrupt sources are cleared, so that they no longer +//! assert. This function must be called in the interrupt handler to keep the +//! interrupt from being triggered again immediately upon exit. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to I2C_enableInterrupt(). +//! +//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO +//! interrupt vector. All others are associated with the I2C basic interrupt. +//! +//! \note Also note that some of the status flags returned by +//! I2C_getInterruptStatus() cannot be cleared by this function. Some may only +//! be cleared by hardware or a reset of the I2C module. +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_clearInterruptStatus(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Configures I2C Module Clock Frequency +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! +//! This function configures I2C module clock frequency by initializing +//! prescale register based on SYSCLK frequency. +//! Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_configureModuleFrequency(uint32_t base, uint32_t sysclkHz); + +//***************************************************************************** +// +//! Configures I2C Module Clock Frequency with a given module clock +//! +//! \param base is the base address of the I2C instance used. +//! \param sysclkHz is the rate of the clock supplied to the I2C module +//! (SYSCLK) in Hz. +//! \param moduleFrequency is the rate of the module clock used by I2C module +//! This function configures I2C module clock frequency by initializing +//! prescale register based on SYSCLK frequency. +//! Note that the I2C module \b must be put into +//! reset before calling this function. You can do this with the function +//! I2C_disableModule(). +//! +//! \return None. +// +//***************************************************************************** +extern void +I2C_configureModuleClockFrequency(uint32_t base, uint32_t sysclkHz, uint32_t moduleFrequency); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // I2C_H diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_adc.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_adc.h new file mode 100644 index 0000000..89bd529 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_adc.h @@ -0,0 +1,911 @@ +//########################################################################### +// +// FILE: hw_adc.h +// +// TITLE: Definitions for the ADC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ADC_H +#define HW_ADC_H + +//************************************************************************************************* +// +// The following are defines for the ADC register offsets +// +//************************************************************************************************* +#define ADC_O_CTL1 0x0U // ADC Control 1 Register +#define ADC_O_CTL2 0x1U // ADC Control 2 Register +#define ADC_O_BURSTCTL 0x2U // ADC Burst Control Register +#define ADC_O_INTFLG 0x3U // ADC Interrupt Flag Register +#define ADC_O_INTFLGCLR 0x4U // ADC Interrupt Flag Clear Register +#define ADC_O_INTOVF 0x5U // ADC Interrupt Overflow Register +#define ADC_O_INTOVFCLR 0x6U // ADC Interrupt Overflow Clear Register +#define ADC_O_INTSEL1N2 0x7U // ADC Interrupt 1 and 2 Selection Register +#define ADC_O_INTSEL3N4 0x8U // ADC Interrupt 3 and 4 Selection Register +#define ADC_O_SOCPRICTL 0x9U // ADC SOC Priority Control Register +#define ADC_O_INTSOCSEL1 0xAU // ADC Interrupt SOC Selection 1 Register +#define ADC_O_INTSOCSEL2 0xBU // ADC Interrupt SOC Selection 2 Register +#define ADC_O_SOCFLG1 0xCU // ADC SOC Flag 1 Register +#define ADC_O_SOCFRC1 0xDU // ADC SOC Force 1 Register +#define ADC_O_SOCOVF1 0xEU // ADC SOC Overflow 1 Register +#define ADC_O_SOCOVFCLR1 0xFU // ADC SOC Overflow Clear 1 Register +#define ADC_O_SOC0CTL 0x10U // ADC SOC0 Control Register +#define ADC_O_SOC1CTL 0x12U // ADC SOC1 Control Register +#define ADC_O_SOC2CTL 0x14U // ADC SOC2 Control Register +#define ADC_O_SOC3CTL 0x16U // ADC SOC3 Control Register +#define ADC_O_SOC4CTL 0x18U // ADC SOC4 Control Register +#define ADC_O_SOC5CTL 0x1AU // ADC SOC5 Control Register +#define ADC_O_SOC6CTL 0x1CU // ADC SOC6 Control Register +#define ADC_O_SOC7CTL 0x1EU // ADC SOC7 Control Register +#define ADC_O_SOC8CTL 0x20U // ADC SOC8 Control Register +#define ADC_O_SOC9CTL 0x22U // ADC SOC9 Control Register +#define ADC_O_SOC10CTL 0x24U // ADC SOC10 Control Register +#define ADC_O_SOC11CTL 0x26U // ADC SOC11 Control Register +#define ADC_O_SOC12CTL 0x28U // ADC SOC12 Control Register +#define ADC_O_SOC13CTL 0x2AU // ADC SOC13 Control Register +#define ADC_O_SOC14CTL 0x2CU // ADC SOC14 Control Register +#define ADC_O_SOC15CTL 0x2EU // ADC SOC15 Control Register +#define ADC_O_EVTSTAT 0x30U // ADC Event Status Register +#define ADC_O_EVTCLR 0x32U // ADC Event Clear Register +#define ADC_O_EVTSEL 0x34U // ADC Event Selection Register +#define ADC_O_EVTINTSEL 0x36U // ADC Event Interrupt Selection Register +#define ADC_O_OSDETECT 0x38U // ADC Open and Shorts Detect Register +#define ADC_O_COUNTER 0x39U // ADC Counter Register +#define ADC_O_REV 0x3AU // ADC Revision Register +#define ADC_O_OFFTRIM 0x3BU // ADC Offset Trim Register +#define ADC_O_PPB1CONFIG 0x40U // ADC PPB1 Config Register +#define ADC_O_PPB1STAMP 0x41U // ADC PPB1 Sample Delay Time Stamp Register +#define ADC_O_PPB1OFFCAL 0x42U // ADC PPB1 Offset Calibration Register +#define ADC_O_PPB1OFFREF 0x43U // ADC PPB1 Offset Reference Register +#define ADC_O_PPB1TRIPHI 0x44U // ADC PPB1 Trip High Register +#define ADC_O_PPB1TRIPLO 0x46U // ADC PPB1 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB2CONFIG 0x48U // ADC PPB2 Config Register +#define ADC_O_PPB2STAMP 0x49U // ADC PPB2 Sample Delay Time Stamp Register +#define ADC_O_PPB2OFFCAL 0x4AU // ADC PPB2 Offset Calibration Register +#define ADC_O_PPB2OFFREF 0x4BU // ADC PPB2 Offset Reference Register +#define ADC_O_PPB2TRIPHI 0x4CU // ADC PPB2 Trip High Register +#define ADC_O_PPB2TRIPLO 0x4EU // ADC PPB2 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB3CONFIG 0x50U // ADC PPB3 Config Register +#define ADC_O_PPB3STAMP 0x51U // ADC PPB3 Sample Delay Time Stamp Register +#define ADC_O_PPB3OFFCAL 0x52U // ADC PPB3 Offset Calibration Register +#define ADC_O_PPB3OFFREF 0x53U // ADC PPB3 Offset Reference Register +#define ADC_O_PPB3TRIPHI 0x54U // ADC PPB3 Trip High Register +#define ADC_O_PPB3TRIPLO 0x56U // ADC PPB3 Trip Low/Trigger Time Stamp Register +#define ADC_O_PPB4CONFIG 0x58U // ADC PPB4 Config Register +#define ADC_O_PPB4STAMP 0x59U // ADC PPB4 Sample Delay Time Stamp Register +#define ADC_O_PPB4OFFCAL 0x5AU // ADC PPB4 Offset Calibration Register +#define ADC_O_PPB4OFFREF 0x5BU // ADC PPB4 Offset Reference Register +#define ADC_O_PPB4TRIPHI 0x5CU // ADC PPB4 Trip High Register +#define ADC_O_PPB4TRIPLO 0x5EU // ADC PPB4 Trip Low/Trigger Time Stamp Register +#define ADC_O_INLTRIM1 0x70U // ADC Linearity Trim 1 Register +#define ADC_O_INLTRIM2 0x72U // ADC Linearity Trim 2 Register +#define ADC_O_INLTRIM3 0x74U // ADC Linearity Trim 3 Register +#define ADC_O_INLTRIM4 0x76U // ADC Linearity Trim 4 Register +#define ADC_O_INLTRIM5 0x78U // ADC Linearity Trim 5 Register +#define ADC_O_INLTRIM6 0x7AU // ADC Linearity Trim 6 Register + +#define ADC_O_RESULT0 0x0U // ADC Result 0 Register +#define ADC_O_RESULT1 0x1U // ADC Result 1 Register +#define ADC_O_RESULT2 0x2U // ADC Result 2 Register +#define ADC_O_RESULT3 0x3U // ADC Result 3 Register +#define ADC_O_RESULT4 0x4U // ADC Result 4 Register +#define ADC_O_RESULT5 0x5U // ADC Result 5 Register +#define ADC_O_RESULT6 0x6U // ADC Result 6 Register +#define ADC_O_RESULT7 0x7U // ADC Result 7 Register +#define ADC_O_RESULT8 0x8U // ADC Result 8 Register +#define ADC_O_RESULT9 0x9U // ADC Result 9 Register +#define ADC_O_RESULT10 0xAU // ADC Result 10 Register +#define ADC_O_RESULT11 0xBU // ADC Result 11 Register +#define ADC_O_RESULT12 0xCU // ADC Result 12 Register +#define ADC_O_RESULT13 0xDU // ADC Result 13 Register +#define ADC_O_RESULT14 0xEU // ADC Result 14 Register +#define ADC_O_RESULT15 0xFU // ADC Result 15 Register +#define ADC_O_PPB1RESULT 0x10U // ADC Post Processing Block 1 Result Register +#define ADC_O_PPB2RESULT 0x12U // ADC Post Processing Block 2 Result Register +#define ADC_O_PPB3RESULT 0x14U // ADC Post Processing Block 3 Result Register +#define ADC_O_PPB4RESULT 0x16U // ADC Post Processing Block 4 Result Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCTL1 register +// +//************************************************************************************************* +#define ADC_CTL1_INTPULSEPOS 0x4U // ADC Interrupt Pulse Position +#define ADC_CTL1_ADCPWDNZ 0x80U // ADC Power Down +#define ADC_CTL1_ADCBSYCHN_S 8U +#define ADC_CTL1_ADCBSYCHN_M 0xF00U // ADC Busy Channel +#define ADC_CTL1_ADCBSY 0x2000U // ADC Busy + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCTL2 register +// +//************************************************************************************************* +#define ADC_CTL2_PRESCALE_S 0U +#define ADC_CTL2_PRESCALE_M 0xFU // ADC Clock Prescaler +#define ADC_CTL2_RESOLUTION 0x40U // SOC Conversion Resolution +#define ADC_CTL2_SIGNALMODE 0x80U // SOC Signaling Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCBURSTCTL register +// +//************************************************************************************************* +#define ADC_BURSTCTL_BURSTTRIGSEL_S 0U +#define ADC_BURSTCTL_BURSTTRIGSEL_M 0x3FU // SOC Burst Trigger Source Select +#define ADC_BURSTCTL_BURSTSIZE_S 8U +#define ADC_BURSTCTL_BURSTSIZE_M 0xF00U // SOC Burst Size Select +#define ADC_BURSTCTL_BURSTEN 0x8000U // SOC Burst Mode Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTFLG register +// +//************************************************************************************************* +#define ADC_INTFLG_ADCINT1 0x1U // ADC Interrupt 1 Flag +#define ADC_INTFLG_ADCINT2 0x2U // ADC Interrupt 2 Flag +#define ADC_INTFLG_ADCINT3 0x4U // ADC Interrupt 3 Flag +#define ADC_INTFLG_ADCINT4 0x8U // ADC Interrupt 4 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTFLGCLR register +// +//************************************************************************************************* +#define ADC_INTFLGCLR_ADCINT1 0x1U // ADC Interrupt 1 Flag Clear +#define ADC_INTFLGCLR_ADCINT2 0x2U // ADC Interrupt 2 Flag Clear +#define ADC_INTFLGCLR_ADCINT3 0x4U // ADC Interrupt 3 Flag Clear +#define ADC_INTFLGCLR_ADCINT4 0x8U // ADC Interrupt 4 Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTOVF register +// +//************************************************************************************************* +#define ADC_INTOVF_ADCINT1 0x1U // ADC Interrupt 1 Overflow Flags +#define ADC_INTOVF_ADCINT2 0x2U // ADC Interrupt 2 Overflow Flags +#define ADC_INTOVF_ADCINT3 0x4U // ADC Interrupt 3 Overflow Flags +#define ADC_INTOVF_ADCINT4 0x8U // ADC Interrupt 4 Overflow Flags + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTOVFCLR register +// +//************************************************************************************************* +#define ADC_INTOVFCLR_ADCINT1 0x1U // ADC Interrupt 1 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT2 0x2U // ADC Interrupt 2 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT3 0x4U // ADC Interrupt 3 Overflow Clear Bits +#define ADC_INTOVFCLR_ADCINT4 0x8U // ADC Interrupt 4 Overflow Clear Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSEL1N2 register +// +//************************************************************************************************* +#define ADC_INTSEL1N2_INT1SEL_S 0U +#define ADC_INTSEL1N2_INT1SEL_M 0xFU // ADCINT1 EOC Source Select +#define ADC_INTSEL1N2_INT1E 0x20U // ADCINT1 Interrupt Enable +#define ADC_INTSEL1N2_INT1CONT 0x40U // ADCINT1 Continue to Interrupt Mode +#define ADC_INTSEL1N2_INT2SEL_S 8U +#define ADC_INTSEL1N2_INT2SEL_M 0xF00U // ADCINT2 EOC Source Select +#define ADC_INTSEL1N2_INT2E 0x2000U // ADCINT2 Interrupt Enable +#define ADC_INTSEL1N2_INT2CONT 0x4000U // ADCINT2 Continue to Interrupt Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSEL3N4 register +// +//************************************************************************************************* +#define ADC_INTSEL3N4_INT3SEL_S 0U +#define ADC_INTSEL3N4_INT3SEL_M 0xFU // ADCINT3 EOC Source Select +#define ADC_INTSEL3N4_INT3E 0x20U // ADCINT3 Interrupt Enable +#define ADC_INTSEL3N4_INT3CONT 0x40U // ADCINT3 Continue to Interrupt Mode +#define ADC_INTSEL3N4_INT4SEL_S 8U +#define ADC_INTSEL3N4_INT4SEL_M 0xF00U // ADCINT4 EOC Source Select +#define ADC_INTSEL3N4_INT4E 0x2000U // ADCINT4 Interrupt Enable +#define ADC_INTSEL3N4_INT4CONT 0x4000U // ADCINT4 Continue to Interrupt Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCPRICTL register +// +//************************************************************************************************* +#define ADC_SOCPRICTL_SOCPRIORITY_S 0U +#define ADC_SOCPRICTL_SOCPRIORITY_M 0x1FU // SOC Priority +#define ADC_SOCPRICTL_RRPOINTER_S 5U +#define ADC_SOCPRICTL_RRPOINTER_M 0x3E0U // Round Robin Pointer + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSOCSEL1 register +// +//************************************************************************************************* +#define ADC_INTSOCSEL1_SOC0_S 0U +#define ADC_INTSOCSEL1_SOC0_M 0x3U // SOC0 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC1_S 2U +#define ADC_INTSOCSEL1_SOC1_M 0xCU // SOC1 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC2_S 4U +#define ADC_INTSOCSEL1_SOC2_M 0x30U // SOC2 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC3_S 6U +#define ADC_INTSOCSEL1_SOC3_M 0xC0U // SOC3 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC4_S 8U +#define ADC_INTSOCSEL1_SOC4_M 0x300U // SOC4 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC5_S 10U +#define ADC_INTSOCSEL1_SOC5_M 0xC00U // SOC5 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC6_S 12U +#define ADC_INTSOCSEL1_SOC6_M 0x3000U // SOC6 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL1_SOC7_S 14U +#define ADC_INTSOCSEL1_SOC7_M 0xC000U // SOC7 ADC Interrupt Trigger Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCINTSOCSEL2 register +// +//************************************************************************************************* +#define ADC_INTSOCSEL2_SOC8_S 0U +#define ADC_INTSOCSEL2_SOC8_M 0x3U // SOC8 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC9_S 2U +#define ADC_INTSOCSEL2_SOC9_M 0xCU // SOC9 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC10_S 4U +#define ADC_INTSOCSEL2_SOC10_M 0x30U // SOC10 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC11_S 6U +#define ADC_INTSOCSEL2_SOC11_M 0xC0U // SOC11 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC12_S 8U +#define ADC_INTSOCSEL2_SOC12_M 0x300U // SOC12 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC13_S 10U +#define ADC_INTSOCSEL2_SOC13_M 0xC00U // SOC13 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC14_S 12U +#define ADC_INTSOCSEL2_SOC14_M 0x3000U // SOC14 ADC Interrupt Trigger Select +#define ADC_INTSOCSEL2_SOC15_S 14U +#define ADC_INTSOCSEL2_SOC15_M 0xC000U // SOC15 ADC Interrupt Trigger Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCFLG1 register +// +//************************************************************************************************* +#define ADC_SOCFLG1_SOC0 0x1U // SOC0 Start of Conversion Flag +#define ADC_SOCFLG1_SOC1 0x2U // SOC1 Start of Conversion Flag +#define ADC_SOCFLG1_SOC2 0x4U // SOC2 Start of Conversion Flag +#define ADC_SOCFLG1_SOC3 0x8U // SOC3 Start of Conversion Flag +#define ADC_SOCFLG1_SOC4 0x10U // SOC4 Start of Conversion Flag +#define ADC_SOCFLG1_SOC5 0x20U // SOC5 Start of Conversion Flag +#define ADC_SOCFLG1_SOC6 0x40U // SOC6 Start of Conversion Flag +#define ADC_SOCFLG1_SOC7 0x80U // SOC7 Start of Conversion Flag +#define ADC_SOCFLG1_SOC8 0x100U // SOC8 Start of Conversion Flag +#define ADC_SOCFLG1_SOC9 0x200U // SOC9 Start of Conversion Flag +#define ADC_SOCFLG1_SOC10 0x400U // SOC10 Start of Conversion Flag +#define ADC_SOCFLG1_SOC11 0x800U // SOC11 Start of Conversion Flag +#define ADC_SOCFLG1_SOC12 0x1000U // SOC12 Start of Conversion Flag +#define ADC_SOCFLG1_SOC13 0x2000U // SOC13 Start of Conversion Flag +#define ADC_SOCFLG1_SOC14 0x4000U // SOC14 Start of Conversion Flag +#define ADC_SOCFLG1_SOC15 0x8000U // SOC15 Start of Conversion Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCFRC1 register +// +//************************************************************************************************* +#define ADC_SOCFRC1_SOC0 0x1U // SOC0 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC1 0x2U // SOC1 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC2 0x4U // SOC2 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC3 0x8U // SOC3 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC4 0x10U // SOC4 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC5 0x20U // SOC5 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC6 0x40U // SOC6 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC7 0x80U // SOC7 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC8 0x100U // SOC8 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC9 0x200U // SOC9 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC10 0x400U // SOC10 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC11 0x800U // SOC11 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC12 0x1000U // SOC12 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC13 0x2000U // SOC13 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC14 0x4000U // SOC14 Force Start of Conversion Bit +#define ADC_SOCFRC1_SOC15 0x8000U // SOC15 Force Start of Conversion Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOVF1 register +// +//************************************************************************************************* +#define ADC_SOCOVF1_SOC0 0x1U // SOC0 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC1 0x2U // SOC1 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC2 0x4U // SOC2 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC3 0x8U // SOC3 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC4 0x10U // SOC4 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC5 0x20U // SOC5 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC6 0x40U // SOC6 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC7 0x80U // SOC7 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC8 0x100U // SOC8 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC9 0x200U // SOC9 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC10 0x400U // SOC10 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC11 0x800U // SOC11 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC12 0x1000U // SOC12 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC13 0x2000U // SOC13 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC14 0x4000U // SOC14 Start of Conversion Overflow Flag +#define ADC_SOCOVF1_SOC15 0x8000U // SOC15 Start of Conversion Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOVFCLR1 register +// +//************************************************************************************************* +#define ADC_SOCOVFCLR1_SOC0 0x1U // SOC0 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC1 0x2U // SOC1 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC2 0x4U // SOC2 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC3 0x8U // SOC3 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC4 0x10U // SOC4 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC5 0x20U // SOC5 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC6 0x40U // SOC6 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC7 0x80U // SOC7 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC8 0x100U // SOC8 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC9 0x200U // SOC9 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC10 0x400U // SOC10 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC11 0x800U // SOC11 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC12 0x1000U // SOC12 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC13 0x2000U // SOC13 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC14 0x4000U // SOC14 Clear Start of Conversion Overflow Bit +#define ADC_SOCOVFCLR1_SOC15 0x8000U // SOC15 Clear Start of Conversion Overflow Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC0CTL register +// +//************************************************************************************************* +#define ADC_SOC0CTL_ACQPS_S 0U +#define ADC_SOC0CTL_ACQPS_M 0x1FFU // SOC0 Acquisition Prescale +#define ADC_SOC0CTL_CHSEL_S 15U +#define ADC_SOC0CTL_CHSEL_M 0x78000U // SOC0 Channel Select +#define ADC_SOC0CTL_TRIGSEL_S 20U +#define ADC_SOC0CTL_TRIGSEL_M 0x1F00000U // SOC0 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC1CTL register +// +//************************************************************************************************* +#define ADC_SOC1CTL_ACQPS_S 0U +#define ADC_SOC1CTL_ACQPS_M 0x1FFU // SOC1 Acquisition Prescale +#define ADC_SOC1CTL_CHSEL_S 15U +#define ADC_SOC1CTL_CHSEL_M 0x78000U // SOC1 Channel Select +#define ADC_SOC1CTL_TRIGSEL_S 20U +#define ADC_SOC1CTL_TRIGSEL_M 0x1F00000U // SOC1 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC2CTL register +// +//************************************************************************************************* +#define ADC_SOC2CTL_ACQPS_S 0U +#define ADC_SOC2CTL_ACQPS_M 0x1FFU // SOC2 Acquisition Prescale +#define ADC_SOC2CTL_CHSEL_S 15U +#define ADC_SOC2CTL_CHSEL_M 0x78000U // SOC2 Channel Select +#define ADC_SOC2CTL_TRIGSEL_S 20U +#define ADC_SOC2CTL_TRIGSEL_M 0x1F00000U // SOC2 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC3CTL register +// +//************************************************************************************************* +#define ADC_SOC3CTL_ACQPS_S 0U +#define ADC_SOC3CTL_ACQPS_M 0x1FFU // SOC3 Acquisition Prescale +#define ADC_SOC3CTL_CHSEL_S 15U +#define ADC_SOC3CTL_CHSEL_M 0x78000U // SOC3 Channel Select +#define ADC_SOC3CTL_TRIGSEL_S 20U +#define ADC_SOC3CTL_TRIGSEL_M 0x1F00000U // SOC3 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC4CTL register +// +//************************************************************************************************* +#define ADC_SOC4CTL_ACQPS_S 0U +#define ADC_SOC4CTL_ACQPS_M 0x1FFU // SOC4 Acquisition Prescale +#define ADC_SOC4CTL_CHSEL_S 15U +#define ADC_SOC4CTL_CHSEL_M 0x78000U // SOC4 Channel Select +#define ADC_SOC4CTL_TRIGSEL_S 20U +#define ADC_SOC4CTL_TRIGSEL_M 0x1F00000U // SOC4 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC5CTL register +// +//************************************************************************************************* +#define ADC_SOC5CTL_ACQPS_S 0U +#define ADC_SOC5CTL_ACQPS_M 0x1FFU // SOC5 Acquisition Prescale +#define ADC_SOC5CTL_CHSEL_S 15U +#define ADC_SOC5CTL_CHSEL_M 0x78000U // SOC5 Channel Select +#define ADC_SOC5CTL_TRIGSEL_S 20U +#define ADC_SOC5CTL_TRIGSEL_M 0x1F00000U // SOC5 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC6CTL register +// +//************************************************************************************************* +#define ADC_SOC6CTL_ACQPS_S 0U +#define ADC_SOC6CTL_ACQPS_M 0x1FFU // SOC6 Acquisition Prescale +#define ADC_SOC6CTL_CHSEL_S 15U +#define ADC_SOC6CTL_CHSEL_M 0x78000U // SOC6 Channel Select +#define ADC_SOC6CTL_TRIGSEL_S 20U +#define ADC_SOC6CTL_TRIGSEL_M 0x1F00000U // SOC6 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC7CTL register +// +//************************************************************************************************* +#define ADC_SOC7CTL_ACQPS_S 0U +#define ADC_SOC7CTL_ACQPS_M 0x1FFU // SOC7 Acquisition Prescale +#define ADC_SOC7CTL_CHSEL_S 15U +#define ADC_SOC7CTL_CHSEL_M 0x78000U // SOC7 Channel Select +#define ADC_SOC7CTL_TRIGSEL_S 20U +#define ADC_SOC7CTL_TRIGSEL_M 0x1F00000U // SOC7 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC8CTL register +// +//************************************************************************************************* +#define ADC_SOC8CTL_ACQPS_S 0U +#define ADC_SOC8CTL_ACQPS_M 0x1FFU // SOC8 Acquisition Prescale +#define ADC_SOC8CTL_CHSEL_S 15U +#define ADC_SOC8CTL_CHSEL_M 0x78000U // SOC8 Channel Select +#define ADC_SOC8CTL_TRIGSEL_S 20U +#define ADC_SOC8CTL_TRIGSEL_M 0x1F00000U // SOC8 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC9CTL register +// +//************************************************************************************************* +#define ADC_SOC9CTL_ACQPS_S 0U +#define ADC_SOC9CTL_ACQPS_M 0x1FFU // SOC9 Acquisition Prescale +#define ADC_SOC9CTL_CHSEL_S 15U +#define ADC_SOC9CTL_CHSEL_M 0x78000U // SOC9 Channel Select +#define ADC_SOC9CTL_TRIGSEL_S 20U +#define ADC_SOC9CTL_TRIGSEL_M 0x1F00000U // SOC9 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC10CTL register +// +//************************************************************************************************* +#define ADC_SOC10CTL_ACQPS_S 0U +#define ADC_SOC10CTL_ACQPS_M 0x1FFU // SOC10 Acquisition Prescale +#define ADC_SOC10CTL_CHSEL_S 15U +#define ADC_SOC10CTL_CHSEL_M 0x78000U // SOC10 Channel Select +#define ADC_SOC10CTL_TRIGSEL_S 20U +#define ADC_SOC10CTL_TRIGSEL_M 0x1F00000U // SOC10 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC11CTL register +// +//************************************************************************************************* +#define ADC_SOC11CTL_ACQPS_S 0U +#define ADC_SOC11CTL_ACQPS_M 0x1FFU // SOC11 Acquisition Prescale +#define ADC_SOC11CTL_CHSEL_S 15U +#define ADC_SOC11CTL_CHSEL_M 0x78000U // SOC11 Channel Select +#define ADC_SOC11CTL_TRIGSEL_S 20U +#define ADC_SOC11CTL_TRIGSEL_M 0x1F00000U // SOC11 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC12CTL register +// +//************************************************************************************************* +#define ADC_SOC12CTL_ACQPS_S 0U +#define ADC_SOC12CTL_ACQPS_M 0x1FFU // SOC12 Acquisition Prescale +#define ADC_SOC12CTL_CHSEL_S 15U +#define ADC_SOC12CTL_CHSEL_M 0x78000U // SOC12 Channel Select +#define ADC_SOC12CTL_TRIGSEL_S 20U +#define ADC_SOC12CTL_TRIGSEL_M 0x1F00000U // SOC12 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC13CTL register +// +//************************************************************************************************* +#define ADC_SOC13CTL_ACQPS_S 0U +#define ADC_SOC13CTL_ACQPS_M 0x1FFU // SOC13 Acquisition Prescale +#define ADC_SOC13CTL_CHSEL_S 15U +#define ADC_SOC13CTL_CHSEL_M 0x78000U // SOC13 Channel Select +#define ADC_SOC13CTL_TRIGSEL_S 20U +#define ADC_SOC13CTL_TRIGSEL_M 0x1F00000U // SOC13 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC14CTL register +// +//************************************************************************************************* +#define ADC_SOC14CTL_ACQPS_S 0U +#define ADC_SOC14CTL_ACQPS_M 0x1FFU // SOC14 Acquisition Prescale +#define ADC_SOC14CTL_CHSEL_S 15U +#define ADC_SOC14CTL_CHSEL_M 0x78000U // SOC14 Channel Select +#define ADC_SOC14CTL_TRIGSEL_S 20U +#define ADC_SOC14CTL_TRIGSEL_M 0x1F00000U // SOC14 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOC15CTL register +// +//************************************************************************************************* +#define ADC_SOC15CTL_ACQPS_S 0U +#define ADC_SOC15CTL_ACQPS_M 0x1FFU // SOC15 Acquisition Prescale +#define ADC_SOC15CTL_CHSEL_S 15U +#define ADC_SOC15CTL_CHSEL_M 0x78000U // SOC15 Channel Select +#define ADC_SOC15CTL_TRIGSEL_S 20U +#define ADC_SOC15CTL_TRIGSEL_M 0x1F00000U // SOC15 Trigger Source Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTSTAT register +// +//************************************************************************************************* +#define ADC_EVTSTAT_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Flag +#define ADC_EVTSTAT_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Flag +#define ADC_EVTSTAT_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Flag +#define ADC_EVTSTAT_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Flag +#define ADC_EVTSTAT_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Flag +#define ADC_EVTSTAT_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Flag +#define ADC_EVTSTAT_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Flag +#define ADC_EVTSTAT_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Flag +#define ADC_EVTSTAT_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Flag +#define ADC_EVTSTAT_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Flag +#define ADC_EVTSTAT_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Flag +#define ADC_EVTSTAT_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTCLR register +// +//************************************************************************************************* +#define ADC_EVTCLR_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Clear +#define ADC_EVTCLR_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Clear +#define ADC_EVTCLR_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Clear +#define ADC_EVTCLR_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Clear +#define ADC_EVTCLR_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Clear +#define ADC_EVTCLR_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Clear +#define ADC_EVTCLR_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Clear +#define ADC_EVTCLR_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Clear +#define ADC_EVTCLR_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Clear +#define ADC_EVTCLR_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Clear +#define ADC_EVTCLR_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Clear +#define ADC_EVTCLR_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTSEL register +// +//************************************************************************************************* +#define ADC_EVTSEL_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Event Enable +#define ADC_EVTSEL_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Event Enable +#define ADC_EVTSEL_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Event Enable +#define ADC_EVTSEL_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Event Enable +#define ADC_EVTSEL_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Event Enable +#define ADC_EVTSEL_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Event Enable +#define ADC_EVTSEL_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Event Enable +#define ADC_EVTSEL_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Event Enable +#define ADC_EVTSEL_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Event Enable +#define ADC_EVTSEL_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Event Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCEVTINTSEL register +// +//************************************************************************************************* +#define ADC_EVTINTSEL_PPB1TRIPHI 0x1U // Post Processing Block 1 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB1TRIPLO 0x2U // Post Processing Block 1 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB1ZERO 0x4U // Post Processing Block 1 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB2TRIPHI 0x10U // Post Processing Block 2 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB2TRIPLO 0x20U // Post Processing Block 2 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB2ZERO 0x40U // Post Processing Block 2 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB3TRIPHI 0x100U // Post Processing Block 3 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB3TRIPLO 0x200U // Post Processing Block 3 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB3ZERO 0x400U // Post Processing Block 3 Zero Crossing Interrupt + // Enable +#define ADC_EVTINTSEL_PPB4TRIPHI 0x1000U // Post Processing Block 4 Trip High Interrupt Enable +#define ADC_EVTINTSEL_PPB4TRIPLO 0x2000U // Post Processing Block 4 Trip Low Interrupt Enable +#define ADC_EVTINTSEL_PPB4ZERO 0x4000U // Post Processing Block 4 Zero Crossing Interrupt + // Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCOSDETECT register +// +//************************************************************************************************* +#define ADC_OSDETECT_DETECTCFG_S 0U +#define ADC_OSDETECT_DETECTCFG_M 0x7U // ADC Opens and Shorts Detect Configuration + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCCOUNTER register +// +//************************************************************************************************* +#define ADC_COUNTER_FREECOUNT_S 0U +#define ADC_COUNTER_FREECOUNT_M 0xFFFU // ADC Free Running Counter Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCREV register +// +//************************************************************************************************* +#define ADC_REV_TYPE_S 0U +#define ADC_REV_TYPE_M 0xFFU // ADC Type +#define ADC_REV_REV_S 8U +#define ADC_REV_REV_M 0xFF00U // ADC Revision + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCOFFTRIM register +// +//************************************************************************************************* +#define ADC_OFFTRIM_OFFTRIM_S 0U +#define ADC_OFFTRIM_OFFTRIM_M 0xFFU // ADC Offset Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1CONFIG register +// +//************************************************************************************************* +#define ADC_PPB1CONFIG_CONFIG_S 0U +#define ADC_PPB1CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 1 Configuration +#define ADC_PPB1CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 1 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1STAMP register +// +//************************************************************************************************* +#define ADC_PPB1STAMP_DLYSTAMP_S 0U +#define ADC_PPB1STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 1 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB1OFFCAL_OFFCAL_S 0U +#define ADC_PPB1OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB1TRIPHI_LIMITHI_S 0U +#define ADC_PPB1TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 1 Trip High Limit +#define ADC_PPB1TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB1TRIPLO_LIMITLO_S 0U +#define ADC_PPB1TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 1 Trip Low Limit +#define ADC_PPB1TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB1TRIPLO_REQSTAMP_S 20U +#define ADC_PPB1TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 1 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2CONFIG register +// +//************************************************************************************************* +#define ADC_PPB2CONFIG_CONFIG_S 0U +#define ADC_PPB2CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 2 Configuration +#define ADC_PPB2CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 2 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2STAMP register +// +//************************************************************************************************* +#define ADC_PPB2STAMP_DLYSTAMP_S 0U +#define ADC_PPB2STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 2 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB2OFFCAL_OFFCAL_S 0U +#define ADC_PPB2OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB2TRIPHI_LIMITHI_S 0U +#define ADC_PPB2TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 2 Trip High Limit +#define ADC_PPB2TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB2TRIPLO_LIMITLO_S 0U +#define ADC_PPB2TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 2 Trip Low Limit +#define ADC_PPB2TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB2TRIPLO_REQSTAMP_S 20U +#define ADC_PPB2TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 2 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3CONFIG register +// +//************************************************************************************************* +#define ADC_PPB3CONFIG_CONFIG_S 0U +#define ADC_PPB3CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 3 Configuration +#define ADC_PPB3CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 3 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3STAMP register +// +//************************************************************************************************* +#define ADC_PPB3STAMP_DLYSTAMP_S 0U +#define ADC_PPB3STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 3 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB3OFFCAL_OFFCAL_S 0U +#define ADC_PPB3OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB3TRIPHI_LIMITHI_S 0U +#define ADC_PPB3TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 3 Trip High Limit +#define ADC_PPB3TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB3TRIPLO_LIMITLO_S 0U +#define ADC_PPB3TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 3 Trip Low Limit +#define ADC_PPB3TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB3TRIPLO_REQSTAMP_S 20U +#define ADC_PPB3TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 3 Request Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4CONFIG register +// +//************************************************************************************************* +#define ADC_PPB4CONFIG_CONFIG_S 0U +#define ADC_PPB4CONFIG_CONFIG_M 0xFU // ADC Post Processing Block 4 Configuration +#define ADC_PPB4CONFIG_TWOSCOMPEN 0x10U // ADC Post Processing Block 4 Two's Complement Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4STAMP register +// +//************************************************************************************************* +#define ADC_PPB4STAMP_DLYSTAMP_S 0U +#define ADC_PPB4STAMP_DLYSTAMP_M 0xFFFU // ADC Post Processing Block 4 Delay Time Stamp + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4OFFCAL register +// +//************************************************************************************************* +#define ADC_PPB4OFFCAL_OFFCAL_S 0U +#define ADC_PPB4OFFCAL_OFFCAL_M 0x3FFU // ADC Post Processing Block Offset Correction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4TRIPHI register +// +//************************************************************************************************* +#define ADC_PPB4TRIPHI_LIMITHI_S 0U +#define ADC_PPB4TRIPHI_LIMITHI_M 0xFFFFU // ADC Post Processing Block 4 Trip High Limit +#define ADC_PPB4TRIPHI_HSIGN 0x10000U // High Limit Sign Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4TRIPLO register +// +//************************************************************************************************* +#define ADC_PPB4TRIPLO_LIMITLO_S 0U +#define ADC_PPB4TRIPLO_LIMITLO_M 0xFFFFU // ADC Post Processing Block 4 Trip Low Limit +#define ADC_PPB4TRIPLO_LSIGN 0x10000U // Low Limit Sign Bit +#define ADC_PPB4TRIPLO_REQSTAMP_S 20U +#define ADC_PPB4TRIPLO_REQSTAMP_M 0xFFF00000U // ADC Post Processing Block 4 Request Time Stamp + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB1RESULT register +// +//************************************************************************************************* +#define ADC_PPB1RESULT_PPBRESULT_S 0U +#define ADC_PPB1RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB1RESULT_SIGN_S 16U +#define ADC_PPB1RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB2RESULT register +// +//************************************************************************************************* +#define ADC_PPB2RESULT_PPBRESULT_S 0U +#define ADC_PPB2RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB2RESULT_SIGN_S 16U +#define ADC_PPB2RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB3RESULT register +// +//************************************************************************************************* +#define ADC_PPB3RESULT_PPBRESULT_S 0U +#define ADC_PPB3RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB3RESULT_SIGN_S 16U +#define ADC_PPB3RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCPPB4RESULT register +// +//************************************************************************************************* +#define ADC_PPB4RESULT_PPBRESULT_S 0U +#define ADC_PPB4RESULT_PPBRESULT_M 0xFFFFU // ADC Post Processing Block Result +#define ADC_PPB4RESULT_SIGN_S 16U +#define ADC_PPB4RESULT_SIGN_M 0xFFFF0000U // Sign Extended Bits + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_asysctl.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_asysctl.h new file mode 100644 index 0000000..4ee1c62 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_asysctl.h @@ -0,0 +1,145 @@ +//########################################################################### +// +// FILE: hw_asysctl.h +// +// TITLE: Definitions for the ASYSCTL registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ASYSCTL_H +#define HW_ASYSCTL_H + +//************************************************************************************************* +// +// The following are defines for the ASYSCTL register offsets +// +//************************************************************************************************* +#define ASYSCTL_O_INTOSC1TRIM 0x20U // Internal Oscillator 1 Trim Register +#define ASYSCTL_O_INTOSC2TRIM 0x22U // Internal Oscillator 2 Trim Register +#define ASYSCTL_O_TSNSCTL 0x26U // Temperature Sensor Control Register +#define ASYSCTL_O_LOCK 0x2EU // Lock Register +#define ASYSCTL_O_ANAREFTRIMA 0x36U // Analog Reference Trim A Register +#define ASYSCTL_O_ANAREFTRIMB 0x38U // Analog Reference Trim B Register +#define ASYSCTL_O_ANAREFTRIMC 0x3AU // Analog Reference Trim C Register +#define ASYSCTL_O_ANAREFTRIMD 0x3CU // Analog Reference Trim D Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTOSC1TRIM register +// +//************************************************************************************************* +#define ASYSCTL_INTOSC1TRIM_VALFINETRIM_S 0U +#define ASYSCTL_INTOSC1TRIM_VALFINETRIM_M 0xFFFU // Oscillator Value Fine Trim Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTOSC2TRIM register +// +//************************************************************************************************* +#define ASYSCTL_INTOSC2TRIM_VALFINETRIM_S 0U +#define ASYSCTL_INTOSC2TRIM_VALFINETRIM_M 0xFFFU // Oscillator Value Fine Trim Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TSNSCTL register +// +//************************************************************************************************* +#define ASYSCTL_TSNSCTL_ENABLE 0x1U // Temperature Sensor Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LOCK register +// +//************************************************************************************************* +#define ASYSCTL_LOCK_TSNSCTL 0x8U // Temperature Sensor Control Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMA 0x800000U // Analog Reference A Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMB 0x1000000U // Analog Reference B Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMC 0x2000000U // Analog Reference C Trim Register Lock +#define ASYSCTL_LOCK_ANAREFTRIMD 0x4000000U // Analog Reference D Trim Register Lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMA register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMA_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMA_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMA_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMA_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMA_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMA_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMB register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMB_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMB_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMB_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMB_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMB_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMB_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMC register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMC_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMC_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMC_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMC_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMC_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMC_IREFTRIM_M 0xF800U // Reference Current Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ANAREFTRIMD register +// +//************************************************************************************************* +#define ASYSCTL_ANAREFTRIMD_BGVALTRIM_S 0U +#define ASYSCTL_ANAREFTRIMD_BGVALTRIM_M 0x3FU // Bandgap Value Trim +#define ASYSCTL_ANAREFTRIMD_BGSLOPETRIM_S 6U +#define ASYSCTL_ANAREFTRIMD_BGSLOPETRIM_M 0x7C0U // Bandgap Slope Trim +#define ASYSCTL_ANAREFTRIMD_IREFTRIM_S 11U +#define ASYSCTL_ANAREFTRIMD_IREFTRIM_M 0xF800U // Reference Current Trim + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_can.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_can.h new file mode 100644 index 0000000..05bc58b --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_can.h @@ -0,0 +1,514 @@ +//########################################################################### +// +// FILE: hw_can.h +// +// TITLE: Definitions for the CAN registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CAN_H +#define HW_CAN_H + +//************************************************************************************************* +// +// The following are defines for the CAN register offsets +// +//************************************************************************************************* +#define CAN_O_CTL 0x0U // CAN Control Register +#define CAN_O_ES 0x4U // Error and Status Register +#define CAN_O_ERRC 0x8U // Error Counter Register +#define CAN_O_BTR 0xCU // Bit Timing Register +#define CAN_O_INT 0x10U // Interrupt Register +#define CAN_O_TEST 0x14U // Test Register +#define CAN_O_PERR 0x1CU // CAN Parity Error Code Register +#define CAN_O_RAM_INIT 0x40U // CAN RAM Initialization Register +#define CAN_O_GLB_INT_EN 0x50U // CAN Global Interrupt Enable Register +#define CAN_O_GLB_INT_FLG 0x54U // CAN Global Interrupt Flag Register +#define CAN_O_GLB_INT_CLR 0x58U // CAN Global Interrupt Clear Register +#define CAN_O_ABOTR 0x80U // Auto-Bus-On Time Register +#define CAN_O_TXRQ_X 0x84U // CAN Transmission Request Register +#define CAN_O_TXRQ_21 0x88U // CAN Transmission Request 2_1 Register +#define CAN_O_NDAT_X 0x98U // CAN New Data Register +#define CAN_O_NDAT_21 0x9CU // CAN New Data 2_1 Register +#define CAN_O_IPEN_X 0xACU // CAN Interrupt Pending Register +#define CAN_O_IPEN_21 0xB0U // CAN Interrupt Pending 2_1 Register +#define CAN_O_MVAL_X 0xC0U // CAN Message Valid Register +#define CAN_O_MVAL_21 0xC4U // CAN Message Valid 2_1 Register +#define CAN_O_IP_MUX21 0xD8U // CAN Interrupt Multiplexer 2_1 Register +#define CAN_O_IF1CMD 0x100U // IF1 Command Register +#define CAN_O_IF1MSK 0x104U // IF1 Mask Register +#define CAN_O_IF1ARB 0x108U // IF1 Arbitration Register +#define CAN_O_IF1MCTL 0x10CU // IF1 Message Control Register +#define CAN_O_IF1DATA 0x110U // IF1 Data A Register +#define CAN_O_IF1DATB 0x114U // IF1 Data B Register +#define CAN_O_IF2CMD 0x120U // IF2 Command Register +#define CAN_O_IF2MSK 0x124U // IF2 Mask Register +#define CAN_O_IF2ARB 0x128U // IF2 Arbitration Register +#define CAN_O_IF2MCTL 0x12CU // IF2 Message Control Register +#define CAN_O_IF2DATA 0x130U // IF2 Data A Register +#define CAN_O_IF2DATB 0x134U // IF2 Data B Register +#define CAN_O_IF3OBS 0x140U // IF3 Observation Register +#define CAN_O_IF3MSK 0x144U // IF3 Mask Register +#define CAN_O_IF3ARB 0x148U // IF3 Arbitration Register +#define CAN_O_IF3MCTL 0x14CU // IF3 Message Control Register +#define CAN_O_IF3DATA 0x150U // IF3 Data A Register +#define CAN_O_IF3DATB 0x154U // IF3 Data B Register +#define CAN_O_IF3UPD 0x160U // IF3 Update Enable Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_CTL register +// +//************************************************************************************************* +#define CAN_CTL_INIT 0x1U // Initialization +#define CAN_CTL_IE0 0x2U // Interrupt line 0 Enable +#define CAN_CTL_SIE 0x4U // Status Change Interrupt Enable +#define CAN_CTL_EIE 0x8U // Error Interrupt Enable +#define CAN_CTL_DAR 0x20U // Disable Automatic Retransmission +#define CAN_CTL_CCE 0x40U // Configuration Change Enable +#define CAN_CTL_TEST 0x80U // Test Mode Enable +#define CAN_CTL_IDS 0x100U // Interruption Debug Support Enable +#define CAN_CTL_ABO 0x200U // Auto-Bus-On Enable +#define CAN_CTL_PMD_S 10U +#define CAN_CTL_PMD_M 0x3C00U // Parity on/off +#define CAN_CTL_SWR 0x8000U // SW Reset Enable +#define CAN_CTL_INITDBG 0x10000U // Debug Mode Status +#define CAN_CTL_IE1 0x20000U // Interrupt line 1 Enable Disabled + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_ES register +// +//************************************************************************************************* +#define CAN_ES_LEC_S 0U +#define CAN_ES_LEC_M 0x7U // Last Error Code +#define CAN_ES_TXOK 0x8U // Transmission status +#define CAN_ES_RXOK 0x10U // Reception status +#define CAN_ES_EPASS 0x20U // Error Passive State +#define CAN_ES_EWARN 0x40U // Warning State +#define CAN_ES_BOFF 0x80U // Bus-Off State +#define CAN_ES_PER 0x100U // Parity Error Detected + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_ERRC register +// +//************************************************************************************************* +#define CAN_ERRC_TEC_S 0U +#define CAN_ERRC_TEC_M 0xFFU // Transmit Error Counter +#define CAN_ERRC_REC_S 8U +#define CAN_ERRC_REC_M 0x7F00U // Receive Error Counter +#define CAN_ERRC_RP 0x8000U // Receive Error Passive + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_BTR register +// +//************************************************************************************************* +#define CAN_BTR_BRP_S 0U +#define CAN_BTR_BRP_M 0x3FU // Baud Rate Prescaler +#define CAN_BTR_SJW_S 6U +#define CAN_BTR_SJW_M 0xC0U // Synchronization Jump Width +#define CAN_BTR_TSEG1_S 8U +#define CAN_BTR_TSEG1_M 0xF00U // Time segment +#define CAN_BTR_TSEG2_S 12U +#define CAN_BTR_TSEG2_M 0x7000U // Time segment +#define CAN_BTR_BRPE_S 16U +#define CAN_BTR_BRPE_M 0xF0000U // Baud Rate Prescaler Extension + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_INT register +// +//************************************************************************************************* +#define CAN_INT_INT0ID_S 0U +#define CAN_INT_INT0ID_M 0xFFFFU // Interrupt Identifier +#define CAN_INT_INT1ID_S 16U +#define CAN_INT_INT1ID_M 0xFF0000U // Interrupt 1 Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_TEST register +// +//************************************************************************************************* +#define CAN_TEST_SILENT 0x8U // Silent Mode +#define CAN_TEST_LBACK 0x10U // Loopback Mode +#define CAN_TEST_TX_S 5U +#define CAN_TEST_TX_M 0x60U // CANTX Pin Control +#define CAN_TEST_RX 0x80U // CANRX Pin Status +#define CAN_TEST_EXL 0x100U // External Loopback Mode +#define CAN_TEST_RDA 0x200U // RAM Direct Access Enable: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_PERR register +// +//************************************************************************************************* +#define CAN_PERR_MSG_NUM_S 0U +#define CAN_PERR_MSG_NUM_M 0xFFU // Message Number +#define CAN_PERR_WORD_NUM_S 8U +#define CAN_PERR_WORD_NUM_M 0x700U // Word Number + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_RAM_INIT register +// +//************************************************************************************************* +#define CAN_RAM_INIT_KEY0 0x1U // KEY0 +#define CAN_RAM_INIT_KEY1 0x2U // KEY1 +#define CAN_RAM_INIT_KEY2 0x4U // KEY2 +#define CAN_RAM_INIT_KEY3 0x8U // KEY3 +#define CAN_RAM_INIT_CAN_RAM_INIT 0x10U // Initialize CAN Mailbox RAM +#define CAN_RAM_INIT_RAM_INIT_DONE 0x20U // CAN RAM initialization complete + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_EN register +// +//************************************************************************************************* +#define CAN_GLB_INT_EN_GLBINT0_EN 0x1U // Global Interrupt Enable for CANINT0 +#define CAN_GLB_INT_EN_GLBINT1_EN 0x2U // Global Interrupt Enable for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_FLG register +// +//************************************************************************************************* +#define CAN_GLB_INT_FLG_INT0_FLG 0x1U // Global Interrupt Flag for CANINT0 +#define CAN_GLB_INT_FLG_INT1_FLG 0x2U // Global Interrupt Flag for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_GLB_INT_CLR register +// +//************************************************************************************************* +#define CAN_GLB_INT_CLR_INT0_FLG_CLR 0x1U // Global Interrupt flag clear for CANINT0 +#define CAN_GLB_INT_CLR_INT1_FLG_CLR 0x2U // Global Interrupt flag clear for CANINT1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_TXRQ_X register +// +//************************************************************************************************* +#define CAN_TXRQ_X_TXRQSTREG1_S 0U +#define CAN_TXRQ_X_TXRQSTREG1_M 0x3U // Transmit Request Register 1 +#define CAN_TXRQ_X_TXRQSTREG2_S 2U +#define CAN_TXRQ_X_TXRQSTREG2_M 0xCU // Transmit Request Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_NDAT_X register +// +//************************************************************************************************* +#define CAN_NDAT_X_NEWDATREG1_S 0U +#define CAN_NDAT_X_NEWDATREG1_M 0x3U // New Data Register 1 +#define CAN_NDAT_X_NEWDATREG2_S 2U +#define CAN_NDAT_X_NEWDATREG2_M 0xCU // New Data Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IPEN_X register +// +//************************************************************************************************* +#define CAN_IPEN_X_INTPNDREG1_S 0U +#define CAN_IPEN_X_INTPNDREG1_M 0x3U // Interrupt Pending Register 1 +#define CAN_IPEN_X_INTPNDREG2_S 2U +#define CAN_IPEN_X_INTPNDREG2_M 0xCU // Interrupt Pending Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_MVAL_X register +// +//************************************************************************************************* +#define CAN_MVAL_X_MSGVALREG1_S 0U +#define CAN_MVAL_X_MSGVALREG1_M 0x3U // Message Valid Register 1 +#define CAN_MVAL_X_MSGVALREG2_S 2U +#define CAN_MVAL_X_MSGVALREG2_M 0xCU // Message Valid Register 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1CMD register +// +//************************************************************************************************* +#define CAN_IF1CMD_MSG_NUM_S 0U +#define CAN_IF1CMD_MSG_NUM_M 0xFFU // Message Number +#define CAN_IF1CMD_BUSY 0x8000U // Busy Flag +#define CAN_IF1CMD_DATA_B 0x10000U // Access Data Bytes 4-7 +#define CAN_IF1CMD_DATA_A 0x20000U // Access Data Bytes 0-3 +#define CAN_IF1CMD_TXRQST 0x40000U // Access Transmission Request Bit +#define CAN_IF1CMD_CLRINTPND 0x80000U // Clear Interrupt Pending Bit +#define CAN_IF1CMD_CONTROL 0x100000U // Access Control Bits +#define CAN_IF1CMD_ARB 0x200000U // Access Arbitration Bits +#define CAN_IF1CMD_MASK 0x400000U // Access Mask Bits +#define CAN_IF1CMD_DIR 0x800000U // Write/Read Direction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1MSK register +// +//************************************************************************************************* +#define CAN_IF1MSK_MSK_S 0U +#define CAN_IF1MSK_MSK_M 0x1FFFFFFFU // Identifier Mask +#define CAN_IF1MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF1MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1ARB register +// +//************************************************************************************************* +#define CAN_IF1ARB_ID_S 0U +#define CAN_IF1ARB_ID_M 0x1FFFFFFFU // ` +#define CAN_IF1ARB_DIR 0x20000000U // Message Direction +#define CAN_IF1ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF1ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1MCTL register +// +//************************************************************************************************* +#define CAN_IF1MCTL_DLC_S 0U +#define CAN_IF1MCTL_DLC_M 0xFU // Data length code +#define CAN_IF1MCTL_EOB 0x80U // End of Block +#define CAN_IF1MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF1MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF1MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF1MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF1MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF1MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF1MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF1MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1DATA register +// +//************************************************************************************************* +#define CAN_IF1DATA_DATA_0_S 0U +#define CAN_IF1DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF1DATA_DATA_1_S 8U +#define CAN_IF1DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF1DATA_DATA_2_S 16U +#define CAN_IF1DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF1DATA_DATA_3_S 24U +#define CAN_IF1DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF1DATB register +// +//************************************************************************************************* +#define CAN_IF1DATB_DATA_4_S 0U +#define CAN_IF1DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF1DATB_DATA_5_S 8U +#define CAN_IF1DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF1DATB_DATA_6_S 16U +#define CAN_IF1DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF1DATB_DATA_7_S 24U +#define CAN_IF1DATB_DATA_7_M 0xFF000000U // Data Byte 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2CMD register +// +//************************************************************************************************* +#define CAN_IF2CMD_MSG_NUM_S 0U +#define CAN_IF2CMD_MSG_NUM_M 0xFFU // Message Number +#define CAN_IF2CMD_BUSY 0x8000U // Busy Flag +#define CAN_IF2CMD_DATA_B 0x10000U // Access Data Bytes 4-7 +#define CAN_IF2CMD_DATA_A 0x20000U // Access Data Bytes 0-3 +#define CAN_IF2CMD_TXRQST 0x40000U // Access Transmission Request Bit +#define CAN_IF2CMD_CLRINTPND 0x80000U // Clear Interrupt Pending Bit +#define CAN_IF2CMD_CONTROL 0x100000U // Access Control Bits +#define CAN_IF2CMD_ARB 0x200000U // Access Arbitration Bits +#define CAN_IF2CMD_MASK 0x400000U // Access Mask Bits +#define CAN_IF2CMD_DIR 0x800000U // Write/Read Direction + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2MSK register +// +//************************************************************************************************* +#define CAN_IF2MSK_MSK_S 0U +#define CAN_IF2MSK_MSK_M 0x1FFFFFFFU // Identifier Mask +#define CAN_IF2MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF2MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2ARB register +// +//************************************************************************************************* +#define CAN_IF2ARB_ID_S 0U +#define CAN_IF2ARB_ID_M 0x1FFFFFFFU // Message Identifier +#define CAN_IF2ARB_DIR 0x20000000U // Message Direction +#define CAN_IF2ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF2ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2MCTL register +// +//************************************************************************************************* +#define CAN_IF2MCTL_DLC_S 0U +#define CAN_IF2MCTL_DLC_M 0xFU // Data length code +#define CAN_IF2MCTL_EOB 0x80U // End of Block +#define CAN_IF2MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF2MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF2MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF2MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF2MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF2MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF2MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF2MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2DATA register +// +//************************************************************************************************* +#define CAN_IF2DATA_DATA_0_S 0U +#define CAN_IF2DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF2DATA_DATA_1_S 8U +#define CAN_IF2DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF2DATA_DATA_2_S 16U +#define CAN_IF2DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF2DATA_DATA_3_S 24U +#define CAN_IF2DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF2DATB register +// +//************************************************************************************************* +#define CAN_IF2DATB_DATA_4_S 0U +#define CAN_IF2DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF2DATB_DATA_5_S 8U +#define CAN_IF2DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF2DATB_DATA_6_S 16U +#define CAN_IF2DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF2DATB_DATA_7_S 24U +#define CAN_IF2DATB_DATA_7_M 0xFF000000U // Data Byte 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3OBS register +// +//************************************************************************************************* +#define CAN_IF3OBS_MASK 0x1U // Mask data read observation +#define CAN_IF3OBS_ARB 0x2U // Arbitration data read observation +#define CAN_IF3OBS_CTRL 0x4U // Ctrl read observation +#define CAN_IF3OBS_DATA_A 0x8U // Data A read observation +#define CAN_IF3OBS_DATA_B 0x10U // Data B read observation +#define CAN_IF3OBS_IF3SM 0x100U // IF3 Status of Mask data read access +#define CAN_IF3OBS_IF3SA 0x200U // IF3 Status of Arbitration data read access +#define CAN_IF3OBS_IF3SC 0x400U // IF3 Status of Control bits read access +#define CAN_IF3OBS_IF3SDA 0x800U // IF3 Status of Data A read access +#define CAN_IF3OBS_IF3SDB 0x1000U // IF3 Status of Data B read access +#define CAN_IF3OBS_IF3UPD 0x8000U // IF3 Update Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3MSK register +// +//************************************************************************************************* +#define CAN_IF3MSK_MSK_S 0U +#define CAN_IF3MSK_MSK_M 0x1FFFFFFFU // Mask +#define CAN_IF3MSK_MDIR 0x40000000U // Mask Message Direction +#define CAN_IF3MSK_MXTD 0x80000000U // Mask Extended Identifier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3ARB register +// +//************************************************************************************************* +#define CAN_IF3ARB_ID_S 0U +#define CAN_IF3ARB_ID_M 0x1FFFFFFFU // Message Identifier +#define CAN_IF3ARB_DIR 0x20000000U // Message Direction +#define CAN_IF3ARB_XTD 0x40000000U // Extended Identifier +#define CAN_IF3ARB_MSGVAL 0x80000000U // Message Valid + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3MCTL register +// +//************************************************************************************************* +#define CAN_IF3MCTL_DLC_S 0U +#define CAN_IF3MCTL_DLC_M 0xFU // Data length code +#define CAN_IF3MCTL_EOB 0x80U // End of Block +#define CAN_IF3MCTL_TXRQST 0x100U // Transmit Request +#define CAN_IF3MCTL_RMTEN 0x200U // Remote Enable +#define CAN_IF3MCTL_RXIE 0x400U // Receive Interrupt Enable +#define CAN_IF3MCTL_TXIE 0x800U // Transmit Interrupt Enable +#define CAN_IF3MCTL_UMASK 0x1000U // Use Acceptance Mask +#define CAN_IF3MCTL_INTPND 0x2000U // Interrupt Pending +#define CAN_IF3MCTL_MSGLST 0x4000U // Message Lost +#define CAN_IF3MCTL_NEWDAT 0x8000U // New Data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3DATA register +// +//************************************************************************************************* +#define CAN_IF3DATA_DATA_0_S 0U +#define CAN_IF3DATA_DATA_0_M 0xFFU // Data Byte 0 +#define CAN_IF3DATA_DATA_1_S 8U +#define CAN_IF3DATA_DATA_1_M 0xFF00U // Data Byte 1 +#define CAN_IF3DATA_DATA_2_S 16U +#define CAN_IF3DATA_DATA_2_M 0xFF0000U // Data Byte 2 +#define CAN_IF3DATA_DATA_3_S 24U +#define CAN_IF3DATA_DATA_3_M 0xFF000000U // Data Byte 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CAN_IF3DATB register +// +//************************************************************************************************* +#define CAN_IF3DATB_DATA_4_S 0U +#define CAN_IF3DATB_DATA_4_M 0xFFU // Data Byte 4 +#define CAN_IF3DATB_DATA_5_S 8U +#define CAN_IF3DATB_DATA_5_M 0xFF00U // Data Byte 5 +#define CAN_IF3DATB_DATA_6_S 16U +#define CAN_IF3DATB_DATA_6_M 0xFF0000U // Data Byte 6 +#define CAN_IF3DATB_DATA_7_S 24U +#define CAN_IF3DATB_DATA_7_M 0xFF000000U // Data Byte 7 + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_cla.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cla.h new file mode 100644 index 0000000..0206de7 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cla.h @@ -0,0 +1,241 @@ +//########################################################################### +// +// FILE: hw_cla.h +// +// TITLE: Definitions for the CLA registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLA_H +#define HW_CLA_H + +//************************************************************************************************* +// +// The following are defines for the CLA register offsets +// +//************************************************************************************************* +#ifndef __TMS320C28XX_CLA__ +#define CLA_O_MVECT1 0x0U // Task Interrupt Vector +#define CLA_O_MVECT2 0x1U // Task Interrupt Vector +#define CLA_O_MVECT3 0x2U // Task Interrupt Vector +#define CLA_O_MVECT4 0x3U // Task Interrupt Vector +#define CLA_O_MVECT5 0x4U // Task Interrupt Vector +#define CLA_O_MVECT6 0x5U // Task Interrupt Vector +#define CLA_O_MVECT7 0x6U // Task Interrupt Vector +#define CLA_O_MVECT8 0x7U // Task Interrupt Vector +#define CLA_O_MCTL 0x10U // Control Register +#define CLA_O_MIFR 0x20U // Interrupt Flag Register +#define CLA_O_MIOVF 0x21U // Interrupt Overflow Flag Register +#define CLA_O_MIFRC 0x22U // Interrupt Force Register +#define CLA_O_MICLR 0x23U // Interrupt Flag Clear Register +#define CLA_O_MICLROVF 0x24U // Interrupt Overflow Flag Clear Register +#define CLA_O_MIER 0x25U // Interrupt Enable Register +#define CLA_O_MIRUN 0x26U // Interrupt Run Status Register +#define CLA_O_MPC 0x28U // CLA Program Counter +#define CLA_O_MAR0 0x2AU // CLA Auxiliary Register 0 +#define CLA_O_MAR1 0x2BU // CLA Auxiliary Register 1 +#define CLA_O_MSTF 0x2EU // CLA Floating-Point Status Register +#define CLA_O_MR0 0x30U // CLA Floating-Point Result Register 0 +#define CLA_O_MR1 0x34U // CLA Floating-Point Result Register 1 +#define CLA_O_MR2 0x38U // CLA Floating-Point Result Register 2 +#define CLA_O_MR3 0x3CU // CLA Floating-Point Result Register 3 +#endif + +#ifdef __TMS320C28XX_CLA__ +#define CLA_O_SOFTINTEN 0x0U // CLA Software Interrupt Enable Register +#define CLA_O_SOFTINTFRC 0x2U // CLA Software Interrupt Force Register +#endif + + +#ifndef __TMS320C28XX_CLA__ +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCTL register +// +//************************************************************************************************* +#define CLA_MCTL_HARDRESET 0x1U // Hard Reset +#define CLA_MCTL_SOFTRESET 0x2U // Soft Reset +#define CLA_MCTL_IACKE 0x4U // IACK enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIFR register +// +//************************************************************************************************* +#define CLA_MIFR_INT1 0x1U // Task 1 Interrupt Flag +#define CLA_MIFR_INT2 0x2U // Task 2 Interrupt Flag +#define CLA_MIFR_INT3 0x4U // Task 3 Interrupt Flag +#define CLA_MIFR_INT4 0x8U // Task 4 Interrupt Flag +#define CLA_MIFR_INT5 0x10U // Task 5 Interrupt Flag +#define CLA_MIFR_INT6 0x20U // Task 6 Interrupt Flag +#define CLA_MIFR_INT7 0x40U // Task 7 Interrupt Flag +#define CLA_MIFR_INT8 0x80U // Task 8 Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIOVF register +// +//************************************************************************************************* +#define CLA_MIOVF_INT1 0x1U // Task 1 Interrupt Overflow Flag +#define CLA_MIOVF_INT2 0x2U // Task 2 Interrupt Overflow Flag +#define CLA_MIOVF_INT3 0x4U // Task 3 Interrupt Overflow Flag +#define CLA_MIOVF_INT4 0x8U // Task 4 Interrupt Overflow Flag +#define CLA_MIOVF_INT5 0x10U // Task 5 Interrupt Overflow Flag +#define CLA_MIOVF_INT6 0x20U // Task 6 Interrupt Overflow Flag +#define CLA_MIOVF_INT7 0x40U // Task 7 Interrupt Overflow Flag +#define CLA_MIOVF_INT8 0x80U // Task 8 Interrupt Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIFRC register +// +//************************************************************************************************* +#define CLA_MIFRC_INT1 0x1U // Task 1 Interrupt Force +#define CLA_MIFRC_INT2 0x2U // Task 2 Interrupt Force +#define CLA_MIFRC_INT3 0x4U // Task 3 Interrupt Force +#define CLA_MIFRC_INT4 0x8U // Task 4 Interrupt Force +#define CLA_MIFRC_INT5 0x10U // Task 5 Interrupt Force +#define CLA_MIFRC_INT6 0x20U // Task 6 Interrupt Force +#define CLA_MIFRC_INT7 0x40U // Task 7 Interrupt Force +#define CLA_MIFRC_INT8 0x80U // Task 8 Interrupt Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MICLR register +// +//************************************************************************************************* +#define CLA_MICLR_INT1 0x1U // Task 1 Interrupt Flag Clear +#define CLA_MICLR_INT2 0x2U // Task 2 Interrupt Flag Clear +#define CLA_MICLR_INT3 0x4U // Task 3 Interrupt Flag Clear +#define CLA_MICLR_INT4 0x8U // Task 4 Interrupt Flag Clear +#define CLA_MICLR_INT5 0x10U // Task 5 Interrupt Flag Clear +#define CLA_MICLR_INT6 0x20U // Task 6 Interrupt Flag Clear +#define CLA_MICLR_INT7 0x40U // Task 7 Interrupt Flag Clear +#define CLA_MICLR_INT8 0x80U // Task 8 Interrupt Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MICLROVF register +// +//************************************************************************************************* +#define CLA_MICLROVF_INT1 0x1U // Task 1 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT2 0x2U // Task 2 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT3 0x4U // Task 3 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT4 0x8U // Task 4 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT5 0x10U // Task 5 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT6 0x20U // Task 6 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT7 0x40U // Task 7 Interrupt Overflow Flag Clear +#define CLA_MICLROVF_INT8 0x80U // Task 8 Interrupt Overflow Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIER register +// +//************************************************************************************************* +#define CLA_MIER_INT1 0x1U // Task 1 Interrupt Enable +#define CLA_MIER_INT2 0x2U // Task 2 Interrupt Enable +#define CLA_MIER_INT3 0x4U // Task 3 Interrupt Enable +#define CLA_MIER_INT4 0x8U // Task 4 Interrupt Enable +#define CLA_MIER_INT5 0x10U // Task 5 Interrupt Enable +#define CLA_MIER_INT6 0x20U // Task 6 Interrupt Enable +#define CLA_MIER_INT7 0x40U // Task 7 Interrupt Enable +#define CLA_MIER_INT8 0x80U // Task 8 Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MIRUN register +// +//************************************************************************************************* +#define CLA_MIRUN_INT1 0x1U // Task 1 Run Status +#define CLA_MIRUN_INT2 0x2U // Task 2 Run Status +#define CLA_MIRUN_INT3 0x4U // Task 3 Run Status +#define CLA_MIRUN_INT4 0x8U // Task 4 Run Status +#define CLA_MIRUN_INT5 0x10U // Task 5 Run Status +#define CLA_MIRUN_INT6 0x20U // Task 6 Run Status +#define CLA_MIRUN_INT7 0x40U // Task 7 Run Status +#define CLA_MIRUN_INT8 0x80U // Task 8 Run Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the _MSTF register +// +//************************************************************************************************* +#define CLA_MSTF_LVF 0x1U // Latched Overflow Flag +#define CLA_MSTF_LUF 0x2U // Latched Underflow Flag +#define CLA_MSTF_NF 0x4U // Negative Float Flag +#define CLA_MSTF_ZF 0x8U // Zero Float Flag +#define CLA_MSTF_TF 0x40U // Test Flag +#define CLA_MSTF_RNDF32 0x200U // Round 32-bit Floating-Point Mode +#define CLA_MSTF_MEALLOW 0x800U // MEALLOW Status +#define CLA_MSTF_RPC_S 12U +#define CLA_MSTF_RPC_M 0xFFFF000U // Return PC + +#endif + +#ifdef __TMS320C28XX_CLA__ +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTINTEN register +// +//************************************************************************************************* +#define CLA_SOFTINTEN_TASK1 0x1U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK2 0x2U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK3 0x4U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK4 0x8U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK5 0x10U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK6 0x20U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK7 0x40U // Configure Software Interrupt or End of Task interrupt. +#define CLA_SOFTINTEN_TASK8 0x80U // Configure Software Interrupt or End of Task interrupt. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTINTFRC register +// +//************************************************************************************************* +#define CLA_SOFTINTFRC_TASK1 0x1U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK2 0x2U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK3 0x4U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK4 0x8U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK5 0x10U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK6 0x20U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK7 0x40U // Force CLA software interrupt for the corresponding task. +#define CLA_SOFTINTFRC_TASK8 0x80U // Force CLA software interrupt for the corresponding task. + +#endif + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_clb.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_clb.h new file mode 100644 index 0000000..4390004 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_clb.h @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: hw_clb.h +// +// TITLE: Definitions for the CLB registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLB_H +#define HW_CLB_H + +//************************************************************************************************* +// +// The following are defines for the CLB register offsets +// +//************************************************************************************************* +#define CLB_O_COUNT_RESET 0x2U // Counter Block RESET +#define CLB_O_COUNT_MODE_1 0x4U // Counter Block MODE_1 +#define CLB_O_COUNT_MODE_0 0x6U // Counter Block MODE_0 +#define CLB_O_COUNT_EVENT 0x8U // Counter Block EVENT +#define CLB_O_FSM_EXTRA_IN0 0xAU // FSM Extra EXT_IN0 +#define CLB_O_FSM_EXTERNAL_IN0 0xCU // FSM EXT_IN0 +#define CLB_O_FSM_EXTERNAL_IN1 0xEU // FSM_EXT_IN1 +#define CLB_O_FSM_EXTRA_IN1 0x10U // FSM Extra_EXT_IN1 +#define CLB_O_LUT4_IN0 0x12U // LUT4_0/1/2 IN0 input source +#define CLB_O_LUT4_IN1 0x14U // LUT4_0/1/2 IN1 input source +#define CLB_O_LUT4_IN2 0x16U // LUT4_0/1/2 IN2 input source +#define CLB_O_LUT4_IN3 0x18U // LUT4_0/1/2 IN3 input source +#define CLB_O_FSM_LUT_FN1_0 0x1CU // LUT function for FSM Unit 1 and Unit 0 +#define CLB_O_FSM_LUT_FN2 0x1EU // LUT function for FSM Unit 2 +#define CLB_O_LUT4_FN1_0 0x20U // LUT function for LUT4 block of Unit 1 and 0 +#define CLB_O_LUT4_FN2 0x22U // LUT function for LUT4 block of Unit 2 +#define CLB_O_FSM_NEXT_STATE_0 0x24U // FSM Next state equations for Unit 0 +#define CLB_O_FSM_NEXT_STATE_1 0x26U // FSM Next state equations for Unit 1 +#define CLB_O_FSM_NEXT_STATE_2 0x28U // FSM Next state equations for Unit 2 +#define CLB_O_MISC_CONTROL 0x2AU // Static controls for Ctr,FSM +#define CLB_O_OUTPUT_LUT_0 0x2CU // Inp Sel, LUT fns for Out0 +#define CLB_O_OUTPUT_LUT_1 0x2EU // Inp Sel, LUT fns for Out1 +#define CLB_O_OUTPUT_LUT_2 0x30U // Inp Sel, LUT fns for Out2 +#define CLB_O_OUTPUT_LUT_3 0x32U // Inp Sel, LUT fns for Out3 +#define CLB_O_OUTPUT_LUT_4 0x34U // Inp Sel, LUT fns for Out4 +#define CLB_O_OUTPUT_LUT_5 0x36U // Inp Sel, LUT fns for Out5 +#define CLB_O_OUTPUT_LUT_6 0x38U // Inp Sel, LUT fns for Out6 +#define CLB_O_OUTPUT_LUT_7 0x3AU // Inp Sel, LUT fns for Out7 +#define CLB_O_HLC_EVENT_SEL 0x3CU // Event Selector register for the High Level controller + +#define CLB_O_LOAD_EN 0x0U // Global enable & indirect load enable control +#define CLB_O_LOAD_ADDR 0x2U // Indirect address +#define CLB_O_LOAD_DATA 0x4U // Data for indirect loads +#define CLB_O_INPUT_FILTER 0x6U // Input filter selection for both edge detection and + // synchronizers +#define CLB_O_IN_MUX_SEL_0 0x8U // Input selection to decide between Signals and GP register +#define CLB_O_LCL_MUX_SEL_1 0xAU // Input Mux selection for local mux +#define CLB_O_LCL_MUX_SEL_2 0xCU // Input Mux selection for local mux +#define CLB_O_BUF_PTR 0xEU // PUSH and PULL pointers +#define CLB_O_GP_REG 0x10U // General purpose register for CELL inputs +#define CLB_O_OUT_EN 0x12U // CELL output enable register +#define CLB_O_GLBL_MUX_SEL_1 0x14U // Global Mux select for CELL inputs +#define CLB_O_GLBL_MUX_SEL_2 0x16U // Global Mux select for CELL inputs +#define CLB_O_INTR_TAG_REG 0x20U // Interrupt Tag register +#define CLB_O_LOCK 0x22U // Lock control register +#define CLB_O_DBG_R0 0x30U // R0 of High level Controller +#define CLB_O_DBG_R1 0x32U // R1 of High level Controller +#define CLB_O_DBG_R2 0x34U // R2 of High level Controller +#define CLB_O_DBG_R3 0x36U // R3 of High level Controller +#define CLB_O_DBG_C0 0x38U // Count of Unit 0 +#define CLB_O_DBG_C1 0x3AU // Count of Unit 1 +#define CLB_O_DBG_C2 0x3CU // Count of Unit 2 +#define CLB_O_DBG_OUT 0x3EU // Outputs of various units in the Cell + +#define CLB_O_PUSH(i) (0x0U + ((i) * 0x2U)) // (0 <= i < 4) CLB_PUSH FIFO Registers (from + // HLC) +#define CLB_O_PULL(i) (0x100U + ((i) * 0x2U)) // (0 <= i < 4) CLB_PULL FIFO Registers (TO HLC) + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_RESET register +// +//************************************************************************************************* +#define CLB_COUNT_RESET_SEL_0_S 0U +#define CLB_COUNT_RESET_SEL_0_M 0x1FU // Count Reset Select 0 +#define CLB_COUNT_RESET_SEL_1_S 5U +#define CLB_COUNT_RESET_SEL_1_M 0x3E0U // Count Reset Select 1 +#define CLB_COUNT_RESET_SEL_2_S 10U +#define CLB_COUNT_RESET_SEL_2_M 0x7C00U // Count Reset Select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_MODE_1 register +// +//************************************************************************************************* +#define CLB_COUNT_MODE_1_SEL_0_S 0U +#define CLB_COUNT_MODE_1_SEL_0_M 0x1FU // Counter mode 1 select 0 +#define CLB_COUNT_MODE_1_SEL_1_S 5U +#define CLB_COUNT_MODE_1_SEL_1_M 0x3E0U // Counter mode 1 select 1 +#define CLB_COUNT_MODE_1_SEL_2_S 10U +#define CLB_COUNT_MODE_1_SEL_2_M 0x7C00U // Counter mode 1 select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_MODE_0 register +// +//************************************************************************************************* +#define CLB_COUNT_MODE_0_SEL_0_S 0U +#define CLB_COUNT_MODE_0_SEL_0_M 0x1FU // Counter mode 0 select 0 +#define CLB_COUNT_MODE_0_SEL_1_S 5U +#define CLB_COUNT_MODE_0_SEL_1_M 0x3E0U // Counter mode 0 select 1 +#define CLB_COUNT_MODE_0_SEL_2_S 10U +#define CLB_COUNT_MODE_0_SEL_2_M 0x7C00U // Counter mode 0 select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_COUNT_EVENT register +// +//************************************************************************************************* +#define CLB_COUNT_EVENT_SEL_0_S 0U +#define CLB_COUNT_EVENT_SEL_0_M 0x1FU // Counter event select 0 +#define CLB_COUNT_EVENT_SEL_1_S 5U +#define CLB_COUNT_EVENT_SEL_1_M 0x3E0U // Counter event select 1 +#define CLB_COUNT_EVENT_SEL_2_S 10U +#define CLB_COUNT_EVENT_SEL_2_M 0x7C00U // Counter event select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN0 register +// +//************************************************************************************************* +#define CLB_FSM_EXTRA_IN0_SEL_0_S 0U +#define CLB_FSM_EXTRA_IN0_SEL_0_M 0x1FU // FSM extra ext input select 0 +#define CLB_FSM_EXTRA_IN0_SEL_1_S 5U +#define CLB_FSM_EXTRA_IN0_SEL_1_M 0x3E0U // FSM extra ext input select 1 +#define CLB_FSM_EXTRA_IN0_SEL_2_S 10U +#define CLB_FSM_EXTRA_IN0_SEL_2_M 0x7C00U // FSM extra ext input select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN0 register +// +//************************************************************************************************* +#define CLB_FSM_EXTERNAL_IN0_SEL_0_S 0U +#define CLB_FSM_EXTERNAL_IN0_SEL_0_M 0x1FU // FSM EXT_IN0 select input for unit 0 +#define CLB_FSM_EXTERNAL_IN0_SEL_1_S 5U +#define CLB_FSM_EXTERNAL_IN0_SEL_1_M 0x3E0U // FSM EXT_IN0 select input for unit 1 +#define CLB_FSM_EXTERNAL_IN0_SEL_2_S 10U +#define CLB_FSM_EXTERNAL_IN0_SEL_2_M 0x7C00U // FSM EXT_IN0 select input for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN1 register +// +//************************************************************************************************* +#define CLB_FSM_EXTERNAL_IN1_SEL_0_S 0U +#define CLB_FSM_EXTERNAL_IN1_SEL_0_M 0x1FU // FSM EXT_IN1 select input for unit 0 +#define CLB_FSM_EXTERNAL_IN1_SEL_1_S 5U +#define CLB_FSM_EXTERNAL_IN1_SEL_1_M 0x3E0U // FSM EXT_IN1 select input for unit 1 +#define CLB_FSM_EXTERNAL_IN1_SEL_2_S 10U +#define CLB_FSM_EXTERNAL_IN1_SEL_2_M 0x7C00U // FSM EXT_IN1 select input for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN1 register +// +//************************************************************************************************* +#define CLB_FSM_EXTRA_IN1_SEL_0_S 0U +#define CLB_FSM_EXTRA_IN1_SEL_0_M 0x1FU // FSM extra ext input select 0 +#define CLB_FSM_EXTRA_IN1_SEL_1_S 5U +#define CLB_FSM_EXTRA_IN1_SEL_1_M 0x3E0U // FSM extra ext input select 1 +#define CLB_FSM_EXTRA_IN1_SEL_2_S 10U +#define CLB_FSM_EXTRA_IN1_SEL_2_M 0x7C00U // FSM extra ext input select 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN0 register +// +//************************************************************************************************* +#define CLB_LUT4_IN0_SEL_0_S 0U +#define CLB_LUT4_IN0_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN0_SEL_1_S 5U +#define CLB_LUT4_IN0_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN0_SEL_2_S 10U +#define CLB_LUT4_IN0_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN1 register +// +//************************************************************************************************* +#define CLB_LUT4_IN1_SEL_0_S 0U +#define CLB_LUT4_IN1_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN1_SEL_1_S 5U +#define CLB_LUT4_IN1_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN1_SEL_2_S 10U +#define CLB_LUT4_IN1_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN2 register +// +//************************************************************************************************* +#define CLB_LUT4_IN2_SEL_0_S 0U +#define CLB_LUT4_IN2_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN2_SEL_1_S 5U +#define CLB_LUT4_IN2_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN2_SEL_2_S 10U +#define CLB_LUT4_IN2_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_IN3 register +// +//************************************************************************************************* +#define CLB_LUT4_IN3_SEL_0_S 0U +#define CLB_LUT4_IN3_SEL_0_M 0x1FU // Select inputs for unit 0 +#define CLB_LUT4_IN3_SEL_1_S 5U +#define CLB_LUT4_IN3_SEL_1_M 0x3E0U // Select inputs for unit 1 +#define CLB_LUT4_IN3_SEL_2_S 10U +#define CLB_LUT4_IN3_SEL_2_M 0x7C00U // Select inputs for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_LUT_FN1_0 register +// +//************************************************************************************************* +#define CLB_FSM_LUT_FN1_0_FN0_S 0U +#define CLB_FSM_LUT_FN1_0_FN0_M 0xFFFFU // FSM LUT output function for unit 0 +#define CLB_FSM_LUT_FN1_0_FN1_S 16U +#define CLB_FSM_LUT_FN1_0_FN1_M 0xFFFF0000U // FSM LUT output function for unit 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_LUT_FN2 register +// +//************************************************************************************************* +#define CLB_FSM_LUT_FN2_FN1_S 0U +#define CLB_FSM_LUT_FN2_FN1_M 0xFFFFU // FSM LUT output function for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_FN1_0 register +// +//************************************************************************************************* +#define CLB_LUT4_FN1_0_FN0_S 0U +#define CLB_LUT4_FN1_0_FN0_M 0xFFFFU // LUT4 output function for unit 0 +#define CLB_LUT4_FN1_0_FN1_S 16U +#define CLB_LUT4_FN1_0_FN1_M 0xFFFF0000U // LUT4 output function for unit 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LUT4_FN2 register +// +//************************************************************************************************* +#define CLB_LUT4_FN2_FN1_S 0U +#define CLB_LUT4_FN2_FN1_M 0xFFFFU // LUT4 output function for unit 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_0 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_0_S0_S 0U +#define CLB_FSM_NEXT_STATE_0_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_0_S1_S 16U +#define CLB_FSM_NEXT_STATE_0_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_1 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_1_S0_S 0U +#define CLB_FSM_NEXT_STATE_1_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_1_S1_S 16U +#define CLB_FSM_NEXT_STATE_1_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_2 register +// +//************************************************************************************************* +#define CLB_FSM_NEXT_STATE_2_S0_S 0U +#define CLB_FSM_NEXT_STATE_2_S0_M 0xFFFFU // FSM next state function for S0 +#define CLB_FSM_NEXT_STATE_2_S1_S 16U +#define CLB_FSM_NEXT_STATE_2_S1_M 0xFFFF0000U // FSM next state function for S1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_MISC_CONTROL register +// +//************************************************************************************************* +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_0 0x1U // Add/Shift for counter 0 +#define CLB_MISC_CONTROL_COUNT_DIR_0 0x2U // Direction for counter 0 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_0 0x4U // Event control for counter 0 +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_1 0x8U // Add/Shift for counter 1 +#define CLB_MISC_CONTROL_COUNT_DIR_1 0x10U // Direction for counter 1 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_1 0x20U // Event control for counter 1 +#define CLB_MISC_CONTROL_COUNT_ADD_SHIFT_2 0x40U // Add/Shift for counter 2 +#define CLB_MISC_CONTROL_COUNT_DIR_2 0x80U // Direction for counter 2 +#define CLB_MISC_CONTROL_COUNT_EVENT_CTRL_2 0x100U // Event control for counter 2 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_0 0x200U // Serializer enable 0 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_1 0x400U // Serializer enable 1 +#define CLB_MISC_CONTROL_COUNT_SERIALIZER_2 0x800U // Serializer enable 2 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_0 0x1000U // FSM extra_sel0 for 0 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_0 0x2000U // FSM extra_sel1 for 0 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_1 0x4000U // FSM extra_sel0 for 1 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_1 0x8000U // FSM extra_sel1 for 1 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL0_2 0x10000U // FSM extra_sel0 for 2 +#define CLB_MISC_CONTROL_FSM_EXTRA_SEL1_2 0x20000U // FSM extra_sel1 for 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_0 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_0_IN0_S 0U +#define CLB_OUTPUT_LUT_0_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_0_IN1_S 5U +#define CLB_OUTPUT_LUT_0_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_0_IN2_S 10U +#define CLB_OUTPUT_LUT_0_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_0_FN_S 15U +#define CLB_OUTPUT_LUT_0_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_1 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_1_IN0_S 0U +#define CLB_OUTPUT_LUT_1_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_1_IN1_S 5U +#define CLB_OUTPUT_LUT_1_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_1_IN2_S 10U +#define CLB_OUTPUT_LUT_1_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_1_FN_S 15U +#define CLB_OUTPUT_LUT_1_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_2 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_2_IN0_S 0U +#define CLB_OUTPUT_LUT_2_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_2_IN1_S 5U +#define CLB_OUTPUT_LUT_2_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_2_IN2_S 10U +#define CLB_OUTPUT_LUT_2_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_2_FN_S 15U +#define CLB_OUTPUT_LUT_2_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_3 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_3_IN0_S 0U +#define CLB_OUTPUT_LUT_3_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_3_IN1_S 5U +#define CLB_OUTPUT_LUT_3_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_3_IN2_S 10U +#define CLB_OUTPUT_LUT_3_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_3_FN_S 15U +#define CLB_OUTPUT_LUT_3_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_4 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_4_IN0_S 0U +#define CLB_OUTPUT_LUT_4_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_4_IN1_S 5U +#define CLB_OUTPUT_LUT_4_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_4_IN2_S 10U +#define CLB_OUTPUT_LUT_4_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_4_FN_S 15U +#define CLB_OUTPUT_LUT_4_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_5 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_5_IN0_S 0U +#define CLB_OUTPUT_LUT_5_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_5_IN1_S 5U +#define CLB_OUTPUT_LUT_5_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_5_IN2_S 10U +#define CLB_OUTPUT_LUT_5_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_5_FN_S 15U +#define CLB_OUTPUT_LUT_5_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_6 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_6_IN0_S 0U +#define CLB_OUTPUT_LUT_6_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_6_IN1_S 5U +#define CLB_OUTPUT_LUT_6_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_6_IN2_S 10U +#define CLB_OUTPUT_LUT_6_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_6_FN_S 15U +#define CLB_OUTPUT_LUT_6_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_OUTPUT_LUT_7 register +// +//************************************************************************************************* +#define CLB_OUTPUT_LUT_7_IN0_S 0U +#define CLB_OUTPUT_LUT_7_IN0_M 0x1FU // Select value for IN0 of output LUT +#define CLB_OUTPUT_LUT_7_IN1_S 5U +#define CLB_OUTPUT_LUT_7_IN1_M 0x3E0U // Select value for IN1 of output LUT +#define CLB_OUTPUT_LUT_7_IN2_S 10U +#define CLB_OUTPUT_LUT_7_IN2_M 0x7C00U // Select value for IN2 of output LUT +#define CLB_OUTPUT_LUT_7_FN_S 15U +#define CLB_OUTPUT_LUT_7_FN_M 0x7F8000U // Output function for output LUT + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_HLC_EVENT_SEL register +// +//************************************************************************************************* +#define CLB_HLC_EVENT_SEL_EVENT0_SEL_S 0U +#define CLB_HLC_EVENT_SEL_EVENT0_SEL_M 0x1FU // Event Select 0 +#define CLB_HLC_EVENT_SEL_EVENT1_SEL_S 5U +#define CLB_HLC_EVENT_SEL_EVENT1_SEL_M 0x3E0U // Event Select 1 +#define CLB_HLC_EVENT_SEL_EVENT2_SEL_S 10U +#define CLB_HLC_EVENT_SEL_EVENT2_SEL_M 0x7C00U // Event Select 2 +#define CLB_HLC_EVENT_SEL_EVENT3_SEL_S 15U +#define CLB_HLC_EVENT_SEL_EVENT3_SEL_M 0xF8000U // Event Select 3 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOAD_EN register +// +//************************************************************************************************* +#define CLB_LOAD_EN_LOAD_EN 0x1U // Load Enable +#define CLB_LOAD_EN_GLOBAL_EN 0x2U // Global Enable +#define CLB_LOAD_EN_STOP 0x4U // Debug stop control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOAD_ADDR register +// +//************************************************************************************************* +#define CLB_LOAD_ADDR_ADDR_S 0U +#define CLB_LOAD_ADDR_ADDR_M 0x3FU // Indirect Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_INPUT_FILTER register +// +//************************************************************************************************* +#define CLB_INPUT_FILTER_FIN0_S 0U +#define CLB_INPUT_FILTER_FIN0_M 0x3U // Input filter control 0 +#define CLB_INPUT_FILTER_FIN1_S 2U +#define CLB_INPUT_FILTER_FIN1_M 0xCU // Input filter control 1 +#define CLB_INPUT_FILTER_FIN2_S 4U +#define CLB_INPUT_FILTER_FIN2_M 0x30U // Input filter control 2 +#define CLB_INPUT_FILTER_FIN3_S 6U +#define CLB_INPUT_FILTER_FIN3_M 0xC0U // Input filter control 3 +#define CLB_INPUT_FILTER_FIN4_S 8U +#define CLB_INPUT_FILTER_FIN4_M 0x300U // Input filter control 4 +#define CLB_INPUT_FILTER_FIN5_S 10U +#define CLB_INPUT_FILTER_FIN5_M 0xC00U // Input filter control 5 +#define CLB_INPUT_FILTER_FIN6_S 12U +#define CLB_INPUT_FILTER_FIN6_M 0x3000U // Input filter control 6 +#define CLB_INPUT_FILTER_FIN7_S 14U +#define CLB_INPUT_FILTER_FIN7_M 0xC000U // Input filter control 7 +#define CLB_INPUT_FILTER_SYNC0 0x10000U // Synchronizer control 0 +#define CLB_INPUT_FILTER_SYNC1 0x20000U // Synchronizer control 1 +#define CLB_INPUT_FILTER_SYNC2 0x40000U // Synchronizer control 2 +#define CLB_INPUT_FILTER_SYNC3 0x80000U // Synchronizer control 3 +#define CLB_INPUT_FILTER_SYNC4 0x100000U // Synchronizer control 4 +#define CLB_INPUT_FILTER_SYNC5 0x200000U // Synchronizer control 5 +#define CLB_INPUT_FILTER_SYNC6 0x400000U // Synchronizer control 6 +#define CLB_INPUT_FILTER_SYNC7 0x800000U // Synchronizer control 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_IN_MUX_SEL_0 register +// +//************************************************************************************************* +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_0 0x1U // Select GP register 0 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_1 0x2U // Select GP register 1 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_2 0x4U // Select GP register 2 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_3 0x8U // Select GP register 3 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_4 0x10U // Select GP register 4 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_5 0x20U // Select GP register 5 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_6 0x40U // Select GP register 6 +#define CLB_IN_MUX_SEL_0_SEL_GP_IN_7 0x80U // Select GP register 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_1 register +// +//************************************************************************************************* +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_S 0U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_0_M 0x1FU // Local Mux select 0 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_S 5U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_1_M 0x3E0U // Local Mux select 1 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_2_S 10U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_2_M 0x7C00U // Local Mux select 2 +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_3_S 15U +#define CLB_LCL_MUX_SEL_1_LCL_MUX_SEL_IN_3_M 0xF8000U // Local Mux select 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_2 register +// +//************************************************************************************************* +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_4_S 0U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_4_M 0x1FU // Local Mux select 4 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_5_S 5U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_5_M 0x3E0U // Local Mux select 5 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_6_S 10U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_6_M 0x7C00U // Local Mux select 6 +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_7_S 15U +#define CLB_LCL_MUX_SEL_2_LCL_MUX_SEL_IN_7_M 0xF8000U // Local Mux select 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_BUF_PTR register +// +//************************************************************************************************* +#define CLB_BUF_PTR_PULL_S 0U +#define CLB_BUF_PTR_PULL_M 0xFFU // Data pointer for pull +#define CLB_BUF_PTR_PUSH_S 16U +#define CLB_BUF_PTR_PUSH_M 0xFF0000U // Data pointer for pull + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GP_REG register +// +//************************************************************************************************* +#define CLB_GP_REG_REG_S 0U +#define CLB_GP_REG_REG_M 0xFFU // General Purpose bit register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_1 register +// +//************************************************************************************************* +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_S 0U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_0_M 0x7FU // Global Mux select 0 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_S 7U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_1_M 0x3F80U // Global Mux select 1 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_2_S 14U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_2_M 0x1FC000U // Global Mux select 2 +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_3_S 21U +#define CLB_GLBL_MUX_SEL_1_GLBL_MUX_SEL_IN_3_M 0xFE00000U // Global Mux select 3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_2 register +// +//************************************************************************************************* +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_4_S 0U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_4_M 0x7FU // Global Mux select 4 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_5_S 7U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_5_M 0x3F80U // Global Mux select 5 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_6_S 14U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_6_M 0x1FC000U // Global Mux select 6 +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_7_S 21U +#define CLB_GLBL_MUX_SEL_2_GLBL_MUX_SEL_IN_7_M 0xFE00000U // Global Mux select 7 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_INTR_TAG_REG register +// +//************************************************************************************************* +#define CLB_INTR_TAG_REG_TAG_S 0U +#define CLB_INTR_TAG_REG_TAG_M 0x3FU // Interrupt tag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_LOCK register +// +//************************************************************************************************* +#define CLB_LOCK_LOCK 0x1U // LOCK enable +#define CLB_LOCK_KEY_S 16U +#define CLB_LOCK_KEY_M 0xFFFF0000U // Key for enabling write + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLB_DBG_OUT register +// +//************************************************************************************************* +#define CLB_DBG_OUT_COUNT0_MATCH2 0x2U // COUNT_MATCH2 UNIT 0 +#define CLB_DBG_OUT_COUNT0_ZERO 0x4U // COUNT_ZERO UNIT 0 +#define CLB_DBG_OUT_COUNT0_MATCH1 0x8U // COUNT_MATCH1 UNIT 0 +#define CLB_DBG_OUT_FSM0_S0 0x10U // FSM_S0 UNIT 0 +#define CLB_DBG_OUT_FSM0_S1 0x20U // FSM_S1 UNIT 0 +#define CLB_DBG_OUT_FSM0_LUTOUT 0x40U // FSM_LUT_OUT UNIT 0 +#define CLB_DBG_OUT_LUT40_OUT 0x80U // LUT4_OUT UNIT 0 +#define CLB_DBG_OUT_COUNT1_MATCH2 0x200U // COUNT_MATCH2 UNIT 1 +#define CLB_DBG_OUT_COUNT1_ZERO 0x400U // COUNT_ZERO UNIT 1 +#define CLB_DBG_OUT_COUNT1_MATCH1 0x800U // COUNT_MATCH1 UNIT 1 +#define CLB_DBG_OUT_FSM1_S0 0x1000U // FSM_S0 UNIT 1 +#define CLB_DBG_OUT_FSM1_S1 0x2000U // FSM_S1 UNIT 1 +#define CLB_DBG_OUT_FSM1_LUTOUT 0x4000U // FSM_LUT_OUT UNIT 1 +#define CLB_DBG_OUT_LUT41_OUT 0x8000U // LUT4_OUT UNIT 1 +#define CLB_DBG_OUT_COUNT2_MATCH2 0x20000U // COUNT_MATCH2 UNIT 2 +#define CLB_DBG_OUT_COUNT2_ZERO 0x40000U // COUNT_ZERO UNIT 2 +#define CLB_DBG_OUT_COUNT2_MATCH1 0x80000U // COUNT_MATCH1 UNIT 2 +#define CLB_DBG_OUT_FSM2_S0 0x100000U // FSM_S0 UNIT 2 +#define CLB_DBG_OUT_FSM2_S1 0x200000U // FSM_S1 UNIT 2 +#define CLB_DBG_OUT_FSM2_LUTOUT 0x400000U // FSM_LUT_OUT UNIT 2 +#define CLB_DBG_OUT_LUT42_OUT 0x800000U // LUT4_OUT UNIT 2 +#define CLB_DBG_OUT_OUT0 0x1000000U // CELL Output 0 +#define CLB_DBG_OUT_OUT1 0x2000000U // CELL Output 1 +#define CLB_DBG_OUT_OUT2 0x4000000U // CELL Output 2 +#define CLB_DBG_OUT_OUT3 0x8000000U // CELL Output 3 +#define CLB_DBG_OUT_OUT4 0x10000000U // CELL Output 4 +#define CLB_DBG_OUT_OUT5 0x20000000U // CELL Output 5 +#define CLB_DBG_OUT_OUT6 0x40000000U // CELL Output 6 +#define CLB_DBG_OUT_OUT7 0x80000000U // CELL Output 7 + + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_clbxbar.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_clbxbar.h new file mode 100644 index 0000000..64072e2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_clbxbar.h @@ -0,0 +1,1272 @@ +//########################################################################### +// +// FILE: hw_clbxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CLBXBAR_H +#define HW_CLBXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_AUXSIG0MUX0TO15CFG 0x0U // CLB XBAR Mux Configuration for Output-0 +#define XBAR_O_AUXSIG0MUX16TO31CFG 0x2U // CLB XBAR Mux Configuration for Output-0 +#define XBAR_O_AUXSIG1MUX0TO15CFG 0x4U // CLB XBAR Mux Configuration for Output-1 +#define XBAR_O_AUXSIG1MUX16TO31CFG 0x6U // CLB XBAR Mux Configuration for Output-1 +#define XBAR_O_AUXSIG2MUX0TO15CFG 0x8U // CLB XBAR Mux Configuration for Output-2 +#define XBAR_O_AUXSIG2MUX16TO31CFG 0xAU // CLB XBAR Mux Configuration for Output-2 +#define XBAR_O_AUXSIG3MUX0TO15CFG 0xCU // CLB XBAR Mux Configuration for Output-3 +#define XBAR_O_AUXSIG3MUX16TO31CFG 0xEU // CLB XBAR Mux Configuration for Output-3 +#define XBAR_O_AUXSIG4MUX0TO15CFG 0x10U // CLB XBAR Mux Configuration for Output-4 +#define XBAR_O_AUXSIG4MUX16TO31CFG 0x12U // CLB XBAR Mux Configuration for Output-4 +#define XBAR_O_AUXSIG5MUX0TO15CFG 0x14U // CLB XBAR Mux Configuration for Output-5 +#define XBAR_O_AUXSIG5MUX16TO31CFG 0x16U // CLB XBAR Mux Configuration for Output-5 +#define XBAR_O_AUXSIG6MUX0TO15CFG 0x18U // CLB XBAR Mux Configuration for Output-6 +#define XBAR_O_AUXSIG6MUX16TO31CFG 0x1AU // CLB XBAR Mux Configuration for Output-6 +#define XBAR_O_AUXSIG7MUX0TO15CFG 0x1CU // CLB XBAR Mux Configuration for Output-7 +#define XBAR_O_AUXSIG7MUX16TO31CFG 0x1EU // CLB XBAR Mux Configuration for Output-7 +#define XBAR_O_AUXSIG0MUXENABLE 0x20U // CLB XBAR Mux Enable Register for Output-0 +#define XBAR_O_AUXSIG1MUXENABLE 0x22U // CLB XBAR Mux Enable Register for Output-1 +#define XBAR_O_AUXSIG2MUXENABLE 0x24U // CLB XBAR Mux Enable Register for Output-2 +#define XBAR_O_AUXSIG3MUXENABLE 0x26U // CLB XBAR Mux Enable Register for Output-3 +#define XBAR_O_AUXSIG4MUXENABLE 0x28U // CLB XBAR Mux Enable Register for Output-4 +#define XBAR_O_AUXSIG5MUXENABLE 0x2AU // CLB XBAR Mux Enable Register for Output-5 +#define XBAR_O_AUXSIG6MUXENABLE 0x2CU // CLB XBAR Mux Enable Register for Output-6 +#define XBAR_O_AUXSIG7MUXENABLE 0x2EU // CLB XBAR Mux Enable Register for Output-7 +#define XBAR_O_AUXSIGOUTINV 0x38U // CLB XBAR Output Inversion Register +#define XBAR_O_AUXSIGLOCK 0x3EU // ClbXbar Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG0MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG0 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG0 of + // CLB-XBAR +#define XBAR_AUXSIG0MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG0MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG0 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG1MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG1 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG1 of + // CLB-XBAR +#define XBAR_AUXSIG1MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG1MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG1 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG2MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG2 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG2 of + // CLB-XBAR +#define XBAR_AUXSIG2MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG2MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG2 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG3MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG3 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG3 of + // CLB-XBAR +#define XBAR_AUXSIG3MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG3MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG3 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG4MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG4 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG4 of + // CLB-XBAR +#define XBAR_AUXSIG4MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG4MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG4 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG5MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG5 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG5 of + // CLB-XBAR +#define XBAR_AUXSIG5MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG5MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG5 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG6MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG6 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG6 of + // CLB-XBAR +#define XBAR_AUXSIG6MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG6MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG6 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUX0TO15CFG_MUX0_S 0U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX0_M 0x3U // MUX0 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX1_S 2U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX1_M 0xCU // MUX1 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX2_S 4U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX2_M 0x30U // MUX2 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX3_S 6U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX3_M 0xC0U // MUX3 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX4_S 8U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX4_M 0x300U // MUX4 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX5_S 10U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX5_M 0xC00U // MUX5 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX6_S 12U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX6_M 0x3000U // MUX6 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX7_S 14U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX7_M 0xC000U // MUX7 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX8_S 16U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX8_M 0x30000U // MUX8 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX9_S 18U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX9_M 0xC0000U // MUX9 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX10_S 20U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX10_M 0x300000U // MUX10 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX11_S 22U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX11_M 0xC00000U // MUX11 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX12_S 24U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX12_M 0x3000000U // MUX12 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX13_S 26U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX13_M 0xC000000U // MUX13 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX14_S 28U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX14_M 0x30000000U // MUX14 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX0TO15CFG_MUX15_S 30U +#define XBAR_AUXSIG7MUX0TO15CFG_MUX15_M 0xC0000000U // MUX15 Configuration for AUXSIG7 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUX16TO31CFG_MUX16_S 0U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX16_M 0x3U // MUX16 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX17_S 2U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX17_M 0xCU // MUX17 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX18_S 4U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX18_M 0x30U // MUX18 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX19_S 6U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX19_M 0xC0U // MUX19 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX20_S 8U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX20_M 0x300U // MUX20 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX21_S 10U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX21_M 0xC00U // MUX21 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX22_S 12U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX22_M 0x3000U // MUX22 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX23_S 14U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX23_M 0xC000U // MUX23 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX24_S 16U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX24_M 0x30000U // MUX24 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX25_S 18U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX25_M 0xC0000U // MUX25 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX26_S 20U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX26_M 0x300000U // MUX26 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX27_S 22U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX27_M 0xC00000U // MUX27 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX28_S 24U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX28_M 0x3000000U // MUX28 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX29_S 26U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX29_M 0xC000000U // MUX29 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX30_S 28U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX30_M 0x30000000U // MUX30 Configuration for AUXSIG7 of + // CLB-XBAR +#define XBAR_AUXSIG7MUX16TO31CFG_MUX31_S 30U +#define XBAR_AUXSIG7MUX16TO31CFG_MUX31_M 0xC0000000U // MUX31 Configuration for AUXSIG7 of + // CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG0MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG0MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIG0MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG0 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG1MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG1MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIG1MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG1 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG2MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG2MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIG2MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG2 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG3MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG3MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIG3MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG3 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG4MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIG4MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG4 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG5MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIG5MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG5 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG6MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG6MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIG6MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG6 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIG7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_AUXSIG7MUXENABLE_MUX0 0x1U // mux0 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX1 0x2U // MUX1 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX2 0x4U // MUX2 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX3 0x8U // MUX3 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX4 0x10U // MUX4 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX5 0x20U // MUX5 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX6 0x40U // MUX6 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX7 0x80U // MUX7 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX8 0x100U // MUX8 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX9 0x200U // MUX9 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX10 0x400U // MUX10 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX11 0x800U // MUX11 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX12 0x1000U // MUX12 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX13 0x2000U // MUX13 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX14 0x4000U // MUX14 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX15 0x8000U // MUX15 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX16 0x10000U // MUX16 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX17 0x20000U // MUX17 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX18 0x40000U // MUX18 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX19 0x80000U // MUX19 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX20 0x100000U // MUX20 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX21 0x200000U // MUX21 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX22 0x400000U // MUX22 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX23 0x800000U // MUX23 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX24 0x1000000U // MUX24 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX25 0x2000000U // MUX25 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX26 0x4000000U // MUX26 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX27 0x8000000U // MUX27 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX28 0x10000000U // MUX28 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX29 0x20000000U // MUX29 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX30 0x40000000U // MUX30 to drive AUXSIG7 of CLB-XBAR +#define XBAR_AUXSIG7MUXENABLE_MUX31 0x80000000U // MUX31 to drive AUXSIG7 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIGOUTINV register +// +//************************************************************************************************* +#define XBAR_AUXSIGOUTINV_OUT0 0x1U // Selects polarity for AUXSIG0 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT1 0x2U // Selects polarity for AUXSIG1 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT2 0x4U // Selects polarity for AUXSIG2 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT3 0x8U // Selects polarity for AUXSIG3 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT4 0x10U // Selects polarity for AUXSIG4 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT5 0x20U // Selects polarity for AUXSIG5 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT6 0x40U // Selects polarity for AUXSIG6 of CLB-XBAR +#define XBAR_AUXSIGOUTINV_OUT7 0x80U // Selects polarity for AUXSIG7 of CLB-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXSIGLOCK register +// +//************************************************************************************************* +#define XBAR_AUXSIGLOCK_LOCK 0x1U // Locks the configuration for CLB-XBAR +#define XBAR_AUXSIGLOCK_KEY_S 16U +#define XBAR_AUXSIGLOCK_KEY_M 0xFFFF0000U // Write Protection KEY + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_cmpss.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cmpss.h new file mode 100644 index 0000000..67d32e3 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cmpss.h @@ -0,0 +1,235 @@ +//########################################################################### +// +// FILE: hw_cmpss.h +// +// TITLE: Definitions for the CMPSS registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CMPSS_H +#define HW_CMPSS_H + +//************************************************************************************************* +// +// The following are defines for the CMPSS register offsets +// +//************************************************************************************************* +#define CMPSS_O_COMPCTL 0x0U // CMPSS Comparator Control Register +#define CMPSS_O_COMPHYSCTL 0x1U // CMPSS Comparator Hysteresis Control Register +#define CMPSS_O_COMPSTS 0x2U // CMPSS Comparator Status Register +#define CMPSS_O_COMPSTSCLR 0x3U // CMPSS Comparator Status Clear Register +#define CMPSS_O_COMPDACCTL 0x4U // CMPSS DAC Control Register +#define CMPSS_O_DACHVALS 0x6U // CMPSS High DAC Value Shadow Register +#define CMPSS_O_DACHVALA 0x7U // CMPSS High DAC Value Active Register +#define CMPSS_O_RAMPMAXREFA 0x8U // CMPSS Ramp Max Reference Active Register +#define CMPSS_O_RAMPMAXREFS 0xAU // CMPSS Ramp Max Reference Shadow Register +#define CMPSS_O_RAMPDECVALA 0xCU // CMPSS Ramp Decrement Value Active Register +#define CMPSS_O_RAMPDECVALS 0xEU // CMPSS Ramp Decrement Value Shadow Register +#define CMPSS_O_RAMPSTS 0x10U // CMPSS Ramp Status Register +#define CMPSS_O_DACLVALS 0x12U // CMPSS Low DAC Value Shadow Register +#define CMPSS_O_DACLVALA 0x13U // CMPSS Low DAC Value Active Register +#define CMPSS_O_RAMPDLYA 0x14U // CMPSS Ramp Delay Active Register +#define CMPSS_O_RAMPDLYS 0x15U // CMPSS Ramp Delay Shadow Register +#define CMPSS_O_CTRIPLFILCTL 0x16U // CTRIPL Filter Control Register +#define CMPSS_O_CTRIPLFILCLKCTL 0x17U // CTRIPL Filter Clock Control Register +#define CMPSS_O_CTRIPHFILCTL 0x18U // CTRIPH Filter Control Register +#define CMPSS_O_CTRIPHFILCLKCTL 0x19U // CTRIPH Filter Clock Control Register +#define CMPSS_O_COMPLOCK 0x1AU // CMPSS Lock Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPCTL register +// +//************************************************************************************************* +#define CMPSS_COMPCTL_COMPHSOURCE 0x1U // High Comparator Source Select +#define CMPSS_COMPCTL_COMPHINV 0x2U // High Comparator Invert Select +#define CMPSS_COMPCTL_CTRIPHSEL_S 2U +#define CMPSS_COMPCTL_CTRIPHSEL_M 0xCU // High Comparator Trip Select +#define CMPSS_COMPCTL_CTRIPOUTHSEL_S 4U +#define CMPSS_COMPCTL_CTRIPOUTHSEL_M 0x30U // High Comparator Trip Output Select +#define CMPSS_COMPCTL_ASYNCHEN 0x40U // High Comparator Asynchronous Path Enable +#define CMPSS_COMPCTL_COMPLSOURCE 0x100U // Low Comparator Source Select +#define CMPSS_COMPCTL_COMPLINV 0x200U // Low Comparator Invert Select +#define CMPSS_COMPCTL_CTRIPLSEL_S 10U +#define CMPSS_COMPCTL_CTRIPLSEL_M 0xC00U // Low Comparator Trip Select +#define CMPSS_COMPCTL_CTRIPOUTLSEL_S 12U +#define CMPSS_COMPCTL_CTRIPOUTLSEL_M 0x3000U // Low Comparator Trip Output Select +#define CMPSS_COMPCTL_ASYNCLEN 0x4000U // Low Comparator Asynchronous Path Enable +#define CMPSS_COMPCTL_COMPDACE 0x8000U // Comparator/DAC Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPHYSCTL register +// +//************************************************************************************************* +#define CMPSS_COMPHYSCTL_COMPHYS_S 0U +#define CMPSS_COMPHYSCTL_COMPHYS_M 0x7U // Comparator Hysteresis Trim + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPSTS register +// +//************************************************************************************************* +#define CMPSS_COMPSTS_COMPHSTS 0x1U // High Comparator Status +#define CMPSS_COMPSTS_COMPHLATCH 0x2U // High Comparator Latched Status +#define CMPSS_COMPSTS_COMPLSTS 0x100U // Low Comparator Status +#define CMPSS_COMPSTS_COMPLLATCH 0x200U // Low Comparator Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPSTSCLR register +// +//************************************************************************************************* +#define CMPSS_COMPSTSCLR_HLATCHCLR 0x2U // High Comparator Latched Status Clear +#define CMPSS_COMPSTSCLR_HSYNCCLREN 0x4U // High Comparator EPWMSYNCPER Clear Enable +#define CMPSS_COMPSTSCLR_LLATCHCLR 0x200U // Low Comparator Latched Status Clear +#define CMPSS_COMPSTSCLR_LSYNCCLREN 0x400U // Low Comparator EPWMSYNCPER Clear Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPDACCTL register +// +//************************************************************************************************* +#define CMPSS_COMPDACCTL_DACSOURCE 0x1U // DAC Source Control +#define CMPSS_COMPDACCTL_RAMPSOURCE_S 1U +#define CMPSS_COMPDACCTL_RAMPSOURCE_M 0x1EU // Ramp Generator Source Control +#define CMPSS_COMPDACCTL_SELREF 0x20U // DAC Reference Select +#define CMPSS_COMPDACCTL_RAMPLOADSEL 0x40U // Ramp Load Select +#define CMPSS_COMPDACCTL_SWLOADSEL 0x80U // Software Load Select +#define CMPSS_COMPDACCTL_FREESOFT_S 14U +#define CMPSS_COMPDACCTL_FREESOFT_M 0xC000U // Free/Soft Emulation Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACHVALS register +// +//************************************************************************************************* +#define CMPSS_DACHVALS_DACVAL_S 0U +#define CMPSS_DACHVALS_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACHVALA register +// +//************************************************************************************************* +#define CMPSS_DACHVALA_DACVAL_S 0U +#define CMPSS_DACHVALA_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLVALS register +// +//************************************************************************************************* +#define CMPSS_DACLVALS_DACVAL_S 0U +#define CMPSS_DACLVALS_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLVALA register +// +//************************************************************************************************* +#define CMPSS_DACLVALA_DACVAL_S 0U +#define CMPSS_DACLVALA_DACVAL_M 0xFFFU // DAC Value Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMPDLYA register +// +//************************************************************************************************* +#define CMPSS_RAMPDLYA_DELAY_S 0U +#define CMPSS_RAMPDLYA_DELAY_M 0x1FFFU // Ramp Delay Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMPDLYS register +// +//************************************************************************************************* +#define CMPSS_RAMPDLYS_DELAY_S 0U +#define CMPSS_RAMPDLYS_DELAY_M 0x1FFFU // Ramp Delay Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPLFILCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPLFILCTL_SAMPWIN_S 4U +#define CMPSS_CTRIPLFILCTL_SAMPWIN_M 0x1F0U // Sample Window +#define CMPSS_CTRIPLFILCTL_THRESH_S 9U +#define CMPSS_CTRIPLFILCTL_THRESH_M 0x3E00U // Majority Voting Threshold +#define CMPSS_CTRIPLFILCTL_FILINIT 0x8000U // Filter Initialization Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPLFILCLKCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPLFILCLKCTL_CLKPRESCALE_S 0U +#define CMPSS_CTRIPLFILCLKCTL_CLKPRESCALE_M 0x3FFU // Sample Clock Prescale + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPHFILCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPHFILCTL_SAMPWIN_S 4U +#define CMPSS_CTRIPHFILCTL_SAMPWIN_M 0x1F0U // Sample Window +#define CMPSS_CTRIPHFILCTL_THRESH_S 9U +#define CMPSS_CTRIPHFILCTL_THRESH_M 0x3E00U // Majority Voting Threshold +#define CMPSS_CTRIPHFILCTL_FILINIT 0x8000U // Filter Initialization Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CTRIPHFILCLKCTL register +// +//************************************************************************************************* +#define CMPSS_CTRIPHFILCLKCTL_CLKPRESCALE_S 0U +#define CMPSS_CTRIPHFILCLKCTL_CLKPRESCALE_M 0x3FFU // Sample Clock Prescale + +//************************************************************************************************* +// +// The following are defines for the bit fields in the COMPLOCK register +// +//************************************************************************************************* +#define CMPSS_COMPLOCK_COMPCTL 0x1U // COMPCTL Lock +#define CMPSS_COMPLOCK_COMPHYSCTL 0x2U // COMPHYSCTL Lock +#define CMPSS_COMPLOCK_DACCTL 0x4U // DACCTL Lock +#define CMPSS_COMPLOCK_CTRIP 0x8U // CTRIP Lock + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_cputimer.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cputimer.h new file mode 100644 index 0000000..f7613fb --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_cputimer.h @@ -0,0 +1,112 @@ +//########################################################################### +// +// FILE: hw_cputimer.h +// +// TITLE: Definitions for the CPUTIMER registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_CPUTIMER_H +#define HW_CPUTIMER_H + +//************************************************************************************************* +// +// The following are defines for the CPUTIMER register offsets +// +//************************************************************************************************* +#define CPUTIMER_O_TIM 0x0U // CPU-Timer, Counter Register +#define CPUTIMER_O_PRD 0x2U // CPU-Timer, Period Register +#define CPUTIMER_O_TCR 0x4U // CPU-Timer, Control Register +#define CPUTIMER_O_TPR 0x6U // CPU-Timer, Prescale Register +#define CPUTIMER_O_TPRH 0x7U // CPU-Timer, Prescale Register High + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TIM register +// +//************************************************************************************************* +#define CPUTIMER_TIM_LSW_S 0U +#define CPUTIMER_TIM_LSW_M 0xFFFFU // CPU-Timer Counter Registers +#define CPUTIMER_TIM_MSW_S 16U +#define CPUTIMER_TIM_MSW_M 0xFFFF0000U // CPU-Timer Counter Registers High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRD register +// +//************************************************************************************************* +#define CPUTIMER_PRD_LSW_S 0U +#define CPUTIMER_PRD_LSW_M 0xFFFFU // CPU-Timer Period Registers +#define CPUTIMER_PRD_MSW_S 16U +#define CPUTIMER_PRD_MSW_M 0xFFFF0000U // CPU-Timer Period Registers High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TCR register +// +//************************************************************************************************* +#define CPUTIMER_TCR_TSS 0x10U // CPU-Timer stop status bit. +#define CPUTIMER_TCR_TRB 0x20U // Timer reload +#define CPUTIMER_TCR_SOFT 0x400U // Emulation modes +#define CPUTIMER_TCR_FREE 0x800U // Emulation modes +#define CPUTIMER_TCR_TIE 0x4000U // CPU-Timer Interrupt Enable. +#define CPUTIMER_TCR_TIF 0x8000U // CPU-Timer Interrupt Flag. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TPR register +// +//************************************************************************************************* +#define CPUTIMER_TPR_TDDR_S 0U +#define CPUTIMER_TPR_TDDR_M 0xFFU // CPU-Timer Divide-Down. +#define CPUTIMER_TPR_PSC_S 8U +#define CPUTIMER_TPR_PSC_M 0xFF00U // CPU-Timer Prescale Counter. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TPRH register +// +//************************************************************************************************* +#define CPUTIMER_TPRH_TDDRH_S 0U +#define CPUTIMER_TPRH_TDDRH_M 0xFFU // CPU-Timer Divide-Down. +#define CPUTIMER_TPRH_PSCH_S 8U +#define CPUTIMER_TPRH_PSCH_M 0xFF00U // CPU-Timer Prescale Counter. + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_dac.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dac.h new file mode 100644 index 0000000..3e3d3a2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dac.h @@ -0,0 +1,122 @@ +//########################################################################### +// +// FILE: hw_dac.h +// +// TITLE: Definitions for the DAC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DAC_H +#define HW_DAC_H + +//************************************************************************************************* +// +// The following are defines for the DAC register offsets +// +//************************************************************************************************* +#define DAC_O_REV 0x0U // DAC Revision Register +#define DAC_O_CTL 0x1U // DAC Control Register +#define DAC_O_VALA 0x2U // DAC Value Register - Active +#define DAC_O_VALS 0x3U // DAC Value Register - Shadow +#define DAC_O_OUTEN 0x4U // DAC Output Enable Register +#define DAC_O_LOCK 0x5U // DAC Lock Register +#define DAC_O_TRIM 0x6U // DAC Trim Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACREV register +// +//************************************************************************************************* +#define DAC_REV_REV_S 0U +#define DAC_REV_REV_M 0xFFU // DAC Revision Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACCTL register +// +//************************************************************************************************* +#define DAC_CTL_DACREFSEL 0x1U // DAC Reference Select +#define DAC_CTL_LOADMODE 0x4U // DACVALA Load Mode +#define DAC_CTL_SYNCSEL_S 4U +#define DAC_CTL_SYNCSEL_M 0xF0U // DAC EPWMSYNCPER Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACVALA register +// +//************************************************************************************************* +#define DAC_VALA_DACVALA_S 0U +#define DAC_VALA_DACVALA_M 0xFFFU // DAC Active Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACVALS register +// +//************************************************************************************************* +#define DAC_VALS_DACVALS_S 0U +#define DAC_VALS_DACVALS_M 0xFFFU // DAC Shadow Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACOUTEN register +// +//************************************************************************************************* +#define DAC_OUTEN_DACOUTEN 0x1U // DAC Output Code + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACLOCK register +// +//************************************************************************************************* +#define DAC_LOCK_DACCTL 0x1U // DAC Control Register Lock +#define DAC_LOCK_DACVAL 0x2U // DAC Value Register Lock +#define DAC_LOCK_DACOUTEN 0x4U // DAC Output Enable Register Lock +#define DAC_LOCK_KEY_S 12U +#define DAC_LOCK_KEY_M 0xF000U // DAC Register Lock Key + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DACTRIM register +// +//************************************************************************************************* +#define DAC_TRIM_OFFSET_TRIM_S 0U +#define DAC_TRIM_OFFSET_TRIM_M 0xFFU // DAC Offset Trim + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_dcsm.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dcsm.h new file mode 100644 index 0000000..c81bcb1 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dcsm.h @@ -0,0 +1,442 @@ +//########################################################################### +// +// FILE: hw_dcsm.h +// +// TITLE: Definitions for the DCSM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DCSM_H +#define HW_DCSM_H + +//************************************************************************************************* +// +// The following are defines for the DCSM register offsets +// +//************************************************************************************************* +#define DCSM_O_Z1OTP_LINKPOINTER1 0x0U // Zone 1 Link Pointer1 in Z1 OTP +#define DCSM_O_Z1OTP_LINKPOINTER2 0x4U // Zone 1 Link Pointer2 in Z1 OTP +#define DCSM_O_Z1OTP_LINKPOINTER3 0x8U // Zone 1 Link Pointer3 in Z1 OTP +#define DCSM_O_Z1OTP_PSWDLOCK 0x10U // Secure Password Lock in Z1 OTP +#define DCSM_O_Z1OTP_CRCLOCK 0x14U // Secure CRC Lock in Z1 OTP +#define DCSM_O_Z1OTP_BOOTCTRL 0x1EU // Boot Mode in Z1 OTP + +#define DCSM_O_Z2OTP_LINKPOINTER1 0x0U // Zone 2 Link Pointer1 in Z2 OTP +#define DCSM_O_Z2OTP_LINKPOINTER2 0x4U // Zone 2 Link Pointer2 in Z2 OTP +#define DCSM_O_Z2OTP_LINKPOINTER3 0x8U // Zone 2 Link Pointer3 in Z2 OTP +#define DCSM_O_Z2OTP_PSWDLOCK 0x10U // Secure Password Lock in Z2 OTP +#define DCSM_O_Z2OTP_CRCLOCK 0x14U // Secure CRC Lock in Z2 OTP +#define DCSM_O_Z2OTP_BOOTCTRL 0x1EU // Boot Mode in Z2 OTP + +#define DCSM_O_Z1_LINKPOINTER 0x0U // Zone 1 Link Pointer +#define DCSM_O_Z1_OTPSECLOCK 0x2U // Zone 1 OTP Secure JTAG lock +#define DCSM_O_Z1_BOOTCTRL 0x4U // Boot Mode +#define DCSM_O_Z1_LINKPOINTERERR 0x6U // Link Pointer Error +#define DCSM_O_Z1_CSMKEY0 0x10U // Zone 1 CSM Key 0 +#define DCSM_O_Z1_CSMKEY1 0x12U // Zone 1 CSM Key 1 +#define DCSM_O_Z1_CSMKEY2 0x14U // Zone 1 CSM Key 2 +#define DCSM_O_Z1_CSMKEY3 0x16U // Zone 1 CSM Key 3 +#define DCSM_O_Z1_CR 0x19U // Zone 1 CSM Control Register +#define DCSM_O_Z1_GRABSECTR 0x1AU // Zone 1 Grab Flash Sectors Register +#define DCSM_O_Z1_GRABRAMR 0x1CU // Zone 1 Grab RAM Blocks Register +#define DCSM_O_Z1_EXEONLYSECTR 0x1EU // Zone 1 Flash Execute_Only Sector Register +#define DCSM_O_Z1_EXEONLYRAMR 0x20U // Zone 1 RAM Execute_Only Block Register + +#define DCSM_O_Z2_LINKPOINTER 0x0U // Zone 2 Link Pointer +#define DCSM_O_Z2_OTPSECLOCK 0x2U // Zone 2 OTP Secure JTAG lock +#define DCSM_O_Z2_BOOTCTRL 0x4U // Boot Mode +#define DCSM_O_Z2_LINKPOINTERERR 0x6U // Link Pointer Error +#define DCSM_O_Z2_CSMKEY0 0x10U // Zone 2 CSM Key 0 +#define DCSM_O_Z2_CSMKEY1 0x12U // Zone 2 CSM Key 1 +#define DCSM_O_Z2_CSMKEY2 0x14U // Zone 2 CSM Key 2 +#define DCSM_O_Z2_CSMKEY3 0x16U // Zone 2 CSM Key 3 +#define DCSM_O_Z2_CR 0x19U // Zone 2 CSM Control Register +#define DCSM_O_Z2_GRABSECTR 0x1AU // Zone 2 Grab Flash Sectors Register +#define DCSM_O_Z2_GRABRAMR 0x1CU // Zone 2 Grab RAM Blocks Register +#define DCSM_O_Z2_EXEONLYSECTR 0x1EU // Zone 2 Flash Execute_Only Sector Register +#define DCSM_O_Z2_EXEONLYRAMR 0x20U // Zone 2 RAM Execute_Only Block Register + +#define DCSM_O_FLSEM 0x0U // Flash Wrapper Semaphore Register +#define DCSM_O_SECTSTAT 0x2U // Sectors Status Register +#define DCSM_O_RAMSTAT 0x4U // RAM Status Register + + + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_LINKPOINTER register +// +//************************************************************************************************* +#define DCSM_Z1_LINKPOINTER_LINKPOINTER_S 0U +#define DCSM_Z1_LINKPOINTER_LINKPOINTER_M 0x1FFFFFFFU // Zone1 LINK Pointer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_OTPSECLOCK register +// +//************************************************************************************************* +#define DCSM_Z1_OTPSECLOCK_PSWDLOCK_S 4U +#define DCSM_Z1_OTPSECLOCK_PSWDLOCK_M 0xF0U // Zone1 Password Lock. +#define DCSM_Z1_OTPSECLOCK_CRCLOCK_S 8U +#define DCSM_Z1_OTPSECLOCK_CRCLOCK_M 0xF00U // Zone1 CRC Lock. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_BOOTCTRL register +// +//************************************************************************************************* +#define DCSM_Z1_BOOTCTRL_KEY_S 0U +#define DCSM_Z1_BOOTCTRL_KEY_M 0xFFU // OTP Boot Key +#define DCSM_Z1_BOOTCTRL_BMODE_S 8U +#define DCSM_Z1_BOOTCTRL_BMODE_M 0xFF00U // OTP Boot Mode +#define DCSM_Z1_BOOTCTRL_BOOTPIN0_S 16U +#define DCSM_Z1_BOOTCTRL_BOOTPIN0_M 0xFF0000U // OTP Boot Pin 0 Mapping +#define DCSM_Z1_BOOTCTRL_BOOTPIN1_S 24U +#define DCSM_Z1_BOOTCTRL_BOOTPIN1_M 0xFF000000U // OTP Boot Pin 1 Mapping + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_CR register +// +//************************************************************************************************* +#define DCSM_Z1_CR_ALLZERO 0x8U // CSMPSWD All Zeros +#define DCSM_Z1_CR_ALLONE 0x10U // CSMPSWD All Ones +#define DCSM_Z1_CR_UNSECURE 0x20U // CSMPSWD Match CSMKEY +#define DCSM_Z1_CR_ARMED 0x40U // CSM Armed +#define DCSM_Z1_CR_FORCESEC 0x8000U // Force Secure + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_GRABSECTR register +// +//************************************************************************************************* +#define DCSM_Z1_GRABSECTR_GRAB_SECTA_S 0U +#define DCSM_Z1_GRABSECTR_GRAB_SECTA_M 0x3U // Grab Flash Sector A +#define DCSM_Z1_GRABSECTR_GRAB_SECTB_S 2U +#define DCSM_Z1_GRABSECTR_GRAB_SECTB_M 0xCU // Grab Flash Sector B +#define DCSM_Z1_GRABSECTR_GRAB_SECTC_S 4U +#define DCSM_Z1_GRABSECTR_GRAB_SECTC_M 0x30U // Grab Flash Sector C +#define DCSM_Z1_GRABSECTR_GRAB_SECTD_S 6U +#define DCSM_Z1_GRABSECTR_GRAB_SECTD_M 0xC0U // Grab Flash Sector D +#define DCSM_Z1_GRABSECTR_GRAB_SECTE_S 8U +#define DCSM_Z1_GRABSECTR_GRAB_SECTE_M 0x300U // Grab Flash Sector E +#define DCSM_Z1_GRABSECTR_GRAB_SECTF_S 10U +#define DCSM_Z1_GRABSECTR_GRAB_SECTF_M 0xC00U // Grab Flash Sector F +#define DCSM_Z1_GRABSECTR_GRAB_SECTG_S 12U +#define DCSM_Z1_GRABSECTR_GRAB_SECTG_M 0x3000U // Grab Flash Sector G +#define DCSM_Z1_GRABSECTR_GRAB_SECTH_S 14U +#define DCSM_Z1_GRABSECTR_GRAB_SECTH_M 0xC000U // Grab Flash Sector H +#define DCSM_Z1_GRABSECTR_GRAB_SECTI_S 16U +#define DCSM_Z1_GRABSECTR_GRAB_SECTI_M 0x30000U // Grab Flash Sector I +#define DCSM_Z1_GRABSECTR_GRAB_SECTJ_S 18U +#define DCSM_Z1_GRABSECTR_GRAB_SECTJ_M 0xC0000U // Grab Flash Sector J +#define DCSM_Z1_GRABSECTR_GRAB_SECTK_S 20U +#define DCSM_Z1_GRABSECTR_GRAB_SECTK_M 0x300000U // Grab Flash Sector K +#define DCSM_Z1_GRABSECTR_GRAB_SECTL_S 22U +#define DCSM_Z1_GRABSECTR_GRAB_SECTL_M 0xC00000U // Grab Flash Sector L +#define DCSM_Z1_GRABSECTR_GRAB_SECTM_S 24U +#define DCSM_Z1_GRABSECTR_GRAB_SECTM_M 0x3000000U // Grab Flash Sector M +#define DCSM_Z1_GRABSECTR_GRAB_SECTN_S 26U +#define DCSM_Z1_GRABSECTR_GRAB_SECTN_M 0xC000000U // Grab Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_GRABRAMR register +// +//************************************************************************************************* +#define DCSM_Z1_GRABRAMR_GRAB_RAM0_S 0U +#define DCSM_Z1_GRABRAMR_GRAB_RAM0_M 0x3U // Grab RAM LS0 +#define DCSM_Z1_GRABRAMR_GRAB_RAM1_S 2U +#define DCSM_Z1_GRABRAMR_GRAB_RAM1_M 0xCU // Grab RAM LS1 +#define DCSM_Z1_GRABRAMR_GRAB_RAM2_S 4U +#define DCSM_Z1_GRABRAMR_GRAB_RAM2_M 0x30U // Grab RAM LS2 +#define DCSM_Z1_GRABRAMR_GRAB_RAM3_S 6U +#define DCSM_Z1_GRABRAMR_GRAB_RAM3_M 0xC0U // Grab RAM LS3 +#define DCSM_Z1_GRABRAMR_GRAB_RAM4_S 8U +#define DCSM_Z1_GRABRAMR_GRAB_RAM4_M 0x300U // Grab RAM LS4 +#define DCSM_Z1_GRABRAMR_GRAB_RAM5_S 10U +#define DCSM_Z1_GRABRAMR_GRAB_RAM5_M 0xC00U // Grab RAM LS5 +#define DCSM_Z1_GRABRAMR_GRAB_RAM6_S 12U +#define DCSM_Z1_GRABRAMR_GRAB_RAM6_M 0x3000U // Grab RAM D0 +#define DCSM_Z1_GRABRAMR_GRAB_RAM7_S 14U +#define DCSM_Z1_GRABRAMR_GRAB_RAM7_M 0xC000U // Grab RAM D1 +#define DCSM_Z1_GRABRAMR_GRAB_CLA1_S 28U +#define DCSM_Z1_GRABRAMR_GRAB_CLA1_M 0x30000000U // Grab CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_EXEONLYSECTR register +// +//************************************************************************************************* +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTA 0x1U // Execute-Only Flash Sector A +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTB 0x2U // Execute-Only Flash Sector B +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTC 0x4U // Execute-Only Flash Sector C +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTD 0x8U // Execute-Only Flash Sector D +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTE 0x10U // Execute-Only Flash Sector E +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTF 0x20U // Execute-Only Flash Sector F +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTG 0x40U // Execute-Only Flash Sector G +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTH 0x80U // Execute-Only Flash Sector H +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTI 0x100U // Execute-Only Flash Sector I +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTJ 0x200U // Execute-Only Flash Sector J +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTK 0x400U // Execute-Only Flash Sector K +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTL 0x800U // Execute-Only Flash Sector L +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTM 0x1000U // Execute-Only Flash Sector M +#define DCSM_Z1_EXEONLYSECTR_EXEONLY_SECTN 0x2000U // Execute-Only Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z1_EXEONLYRAMR register +// +//************************************************************************************************* +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM0 0x1U // Execute-Only RAM LS0 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM1 0x2U // Execute-Only RAM LS1 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM2 0x4U // Execute-Only RAM LS2 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM3 0x8U // Execute-Only RAM LS3 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM4 0x10U // Execute-Only RAM LS4 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM5 0x20U // Execute-Only RAM LS5 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM6 0x40U // Execute-Only RAM D0 +#define DCSM_Z1_EXEONLYRAMR_EXEONLY_RAM7 0x80U // Execute-Only RAM D1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_LINKPOINTER register +// +//************************************************************************************************* +#define DCSM_Z2_LINKPOINTER_LINKPOINTER_S 0U +#define DCSM_Z2_LINKPOINTER_LINKPOINTER_M 0x1FFFFFFFU // Zone2 LINK Pointer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_OTPSECLOCK register +// +//************************************************************************************************* +#define DCSM_Z2_OTPSECLOCK_PSWDLOCK_S 4U +#define DCSM_Z2_OTPSECLOCK_PSWDLOCK_M 0xF0U // Zone2 Password Lock. +#define DCSM_Z2_OTPSECLOCK_CRCLOCK_S 8U +#define DCSM_Z2_OTPSECLOCK_CRCLOCK_M 0xF00U // Zone2 CRC Lock. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_BOOTCTRL register +// +//************************************************************************************************* +#define DCSM_Z2_BOOTCTRL_KEY_S 0U +#define DCSM_Z2_BOOTCTRL_KEY_M 0xFFU // OTP Boot Key +#define DCSM_Z2_BOOTCTRL_BMODE_S 8U +#define DCSM_Z2_BOOTCTRL_BMODE_M 0xFF00U // OTP Boot Mode +#define DCSM_Z2_BOOTCTRL_BOOTPIN0_S 16U +#define DCSM_Z2_BOOTCTRL_BOOTPIN0_M 0xFF0000U // OTP Boot Pin 0 Mapping +#define DCSM_Z2_BOOTCTRL_BOOTPIN1_S 24U +#define DCSM_Z2_BOOTCTRL_BOOTPIN1_M 0xFF000000U // OTP Boot Pin 1 Mapping + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_CR register +// +//************************************************************************************************* +#define DCSM_Z2_CR_ALLZERO 0x8U // CSMPSWD All Zeros +#define DCSM_Z2_CR_ALLONE 0x10U // CSMPSWD All Ones +#define DCSM_Z2_CR_UNSECURE 0x20U // CSMPSWD Match CSMKEY +#define DCSM_Z2_CR_ARMED 0x40U // CSM Armed +#define DCSM_Z2_CR_FORCESEC 0x8000U // Force Secure + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_GRABSECTR register +// +//************************************************************************************************* +#define DCSM_Z2_GRABSECTR_GRAB_SECTA_S 0U +#define DCSM_Z2_GRABSECTR_GRAB_SECTA_M 0x3U // Grab Flash Sector A +#define DCSM_Z2_GRABSECTR_GRAB_SECTB_S 2U +#define DCSM_Z2_GRABSECTR_GRAB_SECTB_M 0xCU // Grab Flash Sector B +#define DCSM_Z2_GRABSECTR_GRAB_SECTC_S 4U +#define DCSM_Z2_GRABSECTR_GRAB_SECTC_M 0x30U // Grab Flash Sector C +#define DCSM_Z2_GRABSECTR_GRAB_SECTD_S 6U +#define DCSM_Z2_GRABSECTR_GRAB_SECTD_M 0xC0U // Grab Flash Sector D +#define DCSM_Z2_GRABSECTR_GRAB_SECTE_S 8U +#define DCSM_Z2_GRABSECTR_GRAB_SECTE_M 0x300U // Grab Flash Sector E +#define DCSM_Z2_GRABSECTR_GRAB_SECTF_S 10U +#define DCSM_Z2_GRABSECTR_GRAB_SECTF_M 0xC00U // Grab Flash Sector F +#define DCSM_Z2_GRABSECTR_GRAB_SECTG_S 12U +#define DCSM_Z2_GRABSECTR_GRAB_SECTG_M 0x3000U // Grab Flash Sector G +#define DCSM_Z2_GRABSECTR_GRAB_SECTH_S 14U +#define DCSM_Z2_GRABSECTR_GRAB_SECTH_M 0xC000U // Grab Flash Sector H +#define DCSM_Z2_GRABSECTR_GRAB_SECTI_S 16U +#define DCSM_Z2_GRABSECTR_GRAB_SECTI_M 0x30000U // Grab Flash Sector I +#define DCSM_Z2_GRABSECTR_GRAB_SECTJ_S 18U +#define DCSM_Z2_GRABSECTR_GRAB_SECTJ_M 0xC0000U // Grab Flash Sector J +#define DCSM_Z2_GRABSECTR_GRAB_SECTK_S 20U +#define DCSM_Z2_GRABSECTR_GRAB_SECTK_M 0x300000U // Grab Flash Sector K +#define DCSM_Z2_GRABSECTR_GRAB_SECTL_S 22U +#define DCSM_Z2_GRABSECTR_GRAB_SECTL_M 0xC00000U // Grab Flash Sector L +#define DCSM_Z2_GRABSECTR_GRAB_SECTM_S 24U +#define DCSM_Z2_GRABSECTR_GRAB_SECTM_M 0x3000000U // Grab Flash Sector M +#define DCSM_Z2_GRABSECTR_GRAB_SECTN_S 26U +#define DCSM_Z2_GRABSECTR_GRAB_SECTN_M 0xC000000U // Grab Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_GRABRAMR register +// +//************************************************************************************************* +#define DCSM_Z2_GRABRAMR_GRAB_RAM0_S 0U +#define DCSM_Z2_GRABRAMR_GRAB_RAM0_M 0x3U // Grab RAM LS0 +#define DCSM_Z2_GRABRAMR_GRAB_RAM1_S 2U +#define DCSM_Z2_GRABRAMR_GRAB_RAM1_M 0xCU // Grab RAM LS1 +#define DCSM_Z2_GRABRAMR_GRAB_RAM2_S 4U +#define DCSM_Z2_GRABRAMR_GRAB_RAM2_M 0x30U // Grab RAM LS2 +#define DCSM_Z2_GRABRAMR_GRAB_RAM3_S 6U +#define DCSM_Z2_GRABRAMR_GRAB_RAM3_M 0xC0U // Grab RAM LS3 +#define DCSM_Z2_GRABRAMR_GRAB_RAM4_S 8U +#define DCSM_Z2_GRABRAMR_GRAB_RAM4_M 0x300U // Grab RAM LS4 +#define DCSM_Z2_GRABRAMR_GRAB_RAM5_S 10U +#define DCSM_Z2_GRABRAMR_GRAB_RAM5_M 0xC00U // Grab RAM LS5 +#define DCSM_Z2_GRABRAMR_GRAB_RAM6_S 12U +#define DCSM_Z2_GRABRAMR_GRAB_RAM6_M 0x3000U // Grab RAM D0 +#define DCSM_Z2_GRABRAMR_GRAB_RAM7_S 14U +#define DCSM_Z2_GRABRAMR_GRAB_RAM7_M 0xC000U // Grab RAM D1 +#define DCSM_Z2_GRABRAMR_GRAB_CLA1_S 28U +#define DCSM_Z2_GRABRAMR_GRAB_CLA1_M 0x30000000U // Grab CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_EXEONLYSECTR register +// +//************************************************************************************************* +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTA 0x1U // Execute-Only Flash Sector A +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTB 0x2U // Execute-Only Flash Sector B +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTC 0x4U // Execute-Only Flash Sector C +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTD 0x8U // Execute-Only Flash Sector D +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTE 0x10U // Execute-Only Flash Sector E +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTF 0x20U // Execute-Only Flash Sector F +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTG 0x40U // Execute-Only Flash Sector G +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTH 0x80U // Execute-Only Flash Sector H +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTI 0x100U // Execute-Only Flash Sector I +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTJ 0x200U // Execute-Only Flash Sector J +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTK 0x400U // Execute-Only Flash Sector K +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTL 0x800U // Execute-Only Flash Sector L +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTM 0x1000U // Execute-Only Flash Sector M +#define DCSM_Z2_EXEONLYSECTR_EXEONLY_SECTN 0x2000U // Execute-Only Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the Z2_EXEONLYRAMR register +// +//************************************************************************************************* +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM0 0x1U // Execute-Only RAM LS0 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM1 0x2U // Execute-Only RAM LS1 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM2 0x4U // Execute-Only RAM LS2 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM3 0x8U // Execute-Only RAM LS3 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM4 0x10U // Execute-Only RAM LS4 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM5 0x20U // Execute-Only RAM LS5 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM6 0x40U // Execute-Only RAM D0 +#define DCSM_Z2_EXEONLYRAMR_EXEONLY_RAM7 0x80U // Execute-Only RAM D1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FLSEM register +// +//************************************************************************************************* +#define DCSM_FLSEM_SEM_S 0U +#define DCSM_FLSEM_SEM_M 0x3U // Flash Semaphore Bit +#define DCSM_FLSEM_KEY_S 8U +#define DCSM_FLSEM_KEY_M 0xFF00U // Semaphore Key + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SECTSTAT register +// +//************************************************************************************************* +#define DCSM_SECTSTAT_STATUS_SECTA_S 0U +#define DCSM_SECTSTAT_STATUS_SECTA_M 0x3U // Zone Status Flash Sector A +#define DCSM_SECTSTAT_STATUS_SECTB_S 2U +#define DCSM_SECTSTAT_STATUS_SECTB_M 0xCU // Zone Status Flash Sector B +#define DCSM_SECTSTAT_STATUS_SECTC_S 4U +#define DCSM_SECTSTAT_STATUS_SECTC_M 0x30U // Zone Status Flash Sector C +#define DCSM_SECTSTAT_STATUS_SECTD_S 6U +#define DCSM_SECTSTAT_STATUS_SECTD_M 0xC0U // Zone Status Flash Sector D +#define DCSM_SECTSTAT_STATUS_SECTE_S 8U +#define DCSM_SECTSTAT_STATUS_SECTE_M 0x300U // Zone Status Flash Sector E +#define DCSM_SECTSTAT_STATUS_SECTF_S 10U +#define DCSM_SECTSTAT_STATUS_SECTF_M 0xC00U // Zone Status Flash Sector F +#define DCSM_SECTSTAT_STATUS_SECTG_S 12U +#define DCSM_SECTSTAT_STATUS_SECTG_M 0x3000U // Zone Status Flash Sector G +#define DCSM_SECTSTAT_STATUS_SECTH_S 14U +#define DCSM_SECTSTAT_STATUS_SECTH_M 0xC000U // Zone Status Flash Sector H +#define DCSM_SECTSTAT_STATUS_SECTI_S 16U +#define DCSM_SECTSTAT_STATUS_SECTI_M 0x30000U // Zone Status Flash Sector I +#define DCSM_SECTSTAT_STATUS_SECTJ_S 18U +#define DCSM_SECTSTAT_STATUS_SECTJ_M 0xC0000U // Zone Status Flash Sector J +#define DCSM_SECTSTAT_STATUS_SECTK_S 20U +#define DCSM_SECTSTAT_STATUS_SECTK_M 0x300000U // Zone Status Flash Sector K +#define DCSM_SECTSTAT_STATUS_SECTL_S 22U +#define DCSM_SECTSTAT_STATUS_SECTL_M 0xC00000U // Zone Status Flash Sector L +#define DCSM_SECTSTAT_STATUS_SECTM_S 24U +#define DCSM_SECTSTAT_STATUS_SECTM_M 0x3000000U // Zone Status Flash Sector M +#define DCSM_SECTSTAT_STATUS_SECTN_S 26U +#define DCSM_SECTSTAT_STATUS_SECTN_M 0xC000000U // Zone Status Flash Sector N + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAMSTAT register +// +//************************************************************************************************* +#define DCSM_RAMSTAT_STATUS_RAM0_S 0U +#define DCSM_RAMSTAT_STATUS_RAM0_M 0x3U // Zone Status RAM LS0 +#define DCSM_RAMSTAT_STATUS_RAM1_S 2U +#define DCSM_RAMSTAT_STATUS_RAM1_M 0xCU // Zone Status RAM LS1 +#define DCSM_RAMSTAT_STATUS_RAM2_S 4U +#define DCSM_RAMSTAT_STATUS_RAM2_M 0x30U // Zone Status RAM LS2 +#define DCSM_RAMSTAT_STATUS_RAM3_S 6U +#define DCSM_RAMSTAT_STATUS_RAM3_M 0xC0U // Zone Status RAM LS3 +#define DCSM_RAMSTAT_STATUS_RAM4_S 8U +#define DCSM_RAMSTAT_STATUS_RAM4_M 0x300U // Zone Status RAM LS4 +#define DCSM_RAMSTAT_STATUS_RAM5_S 10U +#define DCSM_RAMSTAT_STATUS_RAM5_M 0xC00U // Zone Status RAM LS5 +#define DCSM_RAMSTAT_STATUS_RAM6_S 12U +#define DCSM_RAMSTAT_STATUS_RAM6_M 0x3000U // Zone Status RAM D0 +#define DCSM_RAMSTAT_STATUS_RAM7_S 14U +#define DCSM_RAMSTAT_STATUS_RAM7_M 0xC000U // Zone Status RAM D1 +#define DCSM_RAMSTAT_STATUS_CLA1_S 28U +#define DCSM_RAMSTAT_STATUS_CLA1_M 0x30000000U // Zone Status CLA1 + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_dma.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dma.h new file mode 100644 index 0000000..1ecd1d7 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_dma.h @@ -0,0 +1,165 @@ +//########################################################################### +// +// FILE: hw_dma.h +// +// TITLE: Definitions for the DMA registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_DMA_H +#define HW_DMA_H + +//************************************************************************************************* +// +// The following are defines for the DMA register offsets +// +//************************************************************************************************* +#define DMA_O_CTRL 0x0U // DMA Control Register +#define DMA_O_DEBUGCTRL 0x1U // Debug Control Register +#define DMA_O_PRIORITYCTRL1 0x4U // Priority Control 1 Register +#define DMA_O_PRIORITYSTAT 0x6U // Priority Status Register + +#define DMA_O_MODE 0x0U // Mode Register +#define DMA_O_CONTROL 0x1U // Control Register +#define DMA_O_BURST_SIZE 0x2U // Burst Size Register +#define DMA_O_BURST_COUNT 0x3U // Burst Count Register +#define DMA_O_SRC_BURST_STEP 0x4U // Source Burst Step Register +#define DMA_O_DST_BURST_STEP 0x5U // Destination Burst Step Register +#define DMA_O_TRANSFER_SIZE 0x6U // Transfer Size Register +#define DMA_O_TRANSFER_COUNT 0x7U // Transfer Count Register +#define DMA_O_SRC_TRANSFER_STEP 0x8U // Source Transfer Step Register +#define DMA_O_DST_TRANSFER_STEP 0x9U // Destination Transfer Step Register +#define DMA_O_SRC_WRAP_SIZE 0xAU // Source Wrap Size Register +#define DMA_O_SRC_WRAP_COUNT 0xBU // Source Wrap Count Register +#define DMA_O_SRC_WRAP_STEP 0xCU // Source Wrap Step Register +#define DMA_O_DST_WRAP_SIZE 0xDU // Destination Wrap Size Register +#define DMA_O_DST_WRAP_COUNT 0xEU // Destination Wrap Count Register +#define DMA_O_DST_WRAP_STEP 0xFU // Destination Wrap Step Register +#define DMA_O_SRC_BEG_ADDR_SHADOW 0x10U // Source Begin Address Shadow Register +#define DMA_O_SRC_ADDR_SHADOW 0x12U // Source Address Shadow Register +#define DMA_O_SRC_BEG_ADDR_ACTIVE 0x14U // Source Begin Address Active Register +#define DMA_O_SRC_ADDR_ACTIVE 0x16U // Source Address Active Register +#define DMA_O_DST_BEG_ADDR_SHADOW 0x18U // Destination Begin Address Shadow Register +#define DMA_O_DST_ADDR_SHADOW 0x1AU // Destination Address Shadow Register +#define DMA_O_DST_BEG_ADDR_ACTIVE 0x1CU // Destination Begin Address Active Register +#define DMA_O_DST_ADDR_ACTIVE 0x1EU // Destination Address Active Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACTRL register +// +//************************************************************************************************* +#define DMA_CTRL_HARDRESET 0x1U // Hard Reset Bit +#define DMA_CTRL_PRIORITYRESET 0x2U // Priority Reset Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DEBUGCTRL register +// +//************************************************************************************************* +#define DMA_DEBUGCTRL_FREE 0x8000U // Debug Mode Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRIORITYCTRL1 register +// +//************************************************************************************************* +#define DMA_PRIORITYCTRL1_CH1PRIORITY 0x1U // Ch1 Priority Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PRIORITYSTAT register +// +//************************************************************************************************* +#define DMA_PRIORITYSTAT_ACTIVESTS_S 0U +#define DMA_PRIORITYSTAT_ACTIVESTS_M 0x7U // Active Channel Status Bits +#define DMA_PRIORITYSTAT_ACTIVESTS_SHADOW_S 4U +#define DMA_PRIORITYSTAT_ACTIVESTS_SHADOW_M 0x70U // Active Channel Status Shadow Bits + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MODE register +// +//************************************************************************************************* +#define DMA_MODE_PERINTSEL_S 0U +#define DMA_MODE_PERINTSEL_M 0x1FU // Peripheral Interrupt and Sync Select +#define DMA_MODE_OVRINTE 0x80U // Overflow Interrupt Enable +#define DMA_MODE_PERINTE 0x100U // Peripheral Interrupt Enable +#define DMA_MODE_CHINTMODE 0x200U // Channel Interrupt Mode +#define DMA_MODE_ONESHOT 0x400U // One Shot Mode Bit +#define DMA_MODE_CONTINUOUS 0x800U // Continuous Mode Bit +#define DMA_MODE_DATASIZE 0x4000U // Data Size Mode Bit +#define DMA_MODE_CHINTE 0x8000U // Channel Interrupt Enable Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CONTROL register +// +//************************************************************************************************* +#define DMA_CONTROL_RUN 0x1U // Run Bit +#define DMA_CONTROL_HALT 0x2U // Halt Bit +#define DMA_CONTROL_SOFTRESET 0x4U // Soft Reset Bit +#define DMA_CONTROL_PERINTFRC 0x8U // Interrupt Force Bit +#define DMA_CONTROL_PERINTCLR 0x10U // Interrupt Clear Bit +#define DMA_CONTROL_ERRCLR 0x80U // Error Clear Bit +#define DMA_CONTROL_PERINTFLG 0x100U // Interrupt Flag Bit +#define DMA_CONTROL_TRANSFERSTS 0x800U // Transfer Status Bit +#define DMA_CONTROL_BURSTSTS 0x1000U // Burst Status Bit +#define DMA_CONTROL_RUNSTS 0x2000U // Run Status Bit +#define DMA_CONTROL_OVRFLG 0x4000U // Overflow Flag Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the BURST_SIZE register +// +//************************************************************************************************* +#define DMA_BURST_SIZE_BURSTSIZE_S 0U +#define DMA_BURST_SIZE_BURSTSIZE_M 0x1FU // Burst Transfer Size + +//************************************************************************************************* +// +// The following are defines for the bit fields in the BURST_COUNT register +// +//************************************************************************************************* +#define DMA_BURST_COUNT_BURSTCOUNT_S 0U +#define DMA_BURST_COUNT_BURSTCOUNT_M 0x1FU // Burst Transfer Size + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_ecap.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ecap.h new file mode 100644 index 0000000..48981d6 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ecap.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_ecap.h +// +// TITLE: Definitions for the ECAP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_ECAP_H +#define HW_ECAP_H + +//************************************************************************************************* +// +// The following are defines for the ECAP register offsets +// +//************************************************************************************************* +#define ECAP_O_TSCTR 0x0U // Time-Stamp Counter +#define ECAP_O_CTRPHS 0x2U // Counter Phase Offset Value Register +#define ECAP_O_CAP1 0x4U // Capture 1 Register +#define ECAP_O_CAP2 0x6U // Capture 2 Register +#define ECAP_O_CAP3 0x8U // Capture 3 Register +#define ECAP_O_CAP4 0xAU // Capture 4 Register +#define ECAP_O_ECCTL1 0x14U // Capture Control Register 1 +#define ECAP_O_ECCTL2 0x15U // Capture Control Register 2 +#define ECAP_O_ECEINT 0x16U // Capture Interrupt Enable Register +#define ECAP_O_ECFLG 0x17U // Capture Interrupt Flag Register +#define ECAP_O_ECCLR 0x18U // Capture Interrupt Clear Register +#define ECAP_O_ECFRC 0x19U // Capture Interrupt Force Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCTL1 register +// +//************************************************************************************************* +#define ECAP_ECCTL1_CAP1POL 0x1U // Capture Event 1 Polarity select +#define ECAP_ECCTL1_CTRRST1 0x2U // Counter Reset on Capture Event 1 +#define ECAP_ECCTL1_CAP2POL 0x4U // Capture Event 2 Polarity select +#define ECAP_ECCTL1_CTRRST2 0x8U // Counter Reset on Capture Event 2 +#define ECAP_ECCTL1_CAP3POL 0x10U // Capture Event 3 Polarity select +#define ECAP_ECCTL1_CTRRST3 0x20U // Counter Reset on Capture Event 3 +#define ECAP_ECCTL1_CAP4POL 0x40U // Capture Event 4 Polarity select +#define ECAP_ECCTL1_CTRRST4 0x80U // Counter Reset on Capture Event 4 +#define ECAP_ECCTL1_CAPLDEN 0x100U // Enable Loading CAP1-4 regs on a Cap Event +#define ECAP_ECCTL1_PRESCALE_S 9U +#define ECAP_ECCTL1_PRESCALE_M 0x3E00U // Event Filter prescale select +#define ECAP_ECCTL1_FREE_SOFT_S 14U +#define ECAP_ECCTL1_FREE_SOFT_M 0xC000U // Emulation mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCTL2 register +// +//************************************************************************************************* +#define ECAP_ECCTL2_CONT_ONESHT 0x1U // Continuous or one-shot +#define ECAP_ECCTL2_STOP_WRAP_S 1U +#define ECAP_ECCTL2_STOP_WRAP_M 0x6U // Stop value for one-shot, Wrap for continuous +#define ECAP_ECCTL2_REARM 0x8U // One-shot re-arm +#define ECAP_ECCTL2_TSCTRSTOP 0x10U // TSCNT counter stop +#define ECAP_ECCTL2_SYNCI_EN 0x20U // Counter sync-in select +#define ECAP_ECCTL2_SYNCO_SEL_S 6U +#define ECAP_ECCTL2_SYNCO_SEL_M 0xC0U // Sync-out mode +#define ECAP_ECCTL2_SWSYNC 0x100U // SW forced counter sync +#define ECAP_ECCTL2_CAP_APWM 0x200U // CAP/APWM operating mode select +#define ECAP_ECCTL2_APWMPOL 0x400U // APWM output polarity select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECEINT register +// +//************************************************************************************************* +#define ECAP_ECEINT_CEVT1 0x2U // Capture Event 1 Interrupt Enable +#define ECAP_ECEINT_CEVT2 0x4U // Capture Event 2 Interrupt Enable +#define ECAP_ECEINT_CEVT3 0x8U // Capture Event 3 Interrupt Enable +#define ECAP_ECEINT_CEVT4 0x10U // Capture Event 4 Interrupt Enable +#define ECAP_ECEINT_CTROVF 0x20U // Counter Overflow Interrupt Enable +#define ECAP_ECEINT_CTR_EQ_PRD 0x40U // Period Equal Interrupt Enable +#define ECAP_ECEINT_CTR_EQ_CMP 0x80U // Compare Equal Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECFLG register +// +//************************************************************************************************* +#define ECAP_ECFLG_INT 0x1U // Global Flag +#define ECAP_ECFLG_CEVT1 0x2U // Capture Event 1 Interrupt Flag +#define ECAP_ECFLG_CEVT2 0x4U // Capture Event 2 Interrupt Flag +#define ECAP_ECFLG_CEVT3 0x8U // Capture Event 3 Interrupt Flag +#define ECAP_ECFLG_CEVT4 0x10U // Capture Event 4 Interrupt Flag +#define ECAP_ECFLG_CTROVF 0x20U // Counter Overflow Interrupt Flag +#define ECAP_ECFLG_CTR_PRD 0x40U // Period Equal Interrupt Flag +#define ECAP_ECFLG_CTR_CMP 0x80U // Compare Equal Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECCLR register +// +//************************************************************************************************* +#define ECAP_ECCLR_INT 0x1U // ECAP Global Interrupt Status Clear +#define ECAP_ECCLR_CEVT1 0x2U // Capture Event 1 Status Clear +#define ECAP_ECCLR_CEVT2 0x4U // Capture Event 2 Status Clear +#define ECAP_ECCLR_CEVT3 0x8U // Capture Event 3 Status Clear +#define ECAP_ECCLR_CEVT4 0x10U // Capture Event 4 Status Clear +#define ECAP_ECCLR_CTROVF 0x20U // Counter Overflow Status Clear +#define ECAP_ECCLR_CTR_PRD 0x40U // Period Equal Status Clear +#define ECAP_ECCLR_CTR_CMP 0x80U // Compare Equal Status Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECFRC register +// +//************************************************************************************************* +#define ECAP_ECFRC_CEVT1 0x2U // Capture Event 1 Force Interrupt +#define ECAP_ECFRC_CEVT2 0x4U // Capture Event 2 Force Interrupt +#define ECAP_ECFRC_CEVT3 0x8U // Capture Event 3 Force Interrupt +#define ECAP_ECFRC_CEVT4 0x10U // Capture Event 4 Force Interrupt +#define ECAP_ECFRC_CTROVF 0x20U // Counter Overflow Force Interrupt +#define ECAP_ECFRC_CTR_PRD 0x40U // Period Equal Force Interrupt +#define ECAP_ECFRC_CTR_CMP 0x80U // Compare Equal Force Interrupt + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_emif.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_emif.h new file mode 100644 index 0000000..9f1401e --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_emif.h @@ -0,0 +1,259 @@ +//########################################################################### +// +// FILE: hw_emif.h +// +// TITLE: Definitions for the EMIF registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EMIF_H +#define HW_EMIF_H + +//************************************************************************************************* +// +// The following are defines for the EMIF register offsets +// +//************************************************************************************************* +#define EMIF_O_RCSR 0x0U // Revision Code and Status Register +#define EMIF_O_ASYNC_WCCR 0x2U // Async Wait Cycle Config Register +#define EMIF_O_SDRAM_CR 0x4U // SDRAM (EMxCS0n) Config Register +#define EMIF_O_SDRAM_RCR 0x6U // SDRAM Refresh Control Register +#define EMIF_O_ASYNC_CS2_CR 0x8U // Async 1 (EMxCS2n) Config Register +#define EMIF_O_ASYNC_CS3_CR 0xAU // Async 2 (EMxCS3n) Config Register +#define EMIF_O_ASYNC_CS4_CR 0xCU // Async 3 (EMxCS4n) Config Register +#define EMIF_O_SDRAM_TR 0x10U // SDRAM Timing Register +#define EMIF_O_TOTAL_SDRAM_AR 0x18U // Total SDRAM Accesses Register +#define EMIF_O_TOTAL_SDRAM_ACTR 0x1AU // Total SDRAM Activate Register +#define EMIF_O_SDR_EXT_TMNG 0x1EU // SDRAM SR/PD Exit Timing Register +#define EMIF_O_INT_RAW 0x20U // Interrupt Raw Register +#define EMIF_O_INT_MSK 0x22U // Interrupt Masked Register +#define EMIF_O_INT_MSK_SET 0x24U // Interrupt Mask Set Register +#define EMIF_O_INT_MSK_CLR 0x26U // Interrupt Mask Clear Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCSR register +// +//************************************************************************************************* +#define EMIF_RCSR_MINOR_REVISION_S 0U +#define EMIF_RCSR_MINOR_REVISION_M 0xFFU // Minor Revision. +#define EMIF_RCSR_MAJOR_REVISION_S 8U +#define EMIF_RCSR_MAJOR_REVISION_M 0xFF00U // Major Revision. +#define EMIF_RCSR_MODULE_ID_S 16U +#define EMIF_RCSR_MODULE_ID_M 0x3FFF0000U // EMIF module ID. +#define EMIF_RCSR_FR 0x40000000U // EMIF is running in full rate or half rate. +#define EMIF_RCSR_BE 0x80000000U // EMIF endian mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_WCCR register +// +//************************************************************************************************* +#define EMIF_ASYNC_WCCR_MAX_EXT_WAIT_S 0U +#define EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M 0xFFU // Maximum Extended Wait cycles. +#define EMIF_ASYNC_WCCR_WP0 0x10000000U // Polarity for EMxWAIT. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_CR register +// +//************************************************************************************************* +#define EMIF_SDRAM_CR_PAGESIGE_S 0U +#define EMIF_SDRAM_CR_PAGESIGE_M 0x7U // Page Size. +#define EMIF_SDRAM_CR_IBANK_S 4U +#define EMIF_SDRAM_CR_IBANK_M 0x70U // Internal Bank setup of SDRAM devices. +#define EMIF_SDRAM_CR_BIT_11_9_LOCK 0x100U // Bits 11 to 9 are writable only if this bit + // is set. +#define EMIF_SDRAM_CR_CL_S 9U +#define EMIF_SDRAM_CR_CL_M 0xE00U // CAS Latency. +#define EMIF_SDRAM_CR_NM 0x4000U // Narrow Mode. +#define EMIF_SDRAM_CR_PDWR 0x20000000U // Perform refreshes during Power Down. +#define EMIF_SDRAM_CR_PD 0x40000000U // Power Down. +#define EMIF_SDRAM_CR_SR 0x80000000U // Self Refresh. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_RCR register +// +//************************************************************************************************* +#define EMIF_SDRAM_RCR_REFRESH_RATE_S 0U +#define EMIF_SDRAM_RCR_REFRESH_RATE_M 0x1FFFU // Refresh Rate. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS2_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS2_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS2_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS2_CR_TA_S 2U +#define EMIF_ASYNC_CS2_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS2_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS2_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS2_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS2_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS2_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS2_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS2_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS2_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS2_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS2_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS2_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS2_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS2_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS2_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS3_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS3_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS3_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS3_CR_TA_S 2U +#define EMIF_ASYNC_CS3_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS3_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS3_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS3_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS3_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS3_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS3_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS3_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS3_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS3_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS3_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS3_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS3_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS3_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS3_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ASYNC_CS4_CR register +// +//************************************************************************************************* +#define EMIF_ASYNC_CS4_CR_ASIZE_S 0U +#define EMIF_ASYNC_CS4_CR_ASIZE_M 0x3U // Asynchronous Memory Size. +#define EMIF_ASYNC_CS4_CR_TA_S 2U +#define EMIF_ASYNC_CS4_CR_TA_M 0xCU // Turn Around cycles. +#define EMIF_ASYNC_CS4_CR_R_HOLD_S 4U +#define EMIF_ASYNC_CS4_CR_R_HOLD_M 0x70U // Read Strobe Hold cycles. +#define EMIF_ASYNC_CS4_CR_R_STROBE_S 7U +#define EMIF_ASYNC_CS4_CR_R_STROBE_M 0x1F80U // Read Strobe Duration cycles. +#define EMIF_ASYNC_CS4_CR_R_SETUP_S 13U +#define EMIF_ASYNC_CS4_CR_R_SETUP_M 0x1E000U // Read Strobe Setup cycles. +#define EMIF_ASYNC_CS4_CR_W_HOLD_S 17U +#define EMIF_ASYNC_CS4_CR_W_HOLD_M 0xE0000U // Write Strobe Hold cycles. +#define EMIF_ASYNC_CS4_CR_W_STROBE_S 20U +#define EMIF_ASYNC_CS4_CR_W_STROBE_M 0x3F00000U // Write Strobe Duration cycles. +#define EMIF_ASYNC_CS4_CR_W_SETUP_S 26U +#define EMIF_ASYNC_CS4_CR_W_SETUP_M 0x3C000000U // Write Strobe Setup cycles. +#define EMIF_ASYNC_CS4_CR_EW 0x40000000U // Extend Wait mode. +#define EMIF_ASYNC_CS4_CR_SS 0x80000000U // Select Strobe mode. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDRAM_TR register +// +//************************************************************************************************* +#define EMIF_SDRAM_TR_T_RRD_S 4U +#define EMIF_SDRAM_TR_T_RRD_M 0x70U // Activate to Activate timing for different bank. +#define EMIF_SDRAM_TR_T_RC_S 8U +#define EMIF_SDRAM_TR_T_RC_M 0xF00U // Activate to Activate timing . +#define EMIF_SDRAM_TR_T_RAS_S 12U +#define EMIF_SDRAM_TR_T_RAS_M 0xF000U // Activate to Precharge timing. +#define EMIF_SDRAM_TR_T_WR_S 16U +#define EMIF_SDRAM_TR_T_WR_M 0x70000U // Last Write to Precharge timing. +#define EMIF_SDRAM_TR_T_RCD_S 20U +#define EMIF_SDRAM_TR_T_RCD_M 0x700000U // Activate to Read/Write timing. +#define EMIF_SDRAM_TR_T_RP_S 24U +#define EMIF_SDRAM_TR_T_RP_M 0x7000000U // Precharge to Activate/Refresh timing. +#define EMIF_SDRAM_TR_T_RFC_S 27U +#define EMIF_SDRAM_TR_T_RFC_M 0xF8000000U // Refresh/Load Mode to Refresh/Activate timing + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDR_EXT_TMNG register +// +//************************************************************************************************* +#define EMIF_SDR_EXT_TMNG_T_XS_S 0U +#define EMIF_SDR_EXT_TMNG_T_XS_M 0x1FU // Self Refresh exit to new command timing. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_RAW register +// +//************************************************************************************************* +#define EMIF_INT_RAW_AT 0x1U // Asynchronous Timeout. +#define EMIF_INT_RAW_LT 0x2U // Line Trap. +#define EMIF_INT_RAW_WR_S 2U +#define EMIF_INT_RAW_WR_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK register +// +//************************************************************************************************* +#define EMIF_INT_MSK_AT_MASKED 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_LT_MASKED 0x2U // Line Trap. +#define EMIF_INT_MSK_WR_MASKED_S 2U +#define EMIF_INT_MSK_WR_MASKED_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK_SET register +// +//************************************************************************************************* +#define EMIF_INT_MSK_SET_AT_MASK_SET 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_SET_LT_MASK_SET 0x2U // Line Trap. +#define EMIF_INT_MSK_SET_WR_MASK_SET_S 2U +#define EMIF_INT_MSK_SET_WR_MASK_SET_M 0x3CU // Wait Rise. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INT_MSK_CLR register +// +//************************************************************************************************* +#define EMIF_INT_MSK_CLR_AT_MASK_CLR 0x1U // Asynchronous Timeout. +#define EMIF_INT_MSK_CLR_LT_MASK_CLR 0x2U // Line Trap. +#define EMIF_INT_MSK_CLR_WR_MASK_CLR_S 2U +#define EMIF_INT_MSK_CLR_WR_MASK_CLR_M 0x3CU // Wait Rise. + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwm.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwm.h new file mode 100644 index 0000000..6f7bf2d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwm.h @@ -0,0 +1,1050 @@ +//########################################################################### +// +// FILE: hw_epwm.h +// +// TITLE: Definitions for the EPWM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EPWM_H +#define HW_EPWM_H + +//************************************************************************************************* +// +// The following are defines for the EPWM register offsets +// +//************************************************************************************************* +#define EPWM_O_TBCTL 0x0U // Time Base Control Register +#define EPWM_O_TBCTL2 0x1U // Time Base Control Register 2 +#define EPWM_O_TBCTR 0x4U // Time Base Counter Register +#define EPWM_O_TBSTS 0x5U // Time Base Status Register +#define EPWM_O_CMPCTL 0x8U // Counter Compare Control Register +#define EPWM_O_CMPCTL2 0x9U // Counter Compare Control Register 2 +#define EPWM_O_DBCTL 0xCU // Dead-Band Generator Control Register +#define EPWM_O_DBCTL2 0xDU // Dead-Band Generator Control Register 2 +#define EPWM_O_AQCTL 0x10U // Action Qualifier Control Register +#define EPWM_O_AQTSRCSEL 0x11U // Action Qualifier Trigger Event Source Select Register +#define EPWM_O_PCCTL 0x14U // PWM Chopper Control Register +#define EPWM_O_VCAPCTL 0x18U // Valley Capture Control Register +#define EPWM_O_VCNTCFG 0x19U // Valley Counter Config Register +#define EPWM_O_HRCNFG 0x20U // HRPWM Configuration Register +#define EPWM_O_HRPWR 0x21U // HRPWM Power Register +#define EPWM_O_HRMSTEP 0x26U // HRPWM MEP Step Register +#define EPWM_O_HRCNFG2 0x27U // HRPWM Configuration 2 Register +#define EPWM_O_HRPCTL 0x2DU // High Resolution Period Control Register +#define EPWM_O_TRREM 0x2EU // HRPWM High Resolution Remainder Register +#define EPWM_O_GLDCTL 0x34U // Global PWM Load Control Register +#define EPWM_O_GLDCFG 0x35U // Global PWM Load Config Register +#define EPWM_O_XLINK 0x38U // EPWMx Link Register +#define EPWM_O_AQCTLA 0x40U // Action Qualifier Control Register For Output A +#define EPWM_O_AQCTLA2 0x41U // Additional Action Qualifier Control Register For Output A +#define EPWM_O_AQCTLB 0x42U // Action Qualifier Control Register For Output B +#define EPWM_O_AQCTLB2 0x43U // Additional Action Qualifier Control Register For Output B +#define EPWM_O_AQSFRC 0x47U // Action Qualifier Software Force Register +#define EPWM_O_AQCSFRC 0x49U // Action Qualifier Continuous S/W Force Register +#define EPWM_O_DBREDHR 0x50U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define EPWM_O_DBRED 0x51U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define EPWM_O_DBFEDHR 0x52U // Dead-Band Generator Falling Edge Delay High Resolution + // Register +#define EPWM_O_DBFED 0x53U // Dead-Band Generator Falling Edge Delay Count Register +#define EPWM_O_TBPHS 0x60U // Time Base Phase High +#define EPWM_O_TBPRDHR 0x62U // Time Base Period High Resolution Register +#define EPWM_O_TBPRD 0x63U // Time Base Period Register +#define EPWM_O_CMPA 0x6AU // Counter Compare A Register +#define EPWM_O_CMPB 0x6CU // Compare B Register +#define EPWM_O_CMPC 0x6FU // Counter Compare C Register +#define EPWM_O_CMPD 0x71U // Counter Compare D Register +#define EPWM_O_GLDCTL2 0x74U // Global PWM Load Control Register 2 +#define EPWM_O_SWVDELVAL 0x77U // Software Valley Mode Delay Register +#define EPWM_O_TZSEL 0x80U // Trip Zone Select Register +#define EPWM_O_TZDCSEL 0x82U // Trip Zone Digital Comparator Select Register +#define EPWM_O_TZCTL 0x84U // Trip Zone Control Register +#define EPWM_O_TZCTL2 0x85U // Additional Trip Zone Control Register +#define EPWM_O_TZCTLDCA 0x86U // Trip Zone Control Register Digital Compare A +#define EPWM_O_TZCTLDCB 0x87U // Trip Zone Control Register Digital Compare B +#define EPWM_O_TZEINT 0x8DU // Trip Zone Enable Interrupt Register +#define EPWM_O_TZFLG 0x93U // Trip Zone Flag Register +#define EPWM_O_TZCBCFLG 0x94U // Trip Zone CBC Flag Register +#define EPWM_O_TZOSTFLG 0x95U // Trip Zone OST Flag Register +#define EPWM_O_TZCLR 0x97U // Trip Zone Clear Register +#define EPWM_O_TZCBCCLR 0x98U // Trip Zone CBC Clear Register +#define EPWM_O_TZOSTCLR 0x99U // Trip Zone OST Clear Register +#define EPWM_O_TZFRC 0x9BU // Trip Zone Force Register +#define EPWM_O_ETSEL 0xA4U // Event Trigger Selection Register +#define EPWM_O_ETPS 0xA6U // Event Trigger Pre-Scale Register +#define EPWM_O_ETFLG 0xA8U // Event Trigger Flag Register +#define EPWM_O_ETCLR 0xAAU // Event Trigger Clear Register +#define EPWM_O_ETFRC 0xACU // Event Trigger Force Register +#define EPWM_O_ETINTPS 0xAEU // Event-Trigger Interrupt Pre-Scale Register +#define EPWM_O_ETSOCPS 0xB0U // Event-Trigger SOC Pre-Scale Register +#define EPWM_O_ETCNTINITCTL 0xB2U // Event-Trigger Counter Initialization Control Register +#define EPWM_O_ETCNTINIT 0xB4U // Event-Trigger Counter Initialization Register +#define EPWM_O_DCTRIPSEL 0xC0U // Digital Compare Trip Select Register +#define EPWM_O_DCACTL 0xC3U // Digital Compare A Control Register +#define EPWM_O_DCBCTL 0xC4U // Digital Compare B Control Register +#define EPWM_O_DCFCTL 0xC7U // Digital Compare Filter Control Register +#define EPWM_O_DCCAPCTL 0xC8U // Digital Compare Capture Control Register +#define EPWM_O_DCFOFFSET 0xC9U // Digital Compare Filter Offset Register +#define EPWM_O_DCFOFFSETCNT 0xCAU // Digital Compare Filter Offset Counter Register +#define EPWM_O_DCFWINDOW 0xCBU // Digital Compare Filter Window Register +#define EPWM_O_DCFWINDOWCNT 0xCCU // Digital Compare Filter Window Counter Register +#define EPWM_O_DCCAP 0xCFU // Digital Compare Counter Capture Register +#define EPWM_O_DCAHTRIPSEL 0xD2U // Digital Compare AH Trip Select +#define EPWM_O_DCALTRIPSEL 0xD3U // Digital Compare AL Trip Select +#define EPWM_O_DCBHTRIPSEL 0xD4U // Digital Compare BH Trip Select +#define EPWM_O_DCBLTRIPSEL 0xD5U // Digital Compare BL Trip Select +#define EPWM_O_HWVDELVAL 0xFDU // Hardware Valley Mode Delay Register +#define EPWM_O_VCNTVAL 0xFEU // Hardware Valley Counter Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL register +// +//************************************************************************************************* +#define EPWM_TBCTL_CTRMODE_S 0U +#define EPWM_TBCTL_CTRMODE_M 0x3U // Counter Mode +#define EPWM_TBCTL_PHSEN 0x4U // Phase Load Enable +#define EPWM_TBCTL_PRDLD 0x8U // Active Period Load +#define EPWM_TBCTL_SYNCOSEL_S 4U +#define EPWM_TBCTL_SYNCOSEL_M 0x30U // Sync Output Select +#define EPWM_TBCTL_SWFSYNC 0x40U // Software Force Sync Pulse +#define EPWM_TBCTL_HSPCLKDIV_S 7U +#define EPWM_TBCTL_HSPCLKDIV_M 0x380U // High Speed TBCLK Pre-scaler +#define EPWM_TBCTL_CLKDIV_S 10U +#define EPWM_TBCTL_CLKDIV_M 0x1C00U // Time Base Clock Pre-scaler +#define EPWM_TBCTL_PHSDIR 0x2000U // Phase Direction Bit +#define EPWM_TBCTL_FREE_SOFT_S 14U +#define EPWM_TBCTL_FREE_SOFT_M 0xC000U // Emulation Mode Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL2 register +// +//************************************************************************************************* +#define EPWM_TBCTL2_OSHTSYNCMODE 0x40U // One shot sync mode +#define EPWM_TBCTL2_OSHTSYNC 0x80U // One shot sync +#define EPWM_TBCTL2_SYNCOSELX_S 12U +#define EPWM_TBCTL2_SYNCOSELX_M 0x3000U // Syncout selection +#define EPWM_TBCTL2_PRDLDSYNC_S 14U +#define EPWM_TBCTL2_PRDLDSYNC_M 0xC000U // PRD Shadow to Active Load on SYNC Event + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBSTS register +// +//************************************************************************************************* +#define EPWM_TBSTS_CTRDIR 0x1U // Counter Direction Status +#define EPWM_TBSTS_SYNCI 0x2U // External Input Sync Status +#define EPWM_TBSTS_CTRMAX 0x4U // Counter Max Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL register +// +//************************************************************************************************* +#define EPWM_CMPCTL_LOADAMODE_S 0U +#define EPWM_CMPCTL_LOADAMODE_M 0x3U // Active Compare A Load +#define EPWM_CMPCTL_LOADBMODE_S 2U +#define EPWM_CMPCTL_LOADBMODE_M 0xCU // Active Compare B Load +#define EPWM_CMPCTL_SHDWAMODE 0x10U // Compare A Register Block Operating Mode +#define EPWM_CMPCTL_SHDWBMODE 0x40U // Compare B Register Block Operating Mode +#define EPWM_CMPCTL_SHDWAFULL 0x100U // Compare A Shadow Register Full Status +#define EPWM_CMPCTL_SHDWBFULL 0x200U // Compare B Shadow Register Full Status +#define EPWM_CMPCTL_LOADASYNC_S 10U +#define EPWM_CMPCTL_LOADASYNC_M 0xC00U // Active Compare A Load on SYNC +#define EPWM_CMPCTL_LOADBSYNC_S 12U +#define EPWM_CMPCTL_LOADBSYNC_M 0x3000U // Active Compare B Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL2 register +// +//************************************************************************************************* +#define EPWM_CMPCTL2_LOADCMODE_S 0U +#define EPWM_CMPCTL2_LOADCMODE_M 0x3U // Active Compare C Load +#define EPWM_CMPCTL2_LOADDMODE_S 2U +#define EPWM_CMPCTL2_LOADDMODE_M 0xCU // Active Compare D load +#define EPWM_CMPCTL2_SHDWCMODE 0x10U // Compare C Block Operating Mode +#define EPWM_CMPCTL2_SHDWDMODE 0x40U // Compare D Block Operating Mode +#define EPWM_CMPCTL2_LOADCSYNC_S 10U +#define EPWM_CMPCTL2_LOADCSYNC_M 0xC00U // Active Compare C Load on SYNC +#define EPWM_CMPCTL2_LOADDSYNC_S 12U +#define EPWM_CMPCTL2_LOADDSYNC_M 0x3000U // Active Compare D Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL register +// +//************************************************************************************************* +#define EPWM_DBCTL_OUT_MODE_S 0U +#define EPWM_DBCTL_OUT_MODE_M 0x3U // Dead Band Output Mode Control +#define EPWM_DBCTL_POLSEL_S 2U +#define EPWM_DBCTL_POLSEL_M 0xCU // Polarity Select Control +#define EPWM_DBCTL_IN_MODE_S 4U +#define EPWM_DBCTL_IN_MODE_M 0x30U // Dead Band Input Select Mode Control +#define EPWM_DBCTL_LOADREDMODE_S 6U +#define EPWM_DBCTL_LOADREDMODE_M 0xC0U // Active DBRED Load Mode +#define EPWM_DBCTL_LOADFEDMODE_S 8U +#define EPWM_DBCTL_LOADFEDMODE_M 0x300U // Active DBFED Load Mode +#define EPWM_DBCTL_SHDWDBREDMODE 0x400U // DBRED Block Operating Mode +#define EPWM_DBCTL_SHDWDBFEDMODE 0x800U // DBFED Block Operating Mode +#define EPWM_DBCTL_OUTSWAP_S 12U +#define EPWM_DBCTL_OUTSWAP_M 0x3000U // Dead Band Output Swap Control +#define EPWM_DBCTL_DEDB_MODE 0x4000U // Dead Band Dual-Edge B Mode Control +#define EPWM_DBCTL_HALFCYCLE 0x8000U // Half Cycle Clocking Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL2 register +// +//************************************************************************************************* +#define EPWM_DBCTL2_LOADDBCTLMODE_S 0U +#define EPWM_DBCTL2_LOADDBCTLMODE_M 0x3U // DBCTL Load from Shadow Mode Select +#define EPWM_DBCTL2_SHDWDBCTLMODE 0x4U // DBCTL Load mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTL register +// +//************************************************************************************************* +#define EPWM_AQCTL_LDAQAMODE_S 0U +#define EPWM_AQCTL_LDAQAMODE_M 0x3U // Action Qualifier A Load Select +#define EPWM_AQCTL_LDAQBMODE_S 2U +#define EPWM_AQCTL_LDAQBMODE_M 0xCU // Action Qualifier B Load Select +#define EPWM_AQCTL_SHDWAQAMODE 0x10U // Action Qualifer A Operating Mode +#define EPWM_AQCTL_SHDWAQBMODE 0x40U // Action Qualifier B Operating Mode +#define EPWM_AQCTL_LDAQASYNC_S 8U +#define EPWM_AQCTL_LDAQASYNC_M 0x300U // AQCTLA Register Load on SYNC +#define EPWM_AQCTL_LDAQBSYNC_S 10U +#define EPWM_AQCTL_LDAQBSYNC_M 0xC00U // AQCTLB Register Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQTSRCSEL register +// +//************************************************************************************************* +#define EPWM_AQTSRCSEL_T1SEL_S 0U +#define EPWM_AQTSRCSEL_T1SEL_M 0xFU // T1 Event Source Select Bits +#define EPWM_AQTSRCSEL_T2SEL_S 4U +#define EPWM_AQTSRCSEL_T2SEL_M 0xF0U // T2 Event Source Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCCTL register +// +//************************************************************************************************* +#define EPWM_PCCTL_CHPEN 0x1U // PWM chopping enable +#define EPWM_PCCTL_OSHTWTH_S 1U +#define EPWM_PCCTL_OSHTWTH_M 0x1EU // One-shot pulse width +#define EPWM_PCCTL_CHPFREQ_S 5U +#define EPWM_PCCTL_CHPFREQ_M 0xE0U // Chopping clock frequency +#define EPWM_PCCTL_CHPDUTY_S 8U +#define EPWM_PCCTL_CHPDUTY_M 0x700U // Chopping clock Duty cycle + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCAPCTL register +// +//************************************************************************************************* +#define EPWM_VCAPCTL_VCAPE 0x1U // Valley Capture mode +#define EPWM_VCAPCTL_VCAPSTART 0x2U // Valley Capture Start +#define EPWM_VCAPCTL_TRIGSEL_S 2U +#define EPWM_VCAPCTL_TRIGSEL_M 0x1CU // Capture Trigger Select +#define EPWM_VCAPCTL_VDELAYDIV_S 7U +#define EPWM_VCAPCTL_VDELAYDIV_M 0x380U // Valley Delay Mode Divide Enable +#define EPWM_VCAPCTL_EDGEFILTDLYSEL 0x400U // Valley Switching Mode Delay Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCNTCFG register +// +//************************************************************************************************* +#define EPWM_VCNTCFG_STARTEDGE_S 0U +#define EPWM_VCNTCFG_STARTEDGE_M 0xFU // Counter Start Edge Selection +#define EPWM_VCNTCFG_STARTEDGESTS 0x80U // Start Edge Status Bit +#define EPWM_VCNTCFG_STOPEDGE_S 8U +#define EPWM_VCNTCFG_STOPEDGE_M 0xF00U // Counter Start Edge Selection +#define EPWM_VCNTCFG_STOPEDGESTS 0x8000U // Stop Edge Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG register +// +//************************************************************************************************* +#define EPWM_HRCNFG_EDGMODE_S 0U +#define EPWM_HRCNFG_EDGMODE_M 0x3U // ePWMxA Edge Mode Select Bits +#define EPWM_HRCNFG_CTLMODE 0x4U // ePWMxA Control Mode Select Bits +#define EPWM_HRCNFG_HRLOAD_S 3U +#define EPWM_HRCNFG_HRLOAD_M 0x18U // ePWMxA Shadow Mode Select Bits +#define EPWM_HRCNFG_SELOUTB 0x20U // EPWMB Output Selection Bit +#define EPWM_HRCNFG_AUTOCONV 0x40U // Autoconversion Bit +#define EPWM_HRCNFG_SWAPAB 0x80U // Swap EPWMA and EPWMB Outputs Bit +#define EPWM_HRCNFG_EDGMODEB_S 8U +#define EPWM_HRCNFG_EDGMODEB_M 0x300U // ePWMxB Edge Mode Select Bits +#define EPWM_HRCNFG_CTLMODEB 0x400U // ePWMxB Control Mode Select Bits +#define EPWM_HRCNFG_HRLOADB_S 11U +#define EPWM_HRCNFG_HRLOADB_M 0x1800U // ePWMxB Shadow Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPWR register +// +//************************************************************************************************* +#define EPWM_HRPWR_CALPWRON 0x8000U // Calibration Power On + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRMSTEP register +// +//************************************************************************************************* +#define EPWM_HRMSTEP_HRMSTEP_S 0U +#define EPWM_HRMSTEP_HRMSTEP_M 0xFFU // High Resolution Micro Step Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG2 register +// +//************************************************************************************************* +#define EPWM_HRCNFG2_EDGMODEDB_S 0U +#define EPWM_HRCNFG2_EDGMODEDB_M 0x3U // Dead-Band Edge-Mode Select Bits +#define EPWM_HRCNFG2_CTLMODEDBRED_S 2U +#define EPWM_HRCNFG2_CTLMODEDBRED_M 0xCU // DBRED Control Mode Select Bits +#define EPWM_HRCNFG2_CTLMODEDBFED_S 4U +#define EPWM_HRCNFG2_CTLMODEDBFED_M 0x30U // DBFED Control Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPCTL register +// +//************************************************************************************************* +#define EPWM_HRPCTL_HRPE 0x1U // High Resolution Period Enable +#define EPWM_HRPCTL_PWMSYNCSEL 0x2U // EPWMSYNCPER Source Select +#define EPWM_HRPCTL_TBPHSHRLOADE 0x4U // TBPHSHR Load Enable +#define EPWM_HRPCTL_PWMSYNCSELX_S 4U +#define EPWM_HRPCTL_PWMSYNCSELX_M 0x70U // EPWMSYNCPER Extended Source Select Bit: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRREM register +// +//************************************************************************************************* +#define EPWM_TRREM_TRREM_S 0U +#define EPWM_TRREM_TRREM_M 0x7FFU // HRPWM Remainder Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL register +// +//************************************************************************************************* +#define EPWM_GLDCTL_GLD 0x1U // Global Shadow to Active load event control +#define EPWM_GLDCTL_GLDMODE_S 1U +#define EPWM_GLDCTL_GLDMODE_M 0x1EU // Shadow to Active Global Load Pulse Selection +#define EPWM_GLDCTL_OSHTMODE 0x20U // One Shot Load mode control bit +#define EPWM_GLDCTL_GLDPRD_S 7U +#define EPWM_GLDCTL_GLDPRD_M 0x380U // Global Load Strobe Period Select Register +#define EPWM_GLDCTL_GLDCNT_S 10U +#define EPWM_GLDCTL_GLDCNT_M 0x1C00U // Global Load Strobe Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCFG register +// +//************************************************************************************************* +#define EPWM_GLDCFG_TBPRD_TBPRDHR 0x1U // Global load event configuration for TBPRD:TBPRDHR +#define EPWM_GLDCFG_CMPA_CMPAHR 0x2U // Global load event configuration for CMPA:CMPAHR +#define EPWM_GLDCFG_CMPB_CMPBHR 0x4U // Global load event configuration for CMPB:CMPBHR +#define EPWM_GLDCFG_CMPC 0x8U // Global load event configuration for CMPC +#define EPWM_GLDCFG_CMPD 0x10U // Global load event configuration for CMPD +#define EPWM_GLDCFG_DBRED_DBREDHR 0x20U // Global load event configuration for DBRED:DBREDHR +#define EPWM_GLDCFG_DBFED_DBFEDHR 0x40U // Global load event configuration for DBFED:DBFEDHR +#define EPWM_GLDCFG_DBCTL 0x80U // Global load event configuration for DBCTL +#define EPWM_GLDCFG_AQCTLA_AQCTLA2 0x100U // Global load event configuration for AQCTLA/A2 +#define EPWM_GLDCFG_AQCTLB_AQCTLB2 0x200U // Global load event configuration for AQCTLB/B2 +#define EPWM_GLDCFG_AQCSFRC 0x400U // Global load event configuration for AQCSFRC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EPWMXLINK register +// +//************************************************************************************************* +#define EPWM_XLINK_TBPRDLINK_S 0U +#define EPWM_XLINK_TBPRDLINK_M 0xFU // TBPRD:TBPRDHR Link +#define EPWM_XLINK_CMPALINK_S 4U +#define EPWM_XLINK_CMPALINK_M 0xF0U // CMPA:CMPAHR Link +#define EPWM_XLINK_CMPBLINK_S 8U +#define EPWM_XLINK_CMPBLINK_M 0xF00U // CMPB:CMPBHR Link +#define EPWM_XLINK_CMPCLINK_S 12U +#define EPWM_XLINK_CMPCLINK_M 0xF000U // CMPC Link +#define EPWM_XLINK_CMPDLINK_S 16U +#define EPWM_XLINK_CMPDLINK_M 0xF0000U // CMPD Link +#define EPWM_XLINK_GLDCTL2LINK_S 28U +#define EPWM_XLINK_GLDCTL2LINK_M 0xF0000000U // GLDCTL2 Link + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA register +// +//************************************************************************************************* +#define EPWM_AQCTLA_ZRO_S 0U +#define EPWM_AQCTLA_ZRO_M 0x3U // Action Counter = Zero +#define EPWM_AQCTLA_PRD_S 2U +#define EPWM_AQCTLA_PRD_M 0xCU // Action Counter = Period +#define EPWM_AQCTLA_CAU_S 4U +#define EPWM_AQCTLA_CAU_M 0x30U // Action Counter = Compare A Up +#define EPWM_AQCTLA_CAD_S 6U +#define EPWM_AQCTLA_CAD_M 0xC0U // Action Counter = Compare A Down +#define EPWM_AQCTLA_CBU_S 8U +#define EPWM_AQCTLA_CBU_M 0x300U // Action Counter = Compare B Up +#define EPWM_AQCTLA_CBD_S 10U +#define EPWM_AQCTLA_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA2 register +// +//************************************************************************************************* +#define EPWM_AQCTLA2_T1U_S 0U +#define EPWM_AQCTLA2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define EPWM_AQCTLA2_T1D_S 2U +#define EPWM_AQCTLA2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define EPWM_AQCTLA2_T2U_S 4U +#define EPWM_AQCTLA2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define EPWM_AQCTLA2_T2D_S 6U +#define EPWM_AQCTLA2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB register +// +//************************************************************************************************* +#define EPWM_AQCTLB_ZRO_S 0U +#define EPWM_AQCTLB_ZRO_M 0x3U // Action Counter = Zero +#define EPWM_AQCTLB_PRD_S 2U +#define EPWM_AQCTLB_PRD_M 0xCU // Action Counter = Period +#define EPWM_AQCTLB_CAU_S 4U +#define EPWM_AQCTLB_CAU_M 0x30U // Action Counter = Compare A Up +#define EPWM_AQCTLB_CAD_S 6U +#define EPWM_AQCTLB_CAD_M 0xC0U // Action Counter = Compare A Down +#define EPWM_AQCTLB_CBU_S 8U +#define EPWM_AQCTLB_CBU_M 0x300U // Action Counter = Compare B Up +#define EPWM_AQCTLB_CBD_S 10U +#define EPWM_AQCTLB_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB2 register +// +//************************************************************************************************* +#define EPWM_AQCTLB2_T1U_S 0U +#define EPWM_AQCTLB2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define EPWM_AQCTLB2_T1D_S 2U +#define EPWM_AQCTLB2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define EPWM_AQCTLB2_T2U_S 4U +#define EPWM_AQCTLB2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define EPWM_AQCTLB2_T2D_S 6U +#define EPWM_AQCTLB2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQSFRC register +// +//************************************************************************************************* +#define EPWM_AQSFRC_ACTSFA_S 0U +#define EPWM_AQSFRC_ACTSFA_M 0x3U // Action when One-time SW Force A Invoked +#define EPWM_AQSFRC_OTSFA 0x4U // One-time SW Force A Output +#define EPWM_AQSFRC_ACTSFB_S 3U +#define EPWM_AQSFRC_ACTSFB_M 0x18U // Action when One-time SW Force B Invoked +#define EPWM_AQSFRC_OTSFB 0x20U // One-time SW Force A Output +#define EPWM_AQSFRC_RLDCSF_S 6U +#define EPWM_AQSFRC_RLDCSF_M 0xC0U // Reload from Shadow Options + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCSFRC register +// +//************************************************************************************************* +#define EPWM_AQCSFRC_CSFA_S 0U +#define EPWM_AQCSFRC_CSFA_M 0x3U // Continuous Software Force on output A +#define EPWM_AQCSFRC_CSFB_S 2U +#define EPWM_AQCSFRC_CSFB_M 0xCU // Continuous Software Force on output B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBREDHR register +// +//************************************************************************************************* +#define EPWM_DBREDHR_DBREDHR_S 9U +#define EPWM_DBREDHR_DBREDHR_M 0xFE00U // DBREDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBRED register +// +//************************************************************************************************* +#define EPWM_DBRED_DBRED_S 0U +#define EPWM_DBRED_DBRED_M 0x3FFFU // Rising edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFEDHR register +// +//************************************************************************************************* +#define EPWM_DBFEDHR_DBFEDHR_S 9U +#define EPWM_DBFEDHR_DBFEDHR_M 0xFE00U // DBFEDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFED register +// +//************************************************************************************************* +#define EPWM_DBFED_DBFED_S 0U +#define EPWM_DBFED_DBFED_M 0x3FFFU // Falling edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBPHS register +// +//************************************************************************************************* +#define EPWM_TBPHS_TBPHSHR_S 0U +#define EPWM_TBPHS_TBPHSHR_M 0xFFFFU // Extension Register for HRPWM Phase (8-bits) +#define EPWM_TBPHS_TBPHS_S 16U +#define EPWM_TBPHS_TBPHS_M 0xFFFF0000U // Phase Offset Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPA register +// +//************************************************************************************************* +#define EPWM_CMPA_CMPAHR_S 0U +#define EPWM_CMPA_CMPAHR_M 0xFFFFU // Compare A HRPWM Extension Register +#define EPWM_CMPA_CMPA_S 16U +#define EPWM_CMPA_CMPA_M 0xFFFF0000U // Compare A Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPB register +// +//************************************************************************************************* +#define EPWM_CMPB_CMPBHR_S 0U +#define EPWM_CMPB_CMPBHR_M 0xFFFFU // Compare B High Resolution Bits +#define EPWM_CMPB_CMPB_S 16U +#define EPWM_CMPB_CMPB_M 0xFFFF0000U // Compare B Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL2 register +// +//************************************************************************************************* +#define EPWM_GLDCTL2_OSHTLD 0x1U // Enable reload event in one shot mode +#define EPWM_GLDCTL2_GFRCLD 0x2U // Force reload event in one shot mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZSEL register +// +//************************************************************************************************* +#define EPWM_TZSEL_CBC1 0x1U // TZ1 CBC select +#define EPWM_TZSEL_CBC2 0x2U // TZ2 CBC select +#define EPWM_TZSEL_CBC3 0x4U // TZ3 CBC select +#define EPWM_TZSEL_CBC4 0x8U // TZ4 CBC select +#define EPWM_TZSEL_CBC5 0x10U // TZ5 CBC select +#define EPWM_TZSEL_CBC6 0x20U // TZ6 CBC select +#define EPWM_TZSEL_DCAEVT2 0x40U // DCAEVT2 CBC select +#define EPWM_TZSEL_DCBEVT2 0x80U // DCBEVT2 CBC select +#define EPWM_TZSEL_OSHT1 0x100U // One-shot TZ1 select +#define EPWM_TZSEL_OSHT2 0x200U // One-shot TZ2 select +#define EPWM_TZSEL_OSHT3 0x400U // One-shot TZ3 select +#define EPWM_TZSEL_OSHT4 0x800U // One-shot TZ4 select +#define EPWM_TZSEL_OSHT5 0x1000U // One-shot TZ5 select +#define EPWM_TZSEL_OSHT6 0x2000U // One-shot TZ6 select +#define EPWM_TZSEL_DCAEVT1 0x4000U // One-shot DCAEVT1 select +#define EPWM_TZSEL_DCBEVT1 0x8000U // One-shot DCBEVT1 select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZDCSEL register +// +//************************************************************************************************* +#define EPWM_TZDCSEL_DCAEVT1_S 0U +#define EPWM_TZDCSEL_DCAEVT1_M 0x7U // Digital Compare Output A Event 1 +#define EPWM_TZDCSEL_DCAEVT2_S 3U +#define EPWM_TZDCSEL_DCAEVT2_M 0x38U // Digital Compare Output A Event 2 +#define EPWM_TZDCSEL_DCBEVT1_S 6U +#define EPWM_TZDCSEL_DCBEVT1_M 0x1C0U // Digital Compare Output B Event 1 +#define EPWM_TZDCSEL_DCBEVT2_S 9U +#define EPWM_TZDCSEL_DCBEVT2_M 0xE00U // Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL register +// +//************************************************************************************************* +#define EPWM_TZCTL_TZA_S 0U +#define EPWM_TZCTL_TZA_M 0x3U // TZ1 to TZ6 Trip Action On EPWMxA +#define EPWM_TZCTL_TZB_S 2U +#define EPWM_TZCTL_TZB_M 0xCU // TZ1 to TZ6 Trip Action On EPWMxB +#define EPWM_TZCTL_DCAEVT1_S 4U +#define EPWM_TZCTL_DCAEVT1_M 0x30U // EPWMxA action on DCAEVT1 +#define EPWM_TZCTL_DCAEVT2_S 6U +#define EPWM_TZCTL_DCAEVT2_M 0xC0U // EPWMxA action on DCAEVT2 +#define EPWM_TZCTL_DCBEVT1_S 8U +#define EPWM_TZCTL_DCBEVT1_M 0x300U // EPWMxB action on DCBEVT1 +#define EPWM_TZCTL_DCBEVT2_S 10U +#define EPWM_TZCTL_DCBEVT2_M 0xC00U // EPWMxB action on DCBEVT2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL2 register +// +//************************************************************************************************* +#define EPWM_TZCTL2_TZAU_S 0U +#define EPWM_TZCTL2_TZAU_M 0x7U // Trip Action On EPWMxA while Count direction is UP +#define EPWM_TZCTL2_TZAD_S 3U +#define EPWM_TZCTL2_TZAD_M 0x38U // Trip Action On EPWMxA while Count direction is DOWN +#define EPWM_TZCTL2_TZBU_S 6U +#define EPWM_TZCTL2_TZBU_M 0x1C0U // Trip Action On EPWMxB while Count direction is UP +#define EPWM_TZCTL2_TZBD_S 9U +#define EPWM_TZCTL2_TZBD_M 0xE00U // Trip Action On EPWMxB while Count direction is DOWN +#define EPWM_TZCTL2_ETZE 0x8000U // TZCTL2 Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCA register +// +//************************************************************************************************* +#define EPWM_TZCTLDCA_DCAEVT1U_S 0U +#define EPWM_TZCTLDCA_DCAEVT1U_M 0x7U // DCAEVT1 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCA_DCAEVT1D_S 3U +#define EPWM_TZCTLDCA_DCAEVT1D_M 0x38U // DCAEVT1 Action On EPWMxA while Count direction is + // DOWN +#define EPWM_TZCTLDCA_DCAEVT2U_S 6U +#define EPWM_TZCTLDCA_DCAEVT2U_M 0x1C0U // DCAEVT2 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCA_DCAEVT2D_S 9U +#define EPWM_TZCTLDCA_DCAEVT2D_M 0xE00U // DCAEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCB register +// +//************************************************************************************************* +#define EPWM_TZCTLDCB_DCBEVT1U_S 0U +#define EPWM_TZCTLDCB_DCBEVT1U_M 0x7U // DCBEVT1 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCB_DCBEVT1D_S 3U +#define EPWM_TZCTLDCB_DCBEVT1D_M 0x38U // DCBEVT1 Action On EPWMxA while Count direction is + // DOWN +#define EPWM_TZCTLDCB_DCBEVT2U_S 6U +#define EPWM_TZCTLDCB_DCBEVT2U_M 0x1C0U // DCBEVT2 Action On EPWMxA while Count direction is UP +#define EPWM_TZCTLDCB_DCBEVT2D_S 9U +#define EPWM_TZCTLDCB_DCBEVT2D_M 0xE00U // DCBEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZEINT register +// +//************************************************************************************************* +#define EPWM_TZEINT_CBC 0x2U // Trip Zones Cycle By Cycle Int Enable +#define EPWM_TZEINT_OST 0x4U // Trip Zones One Shot Int Enable +#define EPWM_TZEINT_DCAEVT1 0x8U // Digital Compare A Event 1 Int Enable +#define EPWM_TZEINT_DCAEVT2 0x10U // Digital Compare A Event 2 Int Enable +#define EPWM_TZEINT_DCBEVT1 0x20U // Digital Compare B Event 1 Int Enable +#define EPWM_TZEINT_DCBEVT2 0x40U // Digital Compare B Event 2 Int Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFLG register +// +//************************************************************************************************* +#define EPWM_TZFLG_INT 0x1U // Global Int Status Flag +#define EPWM_TZFLG_CBC 0x2U // Trip Zones Cycle By Cycle Flag +#define EPWM_TZFLG_OST 0x4U // Trip Zones One Shot Flag +#define EPWM_TZFLG_DCAEVT1 0x8U // Digital Compare A Event 1 Flag +#define EPWM_TZFLG_DCAEVT2 0x10U // Digital Compare A Event 2 Flag +#define EPWM_TZFLG_DCBEVT1 0x20U // Digital Compare B Event 1 Flag +#define EPWM_TZFLG_DCBEVT2 0x40U // Digital Compare B Event 2 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCFLG register +// +//************************************************************************************************* +#define EPWM_TZCBCFLG_CBC1 0x1U // Latched Status Flag for CBC1 Trip Latch +#define EPWM_TZCBCFLG_CBC2 0x2U // Latched Status Flag for CBC2 Trip Latch +#define EPWM_TZCBCFLG_CBC3 0x4U // Latched Status Flag for CBC3 Trip Latch +#define EPWM_TZCBCFLG_CBC4 0x8U // Latched Status Flag for CBC4 Trip Latch +#define EPWM_TZCBCFLG_CBC5 0x10U // Latched Status Flag for CBC5 Trip Latch +#define EPWM_TZCBCFLG_CBC6 0x20U // Latched Status Flag for CBC6 Trip Latch +#define EPWM_TZCBCFLG_DCAEVT2 0x40U // Latched Status Flag for Digital Compare Output A Event 2 +#define EPWM_TZCBCFLG_DCBEVT2 0x80U // Latched Status Flag for Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTFLG register +// +//************************************************************************************************* +#define EPWM_TZOSTFLG_OST1 0x1U // Latched Status Flag for OST1 Trip Latch +#define EPWM_TZOSTFLG_OST2 0x2U // Latched Status Flag for OST2 Trip Latch +#define EPWM_TZOSTFLG_OST3 0x4U // Latched Status Flag for OST3 Trip Latch +#define EPWM_TZOSTFLG_OST4 0x8U // Latched Status Flag for OST4 Trip Latch +#define EPWM_TZOSTFLG_OST5 0x10U // Latched Status Flag for OST5 Trip Latch +#define EPWM_TZOSTFLG_OST6 0x20U // Latched Status Flag for OST6 Trip Latch +#define EPWM_TZOSTFLG_DCAEVT1 0x40U // Latched Status Flag for Digital Compare Output A Event 1 +#define EPWM_TZOSTFLG_DCBEVT1 0x80U // Latched Status Flag for Digital Compare Output B Event 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCLR register +// +//************************************************************************************************* +#define EPWM_TZCLR_INT 0x1U // Global Interrupt Clear Flag +#define EPWM_TZCLR_CBC 0x2U // Cycle-By-Cycle Flag Clear +#define EPWM_TZCLR_OST 0x4U // One-Shot Flag Clear +#define EPWM_TZCLR_DCAEVT1 0x8U // DCAVET1 Flag Clear +#define EPWM_TZCLR_DCAEVT2 0x10U // DCAEVT2 Flag Clear +#define EPWM_TZCLR_DCBEVT1 0x20U // DCBEVT1 Flag Clear +#define EPWM_TZCLR_DCBEVT2 0x40U // DCBEVT2 Flag Clear +#define EPWM_TZCLR_CBCPULSE_S 14U +#define EPWM_TZCLR_CBCPULSE_M 0xC000U // Clear Pulse for CBC Trip Latch + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCCLR register +// +//************************************************************************************************* +#define EPWM_TZCBCCLR_CBC1 0x1U // Clear Flag for Cycle-By-Cycle (CBC1) Trip Latch +#define EPWM_TZCBCCLR_CBC2 0x2U // Clear Flag for Cycle-By-Cycle (CBC2) Trip Latch +#define EPWM_TZCBCCLR_CBC3 0x4U // Clear Flag for Cycle-By-Cycle (CBC3) Trip Latch +#define EPWM_TZCBCCLR_CBC4 0x8U // Clear Flag for Cycle-By-Cycle (CBC4) Trip Latch +#define EPWM_TZCBCCLR_CBC5 0x10U // Clear Flag for Cycle-By-Cycle (CBC5) Trip Latch +#define EPWM_TZCBCCLR_CBC6 0x20U // Clear Flag for Cycle-By-Cycle (CBC6) Trip Latch +#define EPWM_TZCBCCLR_DCAEVT2 0x40U // Clear Flag forDCAEVT2 selected for CBC +#define EPWM_TZCBCCLR_DCBEVT2 0x80U // Clear Flag for DCBEVT2 selected for CBC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTCLR register +// +//************************************************************************************************* +#define EPWM_TZOSTCLR_OST1 0x1U // Clear Flag for Oneshot (OST1) Trip Latch +#define EPWM_TZOSTCLR_OST2 0x2U // Clear Flag for Oneshot (OST2) Trip Latch +#define EPWM_TZOSTCLR_OST3 0x4U // Clear Flag for Oneshot (OST3) Trip Latch +#define EPWM_TZOSTCLR_OST4 0x8U // Clear Flag for Oneshot (OST4) Trip Latch +#define EPWM_TZOSTCLR_OST5 0x10U // Clear Flag for Oneshot (OST5) Trip Latch +#define EPWM_TZOSTCLR_OST6 0x20U // Clear Flag for Oneshot (OST6) Trip Latch +#define EPWM_TZOSTCLR_DCAEVT1 0x40U // Clear Flag for DCAEVT1 selected for OST +#define EPWM_TZOSTCLR_DCBEVT1 0x80U // Clear Flag for DCBEVT1 selected for OST + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFRC register +// +//************************************************************************************************* +#define EPWM_TZFRC_CBC 0x2U // Force Trip Zones Cycle By Cycle Event +#define EPWM_TZFRC_OST 0x4U // Force Trip Zones One Shot Event +#define EPWM_TZFRC_DCAEVT1 0x8U // Force Digital Compare A Event 1 +#define EPWM_TZFRC_DCAEVT2 0x10U // Force Digital Compare A Event 2 +#define EPWM_TZFRC_DCBEVT1 0x20U // Force Digital Compare B Event 1 +#define EPWM_TZFRC_DCBEVT2 0x40U // Force Digital Compare B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSEL register +// +//************************************************************************************************* +#define EPWM_ETSEL_INTSEL_S 0U +#define EPWM_ETSEL_INTSEL_M 0x7U // EPWMxINTn Select +#define EPWM_ETSEL_INTEN 0x8U // EPWMxINTn Enable +#define EPWM_ETSEL_SOCASELCMP 0x10U // EPWMxSOCA Compare Select +#define EPWM_ETSEL_SOCBSELCMP 0x20U // EPWMxSOCB Compare Select +#define EPWM_ETSEL_INTSELCMP 0x40U // EPWMxINT Compare Select +#define EPWM_ETSEL_SOCASEL_S 8U +#define EPWM_ETSEL_SOCASEL_M 0x700U // Start of Conversion A Select +#define EPWM_ETSEL_SOCAEN 0x800U // Start of Conversion A Enable +#define EPWM_ETSEL_SOCBSEL_S 12U +#define EPWM_ETSEL_SOCBSEL_M 0x7000U // Start of Conversion B Select +#define EPWM_ETSEL_SOCBEN 0x8000U // Start of Conversion B Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETPS register +// +//************************************************************************************************* +#define EPWM_ETPS_INTPRD_S 0U +#define EPWM_ETPS_INTPRD_M 0x3U // EPWMxINTn Period Select +#define EPWM_ETPS_INTCNT_S 2U +#define EPWM_ETPS_INTCNT_M 0xCU // EPWMxINTn Counter Register +#define EPWM_ETPS_INTPSSEL 0x10U // EPWMxINTn Pre-Scale Selection Bits +#define EPWM_ETPS_SOCPSSEL 0x20U // EPWMxSOC A/B Pre-Scale Selection Bits +#define EPWM_ETPS_SOCAPRD_S 8U +#define EPWM_ETPS_SOCAPRD_M 0x300U // EPWMxSOCA Period Select +#define EPWM_ETPS_SOCACNT_S 10U +#define EPWM_ETPS_SOCACNT_M 0xC00U // EPWMxSOCA Counter Register +#define EPWM_ETPS_SOCBPRD_S 12U +#define EPWM_ETPS_SOCBPRD_M 0x3000U // EPWMxSOCB Period Select +#define EPWM_ETPS_SOCBCNT_S 14U +#define EPWM_ETPS_SOCBCNT_M 0xC000U // EPWMxSOCB Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFLG register +// +//************************************************************************************************* +#define EPWM_ETFLG_INT 0x1U // EPWMxINTn Flag +#define EPWM_ETFLG_SOCA 0x4U // EPWMxSOCA Flag +#define EPWM_ETFLG_SOCB 0x8U // EPWMxSOCB Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCLR register +// +//************************************************************************************************* +#define EPWM_ETCLR_INT 0x1U // EPWMxINTn Clear +#define EPWM_ETCLR_SOCA 0x4U // EPWMxSOCA Clear +#define EPWM_ETCLR_SOCB 0x8U // EPWMxSOCB Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFRC register +// +//************************************************************************************************* +#define EPWM_ETFRC_INT 0x1U // EPWMxINTn Force +#define EPWM_ETFRC_SOCA 0x4U // EPWMxSOCA Force +#define EPWM_ETFRC_SOCB 0x8U // EPWMxSOCB Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETINTPS register +// +//************************************************************************************************* +#define EPWM_ETINTPS_INTPRD2_S 0U +#define EPWM_ETINTPS_INTPRD2_M 0xFU // EPWMxINTn Period Select +#define EPWM_ETINTPS_INTCNT2_S 4U +#define EPWM_ETINTPS_INTCNT2_M 0xF0U // EPWMxINTn Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSOCPS register +// +//************************************************************************************************* +#define EPWM_ETSOCPS_SOCAPRD2_S 0U +#define EPWM_ETSOCPS_SOCAPRD2_M 0xFU // EPWMxSOCA Period Select +#define EPWM_ETSOCPS_SOCACNT2_S 4U +#define EPWM_ETSOCPS_SOCACNT2_M 0xF0U // EPWMxSOCA Counter Register +#define EPWM_ETSOCPS_SOCBPRD2_S 8U +#define EPWM_ETSOCPS_SOCBPRD2_M 0xF00U // EPWMxSOCB Period Select +#define EPWM_ETSOCPS_SOCBCNT2_S 12U +#define EPWM_ETSOCPS_SOCBCNT2_M 0xF000U // EPWMxSOCB Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINITCTL register +// +//************************************************************************************************* +#define EPWM_ETCNTINITCTL_INTINITFRC 0x400U // EPWMxINT Counter Initialization Force +#define EPWM_ETCNTINITCTL_SOCAINITFRC 0x800U // EPWMxSOCA Counter Initialization Force +#define EPWM_ETCNTINITCTL_SOCBINITFRC 0x1000U // EPWMxSOCB Counter Initialization Force +#define EPWM_ETCNTINITCTL_INTINITEN 0x2000U // EPWMxINT Counter Initialization Enable +#define EPWM_ETCNTINITCTL_SOCAINITEN 0x4000U // EPWMxSOCA Counter Initialization Enable +#define EPWM_ETCNTINITCTL_SOCBINITEN 0x8000U // EPWMxSOCB Counter Initialization Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINIT register +// +//************************************************************************************************* +#define EPWM_ETCNTINIT_INTINIT_S 0U +#define EPWM_ETCNTINIT_INTINIT_M 0xFU // EPWMxINT Counter Initialization Bits +#define EPWM_ETCNTINIT_SOCAINIT_S 4U +#define EPWM_ETCNTINIT_SOCAINIT_M 0xF0U // EPWMxSOCA Counter Initialization Bits +#define EPWM_ETCNTINIT_SOCBINIT_S 8U +#define EPWM_ETCNTINIT_SOCBINIT_M 0xF00U // EPWMxSOCB Counter Initialization Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCTRIPSEL_DCAHCOMPSEL_S 0U +#define EPWM_DCTRIPSEL_DCAHCOMPSEL_M 0xFU // Digital Compare A High COMP Input Select +#define EPWM_DCTRIPSEL_DCALCOMPSEL_S 4U +#define EPWM_DCTRIPSEL_DCALCOMPSEL_M 0xF0U // Digital Compare A Low COMP Input Select +#define EPWM_DCTRIPSEL_DCBHCOMPSEL_S 8U +#define EPWM_DCTRIPSEL_DCBHCOMPSEL_M 0xF00U // Digital Compare B High COMP Input Select +#define EPWM_DCTRIPSEL_DCBLCOMPSEL_S 12U +#define EPWM_DCTRIPSEL_DCBLCOMPSEL_M 0xF000U // Digital Compare B Low COMP Input Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCACTL register +// +//************************************************************************************************* +#define EPWM_DCACTL_EVT1SRCSEL 0x1U // DCAEVT1 Source Signal +#define EPWM_DCACTL_EVT1FRCSYNCSEL 0x2U // DCAEVT1 Force Sync Signal +#define EPWM_DCACTL_EVT1SOCE 0x4U // DCAEVT1 SOC Enable +#define EPWM_DCACTL_EVT1SYNCE 0x8U // DCAEVT1 SYNC Enable +#define EPWM_DCACTL_EVT2SRCSEL 0x100U // DCAEVT2 Source Signal +#define EPWM_DCACTL_EVT2FRCSYNCSEL 0x200U // DCAEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBCTL register +// +//************************************************************************************************* +#define EPWM_DCBCTL_EVT1SRCSEL 0x1U // DCBEVT1 Source Signal +#define EPWM_DCBCTL_EVT1FRCSYNCSEL 0x2U // DCBEVT1 Force Sync Signal +#define EPWM_DCBCTL_EVT1SOCE 0x4U // DCBEVT1 SOC Enable +#define EPWM_DCBCTL_EVT1SYNCE 0x8U // DCBEVT1 SYNC Enable +#define EPWM_DCBCTL_EVT2SRCSEL 0x100U // DCBEVT2 Source Signal +#define EPWM_DCBCTL_EVT2FRCSYNCSEL 0x200U // DCBEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCFCTL register +// +//************************************************************************************************* +#define EPWM_DCFCTL_SRCSEL_S 0U +#define EPWM_DCFCTL_SRCSEL_M 0x3U // Filter Block Signal Source Select +#define EPWM_DCFCTL_BLANKE 0x4U // Blanking Enable/Disable +#define EPWM_DCFCTL_BLANKINV 0x8U // Blanking Window Inversion +#define EPWM_DCFCTL_PULSESEL_S 4U +#define EPWM_DCFCTL_PULSESEL_M 0x30U // Pulse Select for Blanking & Capture Alignment +#define EPWM_DCFCTL_EDGEFILTSEL 0x40U // Edge Filter Select +#define EPWM_DCFCTL_EDGEMODE_S 8U +#define EPWM_DCFCTL_EDGEMODE_M 0x300U // Edge Mode +#define EPWM_DCFCTL_EDGECOUNT_S 10U +#define EPWM_DCFCTL_EDGECOUNT_M 0x1C00U // Edge Count +#define EPWM_DCFCTL_EDGESTATUS_S 13U +#define EPWM_DCFCTL_EDGESTATUS_M 0xE000U // Edge Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCCAPCTL register +// +//************************************************************************************************* +#define EPWM_DCCAPCTL_CAPE 0x1U // Counter Capture Enable +#define EPWM_DCCAPCTL_SHDWMODE 0x2U // Counter Capture Mode +#define EPWM_DCCAPCTL_CAPSTS 0x2000U // Latched Status Flag for Capture Event +#define EPWM_DCCAPCTL_CAPCLR 0x4000U // DC Capture Latched Status Clear Flag +#define EPWM_DCCAPCTL_CAPMODE 0x8000U // Counter Capture Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCAHTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCAHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAH Mux +#define EPWM_DCAHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCALTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCALTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAL Mux +#define EPWM_DCALTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAL Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBHTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCBHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBH Mux +#define EPWM_DCBHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBLTRIPSEL register +// +//************************************************************************************************* +#define EPWM_DCBLTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBL Mux +#define EPWM_DCBLTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBL Mux + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwmxbar.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwmxbar.h new file mode 100644 index 0000000..5fb6058 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_epwmxbar.h @@ -0,0 +1,1192 @@ +//########################################################################### +// +// FILE: hw_epwmxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EPWMXBAR_H +#define HW_EPWMXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_TRIP4MUX0TO15CFG 0x0U // ePWM XBAR Mux Configuration for TRIP4 +#define XBAR_O_TRIP4MUX16TO31CFG 0x2U // ePWM XBAR Mux Configuration for TRIP4 +#define XBAR_O_TRIP5MUX0TO15CFG 0x4U // ePWM XBAR Mux Configuration for TRIP5 +#define XBAR_O_TRIP5MUX16TO31CFG 0x6U // ePWM XBAR Mux Configuration for TRIP5 +#define XBAR_O_TRIP7MUX0TO15CFG 0x8U // ePWM XBAR Mux Configuration for TRIP7 +#define XBAR_O_TRIP7MUX16TO31CFG 0xAU // ePWM XBAR Mux Configuration for TRIP7 +#define XBAR_O_TRIP8MUX0TO15CFG 0xCU // ePWM XBAR Mux Configuration for TRIP8 +#define XBAR_O_TRIP8MUX16TO31CFG 0xEU // ePWM XBAR Mux Configuration for TRIP8 +#define XBAR_O_TRIP9MUX0TO15CFG 0x10U // ePWM XBAR Mux Configuration for TRIP9 +#define XBAR_O_TRIP9MUX16TO31CFG 0x12U // ePWM XBAR Mux Configuration for TRIP9 +#define XBAR_O_TRIP10MUX0TO15CFG 0x14U // ePWM XBAR Mux Configuration for TRIP10 +#define XBAR_O_TRIP10MUX16TO31CFG 0x16U // ePWM XBAR Mux Configuration for TRIP10 +#define XBAR_O_TRIP11MUX0TO15CFG 0x18U // ePWM XBAR Mux Configuration for TRIP11 +#define XBAR_O_TRIP11MUX16TO31CFG 0x1AU // ePWM XBAR Mux Configuration for TRIP11 +#define XBAR_O_TRIP12MUX0TO15CFG 0x1CU // ePWM XBAR Mux Configuration for TRIP12 +#define XBAR_O_TRIP12MUX16TO31CFG 0x1EU // ePWM XBAR Mux Configuration for TRIP12 +#define XBAR_O_TRIP4MUXENABLE 0x20U // ePWM XBAR Mux Enable for TRIP4 +#define XBAR_O_TRIP5MUXENABLE 0x22U // ePWM XBAR Mux Enable for TRIP5 +#define XBAR_O_TRIP7MUXENABLE 0x24U // ePWM XBAR Mux Enable for TRIP7 +#define XBAR_O_TRIP8MUXENABLE 0x26U // ePWM XBAR Mux Enable for TRIP8 +#define XBAR_O_TRIP9MUXENABLE 0x28U // ePWM XBAR Mux Enable for TRIP9 +#define XBAR_O_TRIP10MUXENABLE 0x2AU // ePWM XBAR Mux Enable for TRIP10 +#define XBAR_O_TRIP11MUXENABLE 0x2CU // ePWM XBAR Mux Enable for TRIP11 +#define XBAR_O_TRIP12MUXENABLE 0x2EU // ePWM XBAR Mux Enable for TRIP12 +#define XBAR_O_TRIPOUTINV 0x38U // ePWM XBAR Output Inversion Register +#define XBAR_O_TRIPLOCK 0x3EU // ePWM XBAR Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP4MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP4MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP4MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP4MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP4MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP4MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP4MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP4MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP4MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP4MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP4MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP4MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP4MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP4MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP4MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP4MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP4MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP4 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP4MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP4MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP4MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP4MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP4MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP4MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP4MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP4MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP4MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP4MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP4MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP4MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP4MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP4MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP4MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP4MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP4 of + // EPWM-XBAR +#define XBAR_TRIP4MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP4MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP4 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP5MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP5MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP5MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP5MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP5MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP5MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP5MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP5MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP5MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP5MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP5MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP5MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP5MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP5MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP5MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP5MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP5MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP5 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP5MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP5MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP5MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP5MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP5MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP5MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP5MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP5MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP5MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP5MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP5MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP5MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP5MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP5MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP5MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP5MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP5 of + // EPWM-XBAR +#define XBAR_TRIP5MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP5MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP5 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP7MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP7MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP7MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP7MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP7MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP7MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP7MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP7MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP7MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP7MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP7MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP7MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP7MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP7MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP7MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP7MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP7MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP7 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP7MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP7MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP7MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP7MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP7MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP7MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP7MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP7MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP7MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP7MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP7MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP7MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP7MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP7MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP7MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP7MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP7 of + // EPWM-XBAR +#define XBAR_TRIP7MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP7MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP7 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP8MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP8MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP8MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP8MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP8MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP8MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP8MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP8MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP8MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP8MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP8MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP8MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP8MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP8MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP8MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP8MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP8MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP8 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP8MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP8MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP8MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP8MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP8MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP8MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP8MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP8MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP8MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP8MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP8MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP8MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP8MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP8MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP8MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP8MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP8 of + // EPWM-XBAR +#define XBAR_TRIP8MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP8MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP8 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP9MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP9MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP9MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP9MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP9MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP9MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP9MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP9MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP9MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP9MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP9MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP9MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP9MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP9MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP9MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP9MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP9MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP9 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP9MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP9MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP9MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP9MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP9MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP9MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP9MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP9MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP9MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP9MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP9MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP9MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP9MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP9MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP9MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP9MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP9 of + // EPWM-XBAR +#define XBAR_TRIP9MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP9MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP9 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP10MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP10MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP10MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP10MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP10MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP10MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP10MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP10MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP10MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP10MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP10MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP10MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP10MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP10MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP10MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP10MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP10MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP10 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP10MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP10MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP10MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP10MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP10MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP10MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP10MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP10MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP10MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP10MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP10MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP10MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP10MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP10MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP10MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP10MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP10 of + // EPWM-XBAR +#define XBAR_TRIP10MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP10MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP10 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP11MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP11MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP11MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP11MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP11MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP11MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP11MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP11MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP11MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP11MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP11MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP11MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP11MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP11MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP11MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP11MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP11MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP11 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP11MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP11MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP11MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP11MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP11MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP11MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP11MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP11MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP11MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP11MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP11MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP11MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP11MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP11MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP11MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP11MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP11 of + // EPWM-XBAR +#define XBAR_TRIP11MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP11MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP11 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_TRIP12MUX0TO15CFG_MUX0_S 0U +#define XBAR_TRIP12MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX1_S 2U +#define XBAR_TRIP12MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX2_S 4U +#define XBAR_TRIP12MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX3_S 6U +#define XBAR_TRIP12MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX4_S 8U +#define XBAR_TRIP12MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX5_S 10U +#define XBAR_TRIP12MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX6_S 12U +#define XBAR_TRIP12MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX7_S 14U +#define XBAR_TRIP12MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX8_S 16U +#define XBAR_TRIP12MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX9_S 18U +#define XBAR_TRIP12MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX10_S 20U +#define XBAR_TRIP12MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX11_S 22U +#define XBAR_TRIP12MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX12_S 24U +#define XBAR_TRIP12MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX13_S 26U +#define XBAR_TRIP12MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX14_S 28U +#define XBAR_TRIP12MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX0TO15CFG_MUX15_S 30U +#define XBAR_TRIP12MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for TRIP12 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_TRIP12MUX16TO31CFG_MUX16_S 0U +#define XBAR_TRIP12MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX17_S 2U +#define XBAR_TRIP12MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX18_S 4U +#define XBAR_TRIP12MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX19_S 6U +#define XBAR_TRIP12MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX20_S 8U +#define XBAR_TRIP12MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX21_S 10U +#define XBAR_TRIP12MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX22_S 12U +#define XBAR_TRIP12MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX23_S 14U +#define XBAR_TRIP12MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX24_S 16U +#define XBAR_TRIP12MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX25_S 18U +#define XBAR_TRIP12MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX26_S 20U +#define XBAR_TRIP12MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX27_S 22U +#define XBAR_TRIP12MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX28_S 24U +#define XBAR_TRIP12MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX29_S 26U +#define XBAR_TRIP12MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX30_S 28U +#define XBAR_TRIP12MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for TRIP12 of + // EPWM-XBAR +#define XBAR_TRIP12MUX16TO31CFG_MUX31_S 30U +#define XBAR_TRIP12MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for TRIP12 of + // EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP4MUXENABLE_MUX0 0x1U // mux0 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP4 of EPWM-XBAR +#define XBAR_TRIP4MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP4 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP5MUXENABLE_MUX0 0x1U // mux0 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP5 of EPWM-XBAR +#define XBAR_TRIP5MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP5 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP7MUXENABLE_MUX0 0x1U // mux0 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP7 of EPWM-XBAR +#define XBAR_TRIP7MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP7 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP8MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP8MUXENABLE_MUX0 0x1U // mux0 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP8 of EPWM-XBAR +#define XBAR_TRIP8MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP8 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP9MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP9MUXENABLE_MUX0 0x1U // mux0 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP9 of EPWM-XBAR +#define XBAR_TRIP9MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP9 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP10MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP10MUXENABLE_MUX0 0x1U // mux0 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP10 of EPWM-XBAR +#define XBAR_TRIP10MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP10 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP11MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP11MUXENABLE_MUX0 0x1U // mux0 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP11 of EPWM-XBAR +#define XBAR_TRIP11MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP11 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIP12MUXENABLE register +// +//************************************************************************************************* +#define XBAR_TRIP12MUXENABLE_MUX0 0x1U // mux0 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX1 0x2U // Mux1 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX2 0x4U // Mux2 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX3 0x8U // Mux3 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX4 0x10U // Mux4 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX5 0x20U // Mux5 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX6 0x40U // Mux6 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX7 0x80U // Mux7 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX8 0x100U // Mux8 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX9 0x200U // Mux9 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX10 0x400U // Mux10 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX11 0x800U // Mux11 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX12 0x1000U // Mux12 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX13 0x2000U // Mux13 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX14 0x4000U // Mux14 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX15 0x8000U // Mux15 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX16 0x10000U // Mux16 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX17 0x20000U // Mux17 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX18 0x40000U // Mux18 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX19 0x80000U // Mux19 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX20 0x100000U // Mux20 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX21 0x200000U // Mux21 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX22 0x400000U // Mux22 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX23 0x800000U // Mux23 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX24 0x1000000U // Mux24 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX25 0x2000000U // Mux25 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX26 0x4000000U // Mux26 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX27 0x8000000U // Mux27 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX28 0x10000000U // Mux28 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX29 0x20000000U // Mux29 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX30 0x40000000U // Mux30 to drive TRIP12 of EPWM-XBAR +#define XBAR_TRIP12MUXENABLE_MUX31 0x80000000U // Mux31 to drive TRIP12 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIPOUTINV register +// +//************************************************************************************************* +#define XBAR_TRIPOUTINV_TRIP4 0x1U // Selects polarity for TRIP4 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP5 0x2U // Selects polarity for TRIP5 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP7 0x4U // Selects polarity for TRIP7 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP8 0x8U // Selects polarity for TRIP8 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP9 0x10U // Selects polarity for TRIP9 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP10 0x20U // Selects polarity for TRIP10 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP11 0x40U // Selects polarity for TRIP11 of EPWM-XBAR +#define XBAR_TRIPOUTINV_TRIP12 0x80U // Selects polarity for TRIP12 of EPWM-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRIPLOCK register +// +//************************************************************************************************* +#define XBAR_TRIPLOCK_LOCK 0x1U // Locks the configuration for EPWM-XBAR +#define XBAR_TRIPLOCK_KEY_S 16U +#define XBAR_TRIPLOCK_KEY_M 0xFFFF0000U // Write protection KEY + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_eqep.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_eqep.h new file mode 100644 index 0000000..7dbb33a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_eqep.h @@ -0,0 +1,225 @@ +//########################################################################### +// +// FILE: hw_eqep.h +// +// TITLE: Definitions for the EQEP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_EQEP_H +#define HW_EQEP_H + +//************************************************************************************************* +// +// The following are defines for the EQEP register offsets +// +//************************************************************************************************* +#define EQEP_O_QPOSCNT 0x0U // Position Counter +#define EQEP_O_QPOSINIT 0x2U // Position Counter Init +#define EQEP_O_QPOSMAX 0x4U // Maximum Position Count +#define EQEP_O_QPOSCMP 0x6U // Position Compare +#define EQEP_O_QPOSILAT 0x8U // Index Position Latch +#define EQEP_O_QPOSSLAT 0xAU // Strobe Position Latch +#define EQEP_O_QPOSLAT 0xCU // Position Latch +#define EQEP_O_QUTMR 0xEU // QEP Unit Timer +#define EQEP_O_QUPRD 0x10U // QEP Unit Period +#define EQEP_O_QWDTMR 0x12U // QEP Watchdog Timer +#define EQEP_O_QWDPRD 0x13U // QEP Watchdog Period +#define EQEP_O_QDECCTL 0x14U // Quadrature Decoder Control +#define EQEP_O_QEPCTL 0x15U // QEP Control +#define EQEP_O_QCAPCTL 0x16U // Qaudrature Capture Control +#define EQEP_O_QPOSCTL 0x17U // Position Compare Control +#define EQEP_O_QEINT 0x18U // QEP Interrupt Control +#define EQEP_O_QFLG 0x19U // QEP Interrupt Flag +#define EQEP_O_QCLR 0x1AU // QEP Interrupt Clear +#define EQEP_O_QFRC 0x1BU // QEP Interrupt Force +#define EQEP_O_QEPSTS 0x1CU // QEP Status +#define EQEP_O_QCTMR 0x1DU // QEP Capture Timer +#define EQEP_O_QCPRD 0x1EU // QEP Capture Period +#define EQEP_O_QCTMRLAT 0x1FU // QEP Capture Latch +#define EQEP_O_QCPRDLAT 0x20U // QEP Capture Period Latch + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QDECCTL register +// +//************************************************************************************************* +#define EQEP_QDECCTL_QSP 0x20U // QEPS input polarity +#define EQEP_QDECCTL_QIP 0x40U // QEPI input polarity +#define EQEP_QDECCTL_QBP 0x80U // QEPB input polarity +#define EQEP_QDECCTL_QAP 0x100U // QEPA input polarity +#define EQEP_QDECCTL_IGATE 0x200U // Index pulse gating option +#define EQEP_QDECCTL_SWAP 0x400U // CLK/DIR Signal Source for Position Counter +#define EQEP_QDECCTL_XCR 0x800U // External Clock Rate +#define EQEP_QDECCTL_SPSEL 0x1000U // Sync output pin selection +#define EQEP_QDECCTL_SOEN 0x2000U // Sync output-enable +#define EQEP_QDECCTL_QSRC_S 14U +#define EQEP_QDECCTL_QSRC_M 0xC000U // Position-counter source selection + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEPCTL register +// +//************************************************************************************************* +#define EQEP_QEPCTL_WDE 0x1U // QEP watchdog enable +#define EQEP_QEPCTL_UTE 0x2U // QEP unit timer enable +#define EQEP_QEPCTL_QCLM 0x4U // QEP capture latch mode +#define EQEP_QEPCTL_QPEN 0x8U // Quadrature postotion counter enable +#define EQEP_QEPCTL_IEL_S 4U +#define EQEP_QEPCTL_IEL_M 0x30U // Index event latch +#define EQEP_QEPCTL_SEL 0x40U // Strobe event latch +#define EQEP_QEPCTL_SWI 0x80U // Software init position counter +#define EQEP_QEPCTL_IEI_S 8U +#define EQEP_QEPCTL_IEI_M 0x300U // Index event init of position count +#define EQEP_QEPCTL_SEI_S 10U +#define EQEP_QEPCTL_SEI_M 0xC00U // Strobe event init +#define EQEP_QEPCTL_PCRM_S 12U +#define EQEP_QEPCTL_PCRM_M 0x3000U // Postion counter reset +#define EQEP_QEPCTL_FREE_SOFT_S 14U +#define EQEP_QEPCTL_FREE_SOFT_M 0xC000U // Emulation mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QCAPCTL register +// +//************************************************************************************************* +#define EQEP_QCAPCTL_UPPS_S 0U +#define EQEP_QCAPCTL_UPPS_M 0xFU // Unit position event prescaler +#define EQEP_QCAPCTL_CCPS_S 4U +#define EQEP_QCAPCTL_CCPS_M 0x70U // eQEP capture timer clock prescaler +#define EQEP_QCAPCTL_CEN 0x8000U // Enable eQEP capture + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QPOSCTL register +// +//************************************************************************************************* +#define EQEP_QPOSCTL_PCSPW_S 0U +#define EQEP_QPOSCTL_PCSPW_M 0xFFFU // Position compare sync pulse width +#define EQEP_QPOSCTL_PCE 0x1000U // Position compare enable/disable +#define EQEP_QPOSCTL_PCPOL 0x2000U // Polarity of sync output +#define EQEP_QPOSCTL_PCLOAD 0x4000U // Position compare of shadow load +#define EQEP_QPOSCTL_PCSHDW 0x8000U // Position compare of shadow enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEINT register +// +//************************************************************************************************* +#define EQEP_QEINT_PCE 0x2U // Position counter error interrupt enable +#define EQEP_QEINT_QPE 0x4U // Quadrature phase error interrupt enable +#define EQEP_QEINT_QDC 0x8U // Quadrature direction change interrupt enable +#define EQEP_QEINT_WTO 0x10U // Watchdog time out interrupt enable +#define EQEP_QEINT_PCU 0x20U // Position counter underflow interrupt enable +#define EQEP_QEINT_PCO 0x40U // Position counter overflow interrupt enable +#define EQEP_QEINT_PCR 0x80U // Position-compare ready interrupt enable +#define EQEP_QEINT_PCM 0x100U // Position-compare match interrupt enable +#define EQEP_QEINT_SEL 0x200U // Strobe event latch interrupt enable +#define EQEP_QEINT_IEL 0x400U // Index event latch interrupt enable +#define EQEP_QEINT_UTO 0x800U // Unit time out interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QFLG register +// +//************************************************************************************************* +#define EQEP_QFLG_INT 0x1U // Global interrupt status flag +#define EQEP_QFLG_PCE 0x2U // Position counter error interrupt flag +#define EQEP_QFLG_PHE 0x4U // Quadrature phase error interrupt flag +#define EQEP_QFLG_QDC 0x8U // Quadrature direction change interrupt flag +#define EQEP_QFLG_WTO 0x10U // Watchdog timeout interrupt flag +#define EQEP_QFLG_PCU 0x20U // Position counter underflow interrupt flag +#define EQEP_QFLG_PCO 0x40U // Position counter overflow interrupt flag +#define EQEP_QFLG_PCR 0x80U // Position-compare ready interrupt flag +#define EQEP_QFLG_PCM 0x100U // eQEP compare match event interrupt flag +#define EQEP_QFLG_SEL 0x200U // Strobe event latch interrupt flag +#define EQEP_QFLG_IEL 0x400U // Index event latch interrupt flag +#define EQEP_QFLG_UTO 0x800U // Unit time out interrupt flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QCLR register +// +//************************************************************************************************* +#define EQEP_QCLR_INT 0x1U // Global interrupt clear flag +#define EQEP_QCLR_PCE 0x2U // Clear position counter error interrupt flag +#define EQEP_QCLR_PHE 0x4U // Clear quadrature phase error interrupt flag +#define EQEP_QCLR_QDC 0x8U // Clear quadrature direction change interrupt flag +#define EQEP_QCLR_WTO 0x10U // Clear watchdog timeout interrupt flag +#define EQEP_QCLR_PCU 0x20U // Clear position counter underflow interrupt flag +#define EQEP_QCLR_PCO 0x40U // Clear position counter overflow interrupt flag +#define EQEP_QCLR_PCR 0x80U // Clear position-compare ready interrupt flag +#define EQEP_QCLR_PCM 0x100U // Clear eQEP compare match event interrupt flag +#define EQEP_QCLR_SEL 0x200U // Clear strobe event latch interrupt flag +#define EQEP_QCLR_IEL 0x400U // Clear index event latch interrupt flag +#define EQEP_QCLR_UTO 0x800U // Clear unit time out interrupt flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QFRC register +// +//************************************************************************************************* +#define EQEP_QFRC_PCE 0x2U // Force position counter error interrupt +#define EQEP_QFRC_PHE 0x4U // Force quadrature phase error interrupt +#define EQEP_QFRC_QDC 0x8U // Force quadrature direction change interrupt +#define EQEP_QFRC_WTO 0x10U // Force watchdog time out interrupt +#define EQEP_QFRC_PCU 0x20U // Force position counter underflow interrupt +#define EQEP_QFRC_PCO 0x40U // Force position counter overflow interrupt +#define EQEP_QFRC_PCR 0x80U // Force position-compare ready interrupt +#define EQEP_QFRC_PCM 0x100U // Force position-compare match interrupt +#define EQEP_QFRC_SEL 0x200U // Force strobe event latch interrupt +#define EQEP_QFRC_IEL 0x400U // Force index event latch interrupt +#define EQEP_QFRC_UTO 0x800U // Force unit time out interrupt + +//************************************************************************************************* +// +// The following are defines for the bit fields in the QEPSTS register +// +//************************************************************************************************* +#define EQEP_QEPSTS_PCEF 0x1U // Position counter error flag. +#define EQEP_QEPSTS_FIMF 0x2U // First index marker flag +#define EQEP_QEPSTS_CDEF 0x4U // Capture direction error flag +#define EQEP_QEPSTS_COEF 0x8U // Capture overflow error flag +#define EQEP_QEPSTS_QDLF 0x10U // eQEP direction latch flag +#define EQEP_QEPSTS_QDF 0x20U // Quadrature direction flag +#define EQEP_QEPSTS_FIDF 0x40U // The first index marker +#define EQEP_QEPSTS_UPEVNT 0x80U // Unit position event flag + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_flash.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_flash.h new file mode 100644 index 0000000..73319f1 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_flash.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_flash.h +// +// TITLE: Definitions for the FLASH registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_FLASH_H +#define HW_FLASH_H + +//************************************************************************************************* +// +// The following are defines for the FLASH register offsets +// +//************************************************************************************************* +#define FLASH_O_FRDCNTL 0x0U // Flash Read Control Register +#define FLASH_O_FBAC 0x1EU // Flash Bank Access Control Register +#define FLASH_O_FBFALLBACK 0x20U // Flash Bank Fallback Power Register +#define FLASH_O_FBPRDY 0x22U // Flash Bank Pump Ready Register +#define FLASH_O_FPAC1 0x24U // Flash Pump Access Control Register 1 +#define FLASH_O_FMSTAT 0x2AU // Flash Module Status Register +#define FLASH_O_FRD_INTF_CTRL 0x180U // Flash Read Interface Control Register + +#define FLASH_O_ECC_ENABLE 0x0U // ECC Enable +#define FLASH_O_SINGLE_ERR_ADDR_LOW 0x2U // Single Error Address Low +#define FLASH_O_SINGLE_ERR_ADDR_HIGH 0x4U // Single Error Address High +#define FLASH_O_UNC_ERR_ADDR_LOW 0x6U // Uncorrectable Error Address Low +#define FLASH_O_UNC_ERR_ADDR_HIGH 0x8U // Uncorrectable Error Address High +#define FLASH_O_ERR_STATUS 0xAU // Error Status +#define FLASH_O_ERR_POS 0xCU // Error Position +#define FLASH_O_ERR_STATUS_CLR 0xEU // Error Status Clear +#define FLASH_O_ERR_CNT 0x10U // Error Control +#define FLASH_O_ERR_THRESHOLD 0x12U // Error Threshold +#define FLASH_O_ERR_INTFLG 0x14U // Error Interrupt Flag +#define FLASH_O_ERR_INTCLR 0x16U // Error Interrupt Flag Clear +#define FLASH_O_FDATAH_TEST 0x18U // Data High Test +#define FLASH_O_FDATAL_TEST 0x1AU // Data Low Test +#define FLASH_O_FADDR_TEST 0x1CU // ECC Test Address +#define FLASH_O_FECC_TEST 0x1EU // ECC Test Address +#define FLASH_O_FECC_CTRL 0x20U // ECC Control +#define FLASH_O_FOUTH_TEST 0x22U // Test Data Out High +#define FLASH_O_FOUTL_TEST 0x24U // Test Data Out Low +#define FLASH_O_FECC_STATUS 0x26U // ECC Status + +#define FLASH_O_PUMPREQUEST 0x0U // Flash programming semaphore PUMP request register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FRDCNTL register +// +//************************************************************************************************* +#define FLASH_FRDCNTL_RWAIT_S 8U +#define FLASH_FRDCNTL_RWAIT_M 0xF00U // Random Read Waitstate + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBAC register +// +//************************************************************************************************* +#define FLASH_FBAC_VREADST_S 0U +#define FLASH_FBAC_VREADST_M 0xFFU // VREAD Setup Time Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBFALLBACK register +// +//************************************************************************************************* +#define FLASH_FBFALLBACK_BNKPWR0_S 0U +#define FLASH_FBFALLBACK_BNKPWR0_M 0x3U // Bank Power Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FBPRDY register +// +//************************************************************************************************* +#define FLASH_FBPRDY_BANKRDY 0x1U // Flash Bank Active Power State +#define FLASH_FBPRDY_PUMPRDY 0x8000U // Flash Pump Active Power Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FPAC1 register +// +//************************************************************************************************* +#define FLASH_FPAC1_PMPPWR 0x1U // Charge Pump Fallback Power Mode +#define FLASH_FPAC1_PSLEEP_S 16U +#define FLASH_FPAC1_PSLEEP_M 0xFFF0000U // Pump Sleep Down Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FMSTAT register +// +//************************************************************************************************* +#define FLASH_FMSTAT_PSUSP 0x2U // Program Suspend. +#define FLASH_FMSTAT_ESUSP 0x4U // Erase Suspend. +#define FLASH_FMSTAT_VOLTSTAT 0x8U // Flash Pump Power Status +#define FLASH_FMSTAT_CSTAT 0x10U // Command Fail Status +#define FLASH_FMSTAT_INVDAT 0x20U // Invalid Data +#define FLASH_FMSTAT_PGM 0x40U // Program Operation Status +#define FLASH_FMSTAT_ERS 0x80U // Erase Operation Status +#define FLASH_FMSTAT_BUSY 0x100U // Busy Bit +#define FLASH_FMSTAT_EV 0x400U // Erase Verify Status +#define FLASH_FMSTAT_PGV 0x1000U // Programming Verify Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FRD_INTF_CTRL register +// +//************************************************************************************************* +#define FLASH_FRD_INTF_CTRL_PREFETCH_EN 0x1U // Prefetch Enable +#define FLASH_FRD_INTF_CTRL_DATA_CACHE_EN 0x2U // Data Cache Enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ECC_ENABLE register +// +//************************************************************************************************* +#define FLASH_ECC_ENABLE_ENABLE_S 0U +#define FLASH_ECC_ENABLE_ENABLE_M 0xFU // Enable ECC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_STATUS register +// +//************************************************************************************************* +#define FLASH_ERR_STATUS_FAIL_0_L 0x1U // Lower 64bits Single Bit Error Corrected Value 0 +#define FLASH_ERR_STATUS_FAIL_1_L 0x2U // Lower 64bits Single Bit Error Corrected Value 1 +#define FLASH_ERR_STATUS_UNC_ERR_L 0x4U // Lower 64 bits Uncorrectable error occurred +#define FLASH_ERR_STATUS_FAIL_0_H 0x10000U // Upper 64bits Single Bit Error Corrected Value 0 +#define FLASH_ERR_STATUS_FAIL_1_H 0x20000U // Upper 64bits Single Bit Error Corrected Value 1 +#define FLASH_ERR_STATUS_UNC_ERR_H 0x40000U // Upper 64 bits Uncorrectable error occurred + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_POS register +// +//************************************************************************************************* +#define FLASH_ERR_POS_ERR_POS_L_S 0U +#define FLASH_ERR_POS_ERR_POS_L_M 0x3FU // Bit Position of Single bit Error in lower 64 + // bits +#define FLASH_ERR_POS_ERR_TYPE_L 0x100U // Error Type in lower 64 bits +#define FLASH_ERR_POS_ERR_POS_H_S 16U +#define FLASH_ERR_POS_ERR_POS_H_M 0x3F0000U // Bit Position of Single bit Error in upper 64 + // bits +#define FLASH_ERR_POS_ERR_TYPE_H 0x1000000U // Error Type in upper 64 bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_STATUS_CLR register +// +//************************************************************************************************* +#define FLASH_ERR_STATUS_CLR_FAIL_0_L_CLR 0x1U // Lower 64bits Single Bit Error Corrected + // Value 0 Clear +#define FLASH_ERR_STATUS_CLR_FAIL_1_L_CLR 0x2U // Lower 64bits Single Bit Error Corrected + // Value 1 Clear +#define FLASH_ERR_STATUS_CLR_UNC_ERR_L_CLR 0x4U // Lower 64 bits Uncorrectable error + // occurred Clear +#define FLASH_ERR_STATUS_CLR_FAIL_0_H_CLR 0x10000U // Upper 64bits Single Bit Error Corrected + // Value 0 Clear +#define FLASH_ERR_STATUS_CLR_FAIL_1_H_CLR 0x20000U // Upper 64bits Single Bit Error Corrected + // Value 1 Clear +#define FLASH_ERR_STATUS_CLR_UNC_ERR_H_CLR 0x40000U // Upper 64 bits Uncorrectable error + // occurred Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_CNT register +// +//************************************************************************************************* +#define FLASH_ERR_CNT_ERR_CNT_S 0U +#define FLASH_ERR_CNT_ERR_CNT_M 0xFFFFU // Error counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_THRESHOLD register +// +//************************************************************************************************* +#define FLASH_ERR_THRESHOLD_ERR_THRESHOLD_S 0U +#define FLASH_ERR_THRESHOLD_ERR_THRESHOLD_M 0xFFFFU // Error Threshold + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_INTFLG register +// +//************************************************************************************************* +#define FLASH_ERR_INTFLG_SINGLE_ERR_INTFLG 0x1U // Single Error Interrupt Flag +#define FLASH_ERR_INTFLG_UNC_ERR_INTFLG 0x2U // Uncorrectable Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ERR_INTCLR register +// +//************************************************************************************************* +#define FLASH_ERR_INTCLR_SINGLE_ERR_INTCLR 0x1U // Single Error Interrupt Flag Clear +#define FLASH_ERR_INTCLR_UNC_ERR_INTCLR 0x2U // Uncorrectable Interrupt Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FADDR_TEST register +// +//************************************************************************************************* +#define FLASH_FADDR_TEST_ADDRL_S 3U +#define FLASH_FADDR_TEST_ADDRL_M 0xFFF8U // ECC Address Low +#define FLASH_FADDR_TEST_ADDRH_S 16U +#define FLASH_FADDR_TEST_ADDRH_M 0x3F0000U // ECC Address High + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_TEST register +// +//************************************************************************************************* +#define FLASH_FECC_TEST_ECC_S 0U +#define FLASH_FECC_TEST_ECC_M 0xFFU // ECC Control Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_CTRL register +// +//************************************************************************************************* +#define FLASH_FECC_CTRL_ECC_TEST_EN 0x1U // Enable ECC Test Logic +#define FLASH_FECC_CTRL_ECC_SELECT 0x2U // ECC Bit Select +#define FLASH_FECC_CTRL_DO_ECC_CALC 0x4U // Enable ECC Calculation + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FECC_STATUS register +// +//************************************************************************************************* +#define FLASH_FECC_STATUS_SINGLE_ERR 0x1U // Test Result is Single Bit Error +#define FLASH_FECC_STATUS_UNC_ERR 0x2U // Test Result is Uncorrectable Error +#define FLASH_FECC_STATUS_DATA_ERR_POS_S 2U +#define FLASH_FECC_STATUS_DATA_ERR_POS_M 0xFCU // Holds Bit Position of Error +#define FLASH_FECC_STATUS_ERR_TYPE 0x100U // Holds Bit Position of 8 Check Bits of Error + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PUMPREQUEST register +// +//************************************************************************************************* +#define FLASH_PUMPREQUEST_PUMP_OWNERSHIP_S 0U +#define FLASH_PUMPREQUEST_PUMP_OWNERSHIP_M 0x3U // Flash Pump Request Semaphore between + // CPU1 and CPU2 +#define FLASH_PUMPREQUEST_KEY_S 16U +#define FLASH_PUMPREQUEST_KEY_M 0xFFFF0000U // Key Qualifier for writes to this + // register + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_gpio.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_gpio.h new file mode 100644 index 0000000..0be426d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_gpio.h @@ -0,0 +1,4018 @@ +//########################################################################### +// +// FILE: hw_gpio.h +// +// TITLE: Definitions for the GPIO registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_GPIO_H +#define HW_GPIO_H + +//************************************************************************************************* +// +// The following are defines for the GPIO register offsets +// +//************************************************************************************************* +#define GPIO_O_GPACTRL 0x0U // GPIO A Qualification Sampling Period Control (GPIO0 to 31) +#define GPIO_O_GPAQSEL1 0x2U // GPIO A Qualifier Select 1 Register (GPIO0 to 15) +#define GPIO_O_GPAQSEL2 0x4U // GPIO A Qualifier Select 2 Register (GPIO16 to 31) +#define GPIO_O_GPAMUX1 0x6U // GPIO A Mux 1 Register (GPIO0 to 15) +#define GPIO_O_GPAMUX2 0x8U // GPIO A Mux 2 Register (GPIO16 to 31) +#define GPIO_O_GPADIR 0xAU // GPIO A Direction Register (GPIO0 to 31) +#define GPIO_O_GPAPUD 0xCU // GPIO A Pull Up Disable Register (GPIO0 to 31) +#define GPIO_O_GPAINV 0x10U // GPIO A Input Polarity Invert Registers (GPIO0 to 31) +#define GPIO_O_GPAODR 0x12U // GPIO A Open Drain Output Register (GPIO0 to GPIO31) +#define GPIO_O_GPAGMUX1 0x20U // GPIO A Peripheral Group Mux (GPIO0 to 15) +#define GPIO_O_GPAGMUX2 0x22U // GPIO A Peripheral Group Mux (GPIO16 to 31) +#define GPIO_O_GPACSEL1 0x28U // GPIO A Core Select Register (GPIO0 to 7) +#define GPIO_O_GPACSEL2 0x2AU // GPIO A Core Select Register (GPIO8 to 15) +#define GPIO_O_GPACSEL3 0x2CU // GPIO A Core Select Register (GPIO16 to 23) +#define GPIO_O_GPACSEL4 0x2EU // GPIO A Core Select Register (GPIO24 to 31) +#define GPIO_O_GPALOCK 0x3CU // GPIO A Lock Configuration Register (GPIO0 to 31) +#define GPIO_O_GPACR 0x3EU // GPIO A Lock Commit Register (GPIO0 to 31) +#define GPIO_O_GPBCTRL 0x40U // GPIO B Qualification Sampling Period Control (GPIO32 to 63) +#define GPIO_O_GPBQSEL1 0x42U // GPIO B Qualifier Select 1 Register (GPIO32 to 47) +#define GPIO_O_GPBQSEL2 0x44U // GPIO B Qualifier Select 2 Register (GPIO48 to 63) +#define GPIO_O_GPBMUX1 0x46U // GPIO B Mux 1 Register (GPIO32 to 47) +#define GPIO_O_GPBMUX2 0x48U // GPIO B Mux 2 Register (GPIO48 to 63) +#define GPIO_O_GPBDIR 0x4AU // GPIO B Direction Register (GPIO32 to 63) +#define GPIO_O_GPBPUD 0x4CU // GPIO B Pull Up Disable Register (GPIO32 to 63) +#define GPIO_O_GPBINV 0x50U // GPIO B Input Polarity Invert Registers (GPIO32 to 63) +#define GPIO_O_GPBODR 0x52U // GPIO B Open Drain Output Register (GPIO32 to GPIO63) +#define GPIO_O_GPBAMSEL 0x54U // GPIO B Analog Mode Select register (GPIO32 to GPIO63) +#define GPIO_O_GPBGMUX1 0x60U // GPIO B Peripheral Group Mux (GPIO32 to 47) +#define GPIO_O_GPBGMUX2 0x62U // GPIO B Peripheral Group Mux (GPIO48 to 63) +#define GPIO_O_GPBCSEL1 0x68U // GPIO B Core Select Register (GPIO32 to 39) +#define GPIO_O_GPBCSEL2 0x6AU // GPIO B Core Select Register (GPIO40 to 47) +#define GPIO_O_GPBCSEL3 0x6CU // GPIO B Core Select Register (GPIO48 to 55) +#define GPIO_O_GPBCSEL4 0x6EU // GPIO B Core Select Register (GPIO56 to 63) +#define GPIO_O_GPBLOCK 0x7CU // GPIO B Lock Configuration Register (GPIO32 to 63) +#define GPIO_O_GPBCR 0x7EU // GPIO B Lock Commit Register (GPIO32 to 63) +#define GPIO_O_GPCCTRL 0x80U // GPIO C Qualification Sampling Period Control (GPIO64 to 95) +#define GPIO_O_GPCQSEL1 0x82U // GPIO C Qualifier Select 1 Register (GPIO64 to 79) +#define GPIO_O_GPCQSEL2 0x84U // GPIO C Qualifier Select 2 Register (GPIO80 to 95) +#define GPIO_O_GPCMUX1 0x86U // GPIO C Mux 1 Register (GPIO64 to 79) +#define GPIO_O_GPCMUX2 0x88U // GPIO C Mux 2 Register (GPIO80 to 95) +#define GPIO_O_GPCDIR 0x8AU // GPIO C Direction Register (GPIO64 to 95) +#define GPIO_O_GPCPUD 0x8CU // GPIO C Pull Up Disable Register (GPIO64 to 95) +#define GPIO_O_GPCINV 0x90U // GPIO C Input Polarity Invert Registers (GPIO64 to 95) +#define GPIO_O_GPCODR 0x92U // GPIO C Open Drain Output Register (GPIO64 to GPIO95) +#define GPIO_O_GPCGMUX1 0xA0U // GPIO C Peripheral Group Mux (GPIO64 to 79) +#define GPIO_O_GPCGMUX2 0xA2U // GPIO C Peripheral Group Mux (GPIO80 to 95) +#define GPIO_O_GPCCSEL1 0xA8U // GPIO C Core Select Register (GPIO64 to 71) +#define GPIO_O_GPCCSEL2 0xAAU // GPIO C Core Select Register (GPIO72 to 79) +#define GPIO_O_GPCCSEL3 0xACU // GPIO C Core Select Register (GPIO80 to 87) +#define GPIO_O_GPCCSEL4 0xAEU // GPIO C Core Select Register (GPIO88 to 95) +#define GPIO_O_GPCLOCK 0xBCU // GPIO C Lock Configuration Register (GPIO64 to 95) +#define GPIO_O_GPCCR 0xBEU // GPIO C Lock Commit Register (GPIO64 to 95) +#define GPIO_O_GPDCTRL 0xC0U // GPIO D Qualification Sampling Period Control (GPIO96 to 127) +#define GPIO_O_GPDQSEL1 0xC2U // GPIO D Qualifier Select 1 Register (GPIO96 to 111) +#define GPIO_O_GPDQSEL2 0xC4U // GPIO D Qualifier Select 2 Register (GPIO112 to 127) +#define GPIO_O_GPDMUX1 0xC6U // GPIO D Mux 1 Register (GPIO96 to 111) +#define GPIO_O_GPDMUX2 0xC8U // GPIO D Mux 2 Register (GPIO112 to 127) +#define GPIO_O_GPDDIR 0xCAU // GPIO D Direction Register (GPIO96 to 127) +#define GPIO_O_GPDPUD 0xCCU // GPIO D Pull Up Disable Register (GPIO96 to 127) +#define GPIO_O_GPDINV 0xD0U // GPIO D Input Polarity Invert Registers (GPIO96 to 127) +#define GPIO_O_GPDODR 0xD2U // GPIO D Open Drain Output Register (GPIO96 to GPIO127) +#define GPIO_O_GPDGMUX1 0xE0U // GPIO D Peripheral Group Mux (GPIO96 to 111) +#define GPIO_O_GPDGMUX2 0xE2U // GPIO D Peripheral Group Mux (GPIO112 to 127) +#define GPIO_O_GPDCSEL1 0xE8U // GPIO D Core Select Register (GPIO96 to 103) +#define GPIO_O_GPDCSEL2 0xEAU // GPIO D Core Select Register (GPIO104 to 111) +#define GPIO_O_GPDCSEL3 0xECU // GPIO D Core Select Register (GPIO112 to 119) +#define GPIO_O_GPDCSEL4 0xEEU // GPIO D Core Select Register (GPIO120 to 127) +#define GPIO_O_GPDLOCK 0xFCU // GPIO D Lock Configuration Register (GPIO96 to 127) +#define GPIO_O_GPDCR 0xFEU // GPIO D Lock Commit Register (GPIO96 to 127) +#define GPIO_O_GPECTRL 0x100U // GPIO E Qualification Sampling Period Control (GPIO128 to 159) +#define GPIO_O_GPEQSEL1 0x102U // GPIO E Qualifier Select 1 Register (GPIO128 to 143) +#define GPIO_O_GPEQSEL2 0x104U // GPIO E Qualifier Select 2 Register (GPIO144 to 159) +#define GPIO_O_GPEMUX1 0x106U // GPIO E Mux 1 Register (GPIO128 to 143) +#define GPIO_O_GPEMUX2 0x108U // GPIO E Mux 2 Register (GPIO144 to 159) +#define GPIO_O_GPEDIR 0x10AU // GPIO E Direction Register (GPIO128 to 159) +#define GPIO_O_GPEPUD 0x10CU // GPIO E Pull Up Disable Register (GPIO128 to 159) +#define GPIO_O_GPEINV 0x110U // GPIO E Input Polarity Invert Registers (GPIO128 to 159) +#define GPIO_O_GPEODR 0x112U // GPIO E Open Drain Output Register (GPIO128 to GPIO159) +#define GPIO_O_GPEGMUX1 0x120U // GPIO E Peripheral Group Mux (GPIO128 to 143) +#define GPIO_O_GPEGMUX2 0x122U // GPIO E Peripheral Group Mux (GPIO144 to 159) +#define GPIO_O_GPECSEL1 0x128U // GPIO E Core Select Register (GPIO128 to 135) +#define GPIO_O_GPECSEL2 0x12AU // GPIO E Core Select Register (GPIO136 to 143) +#define GPIO_O_GPECSEL3 0x12CU // GPIO E Core Select Register (GPIO144 to 151) +#define GPIO_O_GPECSEL4 0x12EU // GPIO E Core Select Register (GPIO152 to 159) +#define GPIO_O_GPELOCK 0x13CU // GPIO E Lock Configuration Register (GPIO128 to 159) +#define GPIO_O_GPECR 0x13EU // GPIO E Lock Commit Register (GPIO128 to 159) +#define GPIO_O_GPFCTRL 0x140U // GPIO F Qualification Sampling Period Control (GPIO160 to 168) +#define GPIO_O_GPFQSEL1 0x142U // GPIO F Qualifier Select 1 Register (GPIO160 to 168) +#define GPIO_O_GPFMUX1 0x146U // GPIO F Mux 1 Register (GPIO160 to 168) +#define GPIO_O_GPFDIR 0x14AU // GPIO F Direction Register (GPIO160 to 168) +#define GPIO_O_GPFPUD 0x14CU // GPIO F Pull Up Disable Register (GPIO160 to 168) +#define GPIO_O_GPFINV 0x150U // GPIO F Input Polarity Invert Registers (GPIO160 to 168) +#define GPIO_O_GPFODR 0x152U // GPIO F Open Drain Output Register (GPIO160 to GPIO168) +#define GPIO_O_GPFGMUX1 0x160U // GPIO F Peripheral Group Mux (GPIO160 to 168) +#define GPIO_O_GPFCSEL1 0x168U // GPIO F Core Select Register (GPIO160 to 167) +#define GPIO_O_GPFCSEL2 0x16AU // GPIO F Core Select Register (GPIO168) +#define GPIO_O_GPFLOCK 0x17CU // GPIO F Lock Configuration Register (GPIO160 to 168) +#define GPIO_O_GPFCR 0x17EU // GPIO F Lock Commit Register (GPIO160 to 168) + +#define GPIO_O_GPADAT 0x0U // GPIO A Data Register (GPIO0 to 31) +#define GPIO_O_GPASET 0x2U // GPIO A Data Set Register (GPIO0 to 31) +#define GPIO_O_GPACLEAR 0x4U // GPIO A Data Clear Register (GPIO0 to 31) +#define GPIO_O_GPATOGGLE 0x6U // GPIO A Data Toggle Register (GPIO0 to 31) +#define GPIO_O_GPBDAT 0x8U // GPIO B Data Register (GPIO32 to 63) +#define GPIO_O_GPBSET 0xAU // GPIO B Data Set Register (GPIO32 to 63) +#define GPIO_O_GPBCLEAR 0xCU // GPIO B Data Clear Register (GPIO32 to 63) +#define GPIO_O_GPBTOGGLE 0xEU // GPIO B Data Toggle Register (GPIO32 to 63) +#define GPIO_O_GPCDAT 0x10U // GPIO C Data Register (GPIO64 to 95) +#define GPIO_O_GPCSET 0x12U // GPIO C Data Set Register (GPIO64 to 95) +#define GPIO_O_GPCCLEAR 0x14U // GPIO C Data Clear Register (GPIO64 to 95) +#define GPIO_O_GPCTOGGLE 0x16U // GPIO C Data Toggle Register (GPIO64 to 95) +#define GPIO_O_GPDDAT 0x18U // GPIO D Data Register (GPIO96 to 127) +#define GPIO_O_GPDSET 0x1AU // GPIO D Data Set Register (GPIO96 to 127) +#define GPIO_O_GPDCLEAR 0x1CU // GPIO D Data Clear Register (GPIO96 to 127) +#define GPIO_O_GPDTOGGLE 0x1EU // GPIO D Data Toggle Register (GPIO96 to 127) +#define GPIO_O_GPEDAT 0x20U // GPIO E Data Register (GPIO128 to 159) +#define GPIO_O_GPESET 0x22U // GPIO E Data Set Register (GPIO128 to 159) +#define GPIO_O_GPECLEAR 0x24U // GPIO E Data Clear Register (GPIO128 to 159) +#define GPIO_O_GPETOGGLE 0x26U // GPIO E Data Toggle Register (GPIO128 to 159) +#define GPIO_O_GPFDAT 0x28U // GPIO F Data Register (GPIO160 to 168) +#define GPIO_O_GPFSET 0x2AU // GPIO F Data Set Register (GPIO160 to 168) +#define GPIO_O_GPFCLEAR 0x2CU // GPIO F Data Clear Register (GPIO160 to 168) +#define GPIO_O_GPFTOGGLE 0x2EU // GPIO F Data Toggle Register (GPIO160 to 168) + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACTRL register +// +//************************************************************************************************* +#define GPIO_GPACTRL_QUALPRD0_S 0U +#define GPIO_GPACTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO0 to GPIO7 +#define GPIO_GPACTRL_QUALPRD1_S 8U +#define GPIO_GPACTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO8 to + // GPIO15 +#define GPIO_GPACTRL_QUALPRD2_S 16U +#define GPIO_GPACTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO16 to + // GPIO23 +#define GPIO_GPACTRL_QUALPRD3_S 24U +#define GPIO_GPACTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO24 to + // GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPAQSEL1_GPIO0_S 0U +#define GPIO_GPAQSEL1_GPIO0_M 0x3U // Select input qualification type for GPIO0 +#define GPIO_GPAQSEL1_GPIO1_S 2U +#define GPIO_GPAQSEL1_GPIO1_M 0xCU // Select input qualification type for GPIO1 +#define GPIO_GPAQSEL1_GPIO2_S 4U +#define GPIO_GPAQSEL1_GPIO2_M 0x30U // Select input qualification type for GPIO2 +#define GPIO_GPAQSEL1_GPIO3_S 6U +#define GPIO_GPAQSEL1_GPIO3_M 0xC0U // Select input qualification type for GPIO3 +#define GPIO_GPAQSEL1_GPIO4_S 8U +#define GPIO_GPAQSEL1_GPIO4_M 0x300U // Select input qualification type for GPIO4 +#define GPIO_GPAQSEL1_GPIO5_S 10U +#define GPIO_GPAQSEL1_GPIO5_M 0xC00U // Select input qualification type for GPIO5 +#define GPIO_GPAQSEL1_GPIO6_S 12U +#define GPIO_GPAQSEL1_GPIO6_M 0x3000U // Select input qualification type for GPIO6 +#define GPIO_GPAQSEL1_GPIO7_S 14U +#define GPIO_GPAQSEL1_GPIO7_M 0xC000U // Select input qualification type for GPIO7 +#define GPIO_GPAQSEL1_GPIO8_S 16U +#define GPIO_GPAQSEL1_GPIO8_M 0x30000U // Select input qualification type for GPIO8 +#define GPIO_GPAQSEL1_GPIO9_S 18U +#define GPIO_GPAQSEL1_GPIO9_M 0xC0000U // Select input qualification type for GPIO9 +#define GPIO_GPAQSEL1_GPIO10_S 20U +#define GPIO_GPAQSEL1_GPIO10_M 0x300000U // Select input qualification type for GPIO10 +#define GPIO_GPAQSEL1_GPIO11_S 22U +#define GPIO_GPAQSEL1_GPIO11_M 0xC00000U // Select input qualification type for GPIO11 +#define GPIO_GPAQSEL1_GPIO12_S 24U +#define GPIO_GPAQSEL1_GPIO12_M 0x3000000U // Select input qualification type for GPIO12 +#define GPIO_GPAQSEL1_GPIO13_S 26U +#define GPIO_GPAQSEL1_GPIO13_M 0xC000000U // Select input qualification type for GPIO13 +#define GPIO_GPAQSEL1_GPIO14_S 28U +#define GPIO_GPAQSEL1_GPIO14_M 0x30000000U // Select input qualification type for GPIO14 +#define GPIO_GPAQSEL1_GPIO15_S 30U +#define GPIO_GPAQSEL1_GPIO15_M 0xC0000000U // Select input qualification type for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPAQSEL2_GPIO16_S 0U +#define GPIO_GPAQSEL2_GPIO16_M 0x3U // Select input qualification type for GPIO16 +#define GPIO_GPAQSEL2_GPIO17_S 2U +#define GPIO_GPAQSEL2_GPIO17_M 0xCU // Select input qualification type for GPIO17 +#define GPIO_GPAQSEL2_GPIO18_S 4U +#define GPIO_GPAQSEL2_GPIO18_M 0x30U // Select input qualification type for GPIO18 +#define GPIO_GPAQSEL2_GPIO19_S 6U +#define GPIO_GPAQSEL2_GPIO19_M 0xC0U // Select input qualification type for GPIO19 +#define GPIO_GPAQSEL2_GPIO20_S 8U +#define GPIO_GPAQSEL2_GPIO20_M 0x300U // Select input qualification type for GPIO20 +#define GPIO_GPAQSEL2_GPIO21_S 10U +#define GPIO_GPAQSEL2_GPIO21_M 0xC00U // Select input qualification type for GPIO21 +#define GPIO_GPAQSEL2_GPIO22_S 12U +#define GPIO_GPAQSEL2_GPIO22_M 0x3000U // Select input qualification type for GPIO22 +#define GPIO_GPAQSEL2_GPIO23_S 14U +#define GPIO_GPAQSEL2_GPIO23_M 0xC000U // Select input qualification type for GPIO23 +#define GPIO_GPAQSEL2_GPIO24_S 16U +#define GPIO_GPAQSEL2_GPIO24_M 0x30000U // Select input qualification type for GPIO24 +#define GPIO_GPAQSEL2_GPIO25_S 18U +#define GPIO_GPAQSEL2_GPIO25_M 0xC0000U // Select input qualification type for GPIO25 +#define GPIO_GPAQSEL2_GPIO26_S 20U +#define GPIO_GPAQSEL2_GPIO26_M 0x300000U // Select input qualification type for GPIO26 +#define GPIO_GPAQSEL2_GPIO27_S 22U +#define GPIO_GPAQSEL2_GPIO27_M 0xC00000U // Select input qualification type for GPIO27 +#define GPIO_GPAQSEL2_GPIO28_S 24U +#define GPIO_GPAQSEL2_GPIO28_M 0x3000000U // Select input qualification type for GPIO28 +#define GPIO_GPAQSEL2_GPIO29_S 26U +#define GPIO_GPAQSEL2_GPIO29_M 0xC000000U // Select input qualification type for GPIO29 +#define GPIO_GPAQSEL2_GPIO30_S 28U +#define GPIO_GPAQSEL2_GPIO30_M 0x30000000U // Select input qualification type for GPIO30 +#define GPIO_GPAQSEL2_GPIO31_S 30U +#define GPIO_GPAQSEL2_GPIO31_M 0xC0000000U // Select input qualification type for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAMUX1 register +// +//************************************************************************************************* +#define GPIO_GPAMUX1_GPIO0_S 0U +#define GPIO_GPAMUX1_GPIO0_M 0x3U // Defines pin-muxing selection for GPIO0 +#define GPIO_GPAMUX1_GPIO1_S 2U +#define GPIO_GPAMUX1_GPIO1_M 0xCU // Defines pin-muxing selection for GPIO1 +#define GPIO_GPAMUX1_GPIO2_S 4U +#define GPIO_GPAMUX1_GPIO2_M 0x30U // Defines pin-muxing selection for GPIO2 +#define GPIO_GPAMUX1_GPIO3_S 6U +#define GPIO_GPAMUX1_GPIO3_M 0xC0U // Defines pin-muxing selection for GPIO3 +#define GPIO_GPAMUX1_GPIO4_S 8U +#define GPIO_GPAMUX1_GPIO4_M 0x300U // Defines pin-muxing selection for GPIO4 +#define GPIO_GPAMUX1_GPIO5_S 10U +#define GPIO_GPAMUX1_GPIO5_M 0xC00U // Defines pin-muxing selection for GPIO5 +#define GPIO_GPAMUX1_GPIO6_S 12U +#define GPIO_GPAMUX1_GPIO6_M 0x3000U // Defines pin-muxing selection for GPIO6 +#define GPIO_GPAMUX1_GPIO7_S 14U +#define GPIO_GPAMUX1_GPIO7_M 0xC000U // Defines pin-muxing selection for GPIO7 +#define GPIO_GPAMUX1_GPIO8_S 16U +#define GPIO_GPAMUX1_GPIO8_M 0x30000U // Defines pin-muxing selection for GPIO8 +#define GPIO_GPAMUX1_GPIO9_S 18U +#define GPIO_GPAMUX1_GPIO9_M 0xC0000U // Defines pin-muxing selection for GPIO9 +#define GPIO_GPAMUX1_GPIO10_S 20U +#define GPIO_GPAMUX1_GPIO10_M 0x300000U // Defines pin-muxing selection for GPIO10 +#define GPIO_GPAMUX1_GPIO11_S 22U +#define GPIO_GPAMUX1_GPIO11_M 0xC00000U // Defines pin-muxing selection for GPIO11 +#define GPIO_GPAMUX1_GPIO12_S 24U +#define GPIO_GPAMUX1_GPIO12_M 0x3000000U // Defines pin-muxing selection for GPIO12 +#define GPIO_GPAMUX1_GPIO13_S 26U +#define GPIO_GPAMUX1_GPIO13_M 0xC000000U // Defines pin-muxing selection for GPIO13 +#define GPIO_GPAMUX1_GPIO14_S 28U +#define GPIO_GPAMUX1_GPIO14_M 0x30000000U // Defines pin-muxing selection for GPIO14 +#define GPIO_GPAMUX1_GPIO15_S 30U +#define GPIO_GPAMUX1_GPIO15_M 0xC0000000U // Defines pin-muxing selection for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAMUX2 register +// +//************************************************************************************************* +#define GPIO_GPAMUX2_GPIO16_S 0U +#define GPIO_GPAMUX2_GPIO16_M 0x3U // Defines pin-muxing selection for GPIO16 +#define GPIO_GPAMUX2_GPIO17_S 2U +#define GPIO_GPAMUX2_GPIO17_M 0xCU // Defines pin-muxing selection for GPIO17 +#define GPIO_GPAMUX2_GPIO18_S 4U +#define GPIO_GPAMUX2_GPIO18_M 0x30U // Defines pin-muxing selection for GPIO18 +#define GPIO_GPAMUX2_GPIO19_S 6U +#define GPIO_GPAMUX2_GPIO19_M 0xC0U // Defines pin-muxing selection for GPIO19 +#define GPIO_GPAMUX2_GPIO20_S 8U +#define GPIO_GPAMUX2_GPIO20_M 0x300U // Defines pin-muxing selection for GPIO20 +#define GPIO_GPAMUX2_GPIO21_S 10U +#define GPIO_GPAMUX2_GPIO21_M 0xC00U // Defines pin-muxing selection for GPIO21 +#define GPIO_GPAMUX2_GPIO22_S 12U +#define GPIO_GPAMUX2_GPIO22_M 0x3000U // Defines pin-muxing selection for GPIO22 +#define GPIO_GPAMUX2_GPIO23_S 14U +#define GPIO_GPAMUX2_GPIO23_M 0xC000U // Defines pin-muxing selection for GPIO23 +#define GPIO_GPAMUX2_GPIO24_S 16U +#define GPIO_GPAMUX2_GPIO24_M 0x30000U // Defines pin-muxing selection for GPIO24 +#define GPIO_GPAMUX2_GPIO25_S 18U +#define GPIO_GPAMUX2_GPIO25_M 0xC0000U // Defines pin-muxing selection for GPIO25 +#define GPIO_GPAMUX2_GPIO26_S 20U +#define GPIO_GPAMUX2_GPIO26_M 0x300000U // Defines pin-muxing selection for GPIO26 +#define GPIO_GPAMUX2_GPIO27_S 22U +#define GPIO_GPAMUX2_GPIO27_M 0xC00000U // Defines pin-muxing selection for GPIO27 +#define GPIO_GPAMUX2_GPIO28_S 24U +#define GPIO_GPAMUX2_GPIO28_M 0x3000000U // Defines pin-muxing selection for GPIO28 +#define GPIO_GPAMUX2_GPIO29_S 26U +#define GPIO_GPAMUX2_GPIO29_M 0xC000000U // Defines pin-muxing selection for GPIO29 +#define GPIO_GPAMUX2_GPIO30_S 28U +#define GPIO_GPAMUX2_GPIO30_M 0x30000000U // Defines pin-muxing selection for GPIO30 +#define GPIO_GPAMUX2_GPIO31_S 30U +#define GPIO_GPAMUX2_GPIO31_M 0xC0000000U // Defines pin-muxing selection for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPADIR register +// +//************************************************************************************************* +#define GPIO_GPADIR_GPIO0 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO1 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO2 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO3 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO4 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO5 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO6 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO7 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO8 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO9 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO10 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO11 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO12 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO13 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO14 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO15 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO16 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO17 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO18 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO19 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO20 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO21 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO22 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO23 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO24 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO25 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO26 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO27 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO28 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO29 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO30 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPADIR_GPIO31 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAPUD register +// +//************************************************************************************************* +#define GPIO_GPAPUD_GPIO0 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO1 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO2 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO3 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO4 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO5 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO6 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO7 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO8 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO9 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO10 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO11 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO12 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO13 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO14 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO15 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO16 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO17 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO18 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO19 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO20 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO21 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO22 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO23 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO24 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO25 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO26 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO27 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO28 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO29 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO30 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPAPUD_GPIO31 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAINV register +// +//************************************************************************************************* +#define GPIO_GPAINV_GPIO0 0x1U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO1 0x2U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO2 0x4U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO3 0x8U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO4 0x10U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO5 0x20U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO6 0x40U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO7 0x80U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO8 0x100U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO9 0x200U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO10 0x400U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO11 0x800U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO12 0x1000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO13 0x2000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO14 0x4000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO15 0x8000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO16 0x10000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO17 0x20000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO18 0x40000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO19 0x80000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO20 0x100000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO21 0x200000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO22 0x400000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO23 0x800000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO24 0x1000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO25 0x2000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO26 0x4000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO27 0x8000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO28 0x10000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO29 0x20000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO30 0x40000000U // Input inversion control for this pin +#define GPIO_GPAINV_GPIO31 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAODR register +// +//************************************************************************************************* +#define GPIO_GPAODR_GPIO0 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO1 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO2 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO3 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO4 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO5 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO6 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO7 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO8 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO9 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO10 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO11 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO12 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO13 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO14 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO15 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO16 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO17 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO18 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO19 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO20 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO21 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO22 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO23 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO24 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO25 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO26 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO27 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO28 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO29 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO30 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPAODR_GPIO31 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPAGMUX1_GPIO0_S 0U +#define GPIO_GPAGMUX1_GPIO0_M 0x3U // Defines pin-muxing selection for GPIO0 +#define GPIO_GPAGMUX1_GPIO1_S 2U +#define GPIO_GPAGMUX1_GPIO1_M 0xCU // Defines pin-muxing selection for GPIO1 +#define GPIO_GPAGMUX1_GPIO2_S 4U +#define GPIO_GPAGMUX1_GPIO2_M 0x30U // Defines pin-muxing selection for GPIO2 +#define GPIO_GPAGMUX1_GPIO3_S 6U +#define GPIO_GPAGMUX1_GPIO3_M 0xC0U // Defines pin-muxing selection for GPIO3 +#define GPIO_GPAGMUX1_GPIO4_S 8U +#define GPIO_GPAGMUX1_GPIO4_M 0x300U // Defines pin-muxing selection for GPIO4 +#define GPIO_GPAGMUX1_GPIO5_S 10U +#define GPIO_GPAGMUX1_GPIO5_M 0xC00U // Defines pin-muxing selection for GPIO5 +#define GPIO_GPAGMUX1_GPIO6_S 12U +#define GPIO_GPAGMUX1_GPIO6_M 0x3000U // Defines pin-muxing selection for GPIO6 +#define GPIO_GPAGMUX1_GPIO7_S 14U +#define GPIO_GPAGMUX1_GPIO7_M 0xC000U // Defines pin-muxing selection for GPIO7 +#define GPIO_GPAGMUX1_GPIO8_S 16U +#define GPIO_GPAGMUX1_GPIO8_M 0x30000U // Defines pin-muxing selection for GPIO8 +#define GPIO_GPAGMUX1_GPIO9_S 18U +#define GPIO_GPAGMUX1_GPIO9_M 0xC0000U // Defines pin-muxing selection for GPIO9 +#define GPIO_GPAGMUX1_GPIO10_S 20U +#define GPIO_GPAGMUX1_GPIO10_M 0x300000U // Defines pin-muxing selection for GPIO10 +#define GPIO_GPAGMUX1_GPIO11_S 22U +#define GPIO_GPAGMUX1_GPIO11_M 0xC00000U // Defines pin-muxing selection for GPIO11 +#define GPIO_GPAGMUX1_GPIO12_S 24U +#define GPIO_GPAGMUX1_GPIO12_M 0x3000000U // Defines pin-muxing selection for GPIO12 +#define GPIO_GPAGMUX1_GPIO13_S 26U +#define GPIO_GPAGMUX1_GPIO13_M 0xC000000U // Defines pin-muxing selection for GPIO13 +#define GPIO_GPAGMUX1_GPIO14_S 28U +#define GPIO_GPAGMUX1_GPIO14_M 0x30000000U // Defines pin-muxing selection for GPIO14 +#define GPIO_GPAGMUX1_GPIO15_S 30U +#define GPIO_GPAGMUX1_GPIO15_M 0xC0000000U // Defines pin-muxing selection for GPIO15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPAGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPAGMUX2_GPIO16_S 0U +#define GPIO_GPAGMUX2_GPIO16_M 0x3U // Defines pin-muxing selection for GPIO16 +#define GPIO_GPAGMUX2_GPIO17_S 2U +#define GPIO_GPAGMUX2_GPIO17_M 0xCU // Defines pin-muxing selection for GPIO17 +#define GPIO_GPAGMUX2_GPIO18_S 4U +#define GPIO_GPAGMUX2_GPIO18_M 0x30U // Defines pin-muxing selection for GPIO18 +#define GPIO_GPAGMUX2_GPIO19_S 6U +#define GPIO_GPAGMUX2_GPIO19_M 0xC0U // Defines pin-muxing selection for GPIO19 +#define GPIO_GPAGMUX2_GPIO20_S 8U +#define GPIO_GPAGMUX2_GPIO20_M 0x300U // Defines pin-muxing selection for GPIO20 +#define GPIO_GPAGMUX2_GPIO21_S 10U +#define GPIO_GPAGMUX2_GPIO21_M 0xC00U // Defines pin-muxing selection for GPIO21 +#define GPIO_GPAGMUX2_GPIO22_S 12U +#define GPIO_GPAGMUX2_GPIO22_M 0x3000U // Defines pin-muxing selection for GPIO22 +#define GPIO_GPAGMUX2_GPIO23_S 14U +#define GPIO_GPAGMUX2_GPIO23_M 0xC000U // Defines pin-muxing selection for GPIO23 +#define GPIO_GPAGMUX2_GPIO24_S 16U +#define GPIO_GPAGMUX2_GPIO24_M 0x30000U // Defines pin-muxing selection for GPIO24 +#define GPIO_GPAGMUX2_GPIO25_S 18U +#define GPIO_GPAGMUX2_GPIO25_M 0xC0000U // Defines pin-muxing selection for GPIO25 +#define GPIO_GPAGMUX2_GPIO26_S 20U +#define GPIO_GPAGMUX2_GPIO26_M 0x300000U // Defines pin-muxing selection for GPIO26 +#define GPIO_GPAGMUX2_GPIO27_S 22U +#define GPIO_GPAGMUX2_GPIO27_M 0xC00000U // Defines pin-muxing selection for GPIO27 +#define GPIO_GPAGMUX2_GPIO28_S 24U +#define GPIO_GPAGMUX2_GPIO28_M 0x3000000U // Defines pin-muxing selection for GPIO28 +#define GPIO_GPAGMUX2_GPIO29_S 26U +#define GPIO_GPAGMUX2_GPIO29_M 0xC000000U // Defines pin-muxing selection for GPIO29 +#define GPIO_GPAGMUX2_GPIO30_S 28U +#define GPIO_GPAGMUX2_GPIO30_M 0x30000000U // Defines pin-muxing selection for GPIO30 +#define GPIO_GPAGMUX2_GPIO31_S 30U +#define GPIO_GPAGMUX2_GPIO31_M 0xC0000000U // Defines pin-muxing selection for GPIO31 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL1 register +// +//************************************************************************************************* +#define GPIO_GPACSEL1_GPIO0_S 0U +#define GPIO_GPACSEL1_GPIO0_M 0xFU // GPIO0 Master CPU Select +#define GPIO_GPACSEL1_GPIO1_S 4U +#define GPIO_GPACSEL1_GPIO1_M 0xF0U // GPIO1 Master CPU Select +#define GPIO_GPACSEL1_GPIO2_S 8U +#define GPIO_GPACSEL1_GPIO2_M 0xF00U // GPIO2 Master CPU Select +#define GPIO_GPACSEL1_GPIO3_S 12U +#define GPIO_GPACSEL1_GPIO3_M 0xF000U // GPIO3 Master CPU Select +#define GPIO_GPACSEL1_GPIO4_S 16U +#define GPIO_GPACSEL1_GPIO4_M 0xF0000U // GPIO4 Master CPU Select +#define GPIO_GPACSEL1_GPIO5_S 20U +#define GPIO_GPACSEL1_GPIO5_M 0xF00000U // GPIO5 Master CPU Select +#define GPIO_GPACSEL1_GPIO6_S 24U +#define GPIO_GPACSEL1_GPIO6_M 0xF000000U // GPIO6 Master CPU Select +#define GPIO_GPACSEL1_GPIO7_S 28U +#define GPIO_GPACSEL1_GPIO7_M 0xF0000000U // GPIO7 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL2 register +// +//************************************************************************************************* +#define GPIO_GPACSEL2_GPIO8_S 0U +#define GPIO_GPACSEL2_GPIO8_M 0xFU // GPIO8 Master CPU Select +#define GPIO_GPACSEL2_GPIO9_S 4U +#define GPIO_GPACSEL2_GPIO9_M 0xF0U // GPIO9 Master CPU Select +#define GPIO_GPACSEL2_GPIO10_S 8U +#define GPIO_GPACSEL2_GPIO10_M 0xF00U // GPIO10 Master CPU Select +#define GPIO_GPACSEL2_GPIO11_S 12U +#define GPIO_GPACSEL2_GPIO11_M 0xF000U // GPIO11 Master CPU Select +#define GPIO_GPACSEL2_GPIO12_S 16U +#define GPIO_GPACSEL2_GPIO12_M 0xF0000U // GPIO12 Master CPU Select +#define GPIO_GPACSEL2_GPIO13_S 20U +#define GPIO_GPACSEL2_GPIO13_M 0xF00000U // GPIO13 Master CPU Select +#define GPIO_GPACSEL2_GPIO14_S 24U +#define GPIO_GPACSEL2_GPIO14_M 0xF000000U // GPIO14 Master CPU Select +#define GPIO_GPACSEL2_GPIO15_S 28U +#define GPIO_GPACSEL2_GPIO15_M 0xF0000000U // GPIO15 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL3 register +// +//************************************************************************************************* +#define GPIO_GPACSEL3_GPIO16_S 0U +#define GPIO_GPACSEL3_GPIO16_M 0xFU // GPIO16 Master CPU Select +#define GPIO_GPACSEL3_GPIO17_S 4U +#define GPIO_GPACSEL3_GPIO17_M 0xF0U // GPIO17 Master CPU Select +#define GPIO_GPACSEL3_GPIO18_S 8U +#define GPIO_GPACSEL3_GPIO18_M 0xF00U // GPIO18 Master CPU Select +#define GPIO_GPACSEL3_GPIO19_S 12U +#define GPIO_GPACSEL3_GPIO19_M 0xF000U // GPIO19 Master CPU Select +#define GPIO_GPACSEL3_GPIO20_S 16U +#define GPIO_GPACSEL3_GPIO20_M 0xF0000U // GPIO20 Master CPU Select +#define GPIO_GPACSEL3_GPIO21_S 20U +#define GPIO_GPACSEL3_GPIO21_M 0xF00000U // GPIO21 Master CPU Select +#define GPIO_GPACSEL3_GPIO22_S 24U +#define GPIO_GPACSEL3_GPIO22_M 0xF000000U // GPIO22 Master CPU Select +#define GPIO_GPACSEL3_GPIO23_S 28U +#define GPIO_GPACSEL3_GPIO23_M 0xF0000000U // GPIO23 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACSEL4 register +// +//************************************************************************************************* +#define GPIO_GPACSEL4_GPIO24_S 0U +#define GPIO_GPACSEL4_GPIO24_M 0xFU // GPIO24 Master CPU Select +#define GPIO_GPACSEL4_GPIO25_S 4U +#define GPIO_GPACSEL4_GPIO25_M 0xF0U // GPIO25 Master CPU Select +#define GPIO_GPACSEL4_GPIO26_S 8U +#define GPIO_GPACSEL4_GPIO26_M 0xF00U // GPIO26 Master CPU Select +#define GPIO_GPACSEL4_GPIO27_S 12U +#define GPIO_GPACSEL4_GPIO27_M 0xF000U // GPIO27 Master CPU Select +#define GPIO_GPACSEL4_GPIO28_S 16U +#define GPIO_GPACSEL4_GPIO28_M 0xF0000U // GPIO28 Master CPU Select +#define GPIO_GPACSEL4_GPIO29_S 20U +#define GPIO_GPACSEL4_GPIO29_M 0xF00000U // GPIO29 Master CPU Select +#define GPIO_GPACSEL4_GPIO30_S 24U +#define GPIO_GPACSEL4_GPIO30_M 0xF000000U // GPIO30 Master CPU Select +#define GPIO_GPACSEL4_GPIO31_S 28U +#define GPIO_GPACSEL4_GPIO31_M 0xF0000000U // GPIO31 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPALOCK register +// +//************************************************************************************************* +#define GPIO_GPALOCK_GPIO0 0x1U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO1 0x2U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO2 0x4U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO3 0x8U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO4 0x10U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO5 0x20U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO6 0x40U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO7 0x80U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO8 0x100U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO9 0x200U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO10 0x400U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO11 0x800U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO12 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO13 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO14 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO15 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO16 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO17 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO18 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO19 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO20 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO21 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO22 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO23 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO24 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO25 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO26 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO27 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO28 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO29 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO30 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPALOCK_GPIO31 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACR register +// +//************************************************************************************************* +#define GPIO_GPACR_GPIO0 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO1 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO2 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO3 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO4 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO5 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO6 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO7 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO8 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO9 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO10 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO11 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO12 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO13 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO14 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO15 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO16 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO17 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO18 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO19 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO20 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO21 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO22 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO23 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO24 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO25 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO26 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO27 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO28 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO29 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO30 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPACR_GPIO31 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCTRL register +// +//************************************************************************************************* +#define GPIO_GPBCTRL_QUALPRD0_S 0U +#define GPIO_GPBCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO32 to + // GPIO39 +#define GPIO_GPBCTRL_QUALPRD1_S 8U +#define GPIO_GPBCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO40 to + // GPIO47 +#define GPIO_GPBCTRL_QUALPRD2_S 16U +#define GPIO_GPBCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO48 to + // GPIO55 +#define GPIO_GPBCTRL_QUALPRD3_S 24U +#define GPIO_GPBCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO56 to + // GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPBQSEL1_GPIO32_S 0U +#define GPIO_GPBQSEL1_GPIO32_M 0x3U // Select input qualification type for GPIO32 +#define GPIO_GPBQSEL1_GPIO33_S 2U +#define GPIO_GPBQSEL1_GPIO33_M 0xCU // Select input qualification type for GPIO33 +#define GPIO_GPBQSEL1_GPIO34_S 4U +#define GPIO_GPBQSEL1_GPIO34_M 0x30U // Select input qualification type for GPIO34 +#define GPIO_GPBQSEL1_GPIO35_S 6U +#define GPIO_GPBQSEL1_GPIO35_M 0xC0U // Select input qualification type for GPIO35 +#define GPIO_GPBQSEL1_GPIO36_S 8U +#define GPIO_GPBQSEL1_GPIO36_M 0x300U // Select input qualification type for GPIO36 +#define GPIO_GPBQSEL1_GPIO37_S 10U +#define GPIO_GPBQSEL1_GPIO37_M 0xC00U // Select input qualification type for GPIO37 +#define GPIO_GPBQSEL1_GPIO38_S 12U +#define GPIO_GPBQSEL1_GPIO38_M 0x3000U // Select input qualification type for GPIO38 +#define GPIO_GPBQSEL1_GPIO39_S 14U +#define GPIO_GPBQSEL1_GPIO39_M 0xC000U // Select input qualification type for GPIO39 +#define GPIO_GPBQSEL1_GPIO40_S 16U +#define GPIO_GPBQSEL1_GPIO40_M 0x30000U // Select input qualification type for GPIO40 +#define GPIO_GPBQSEL1_GPIO41_S 18U +#define GPIO_GPBQSEL1_GPIO41_M 0xC0000U // Select input qualification type for GPIO41 +#define GPIO_GPBQSEL1_GPIO42_S 20U +#define GPIO_GPBQSEL1_GPIO42_M 0x300000U // Select input qualification type for GPIO42 +#define GPIO_GPBQSEL1_GPIO43_S 22U +#define GPIO_GPBQSEL1_GPIO43_M 0xC00000U // Select input qualification type for GPIO43 +#define GPIO_GPBQSEL1_GPIO44_S 24U +#define GPIO_GPBQSEL1_GPIO44_M 0x3000000U // Select input qualification type for GPIO44 +#define GPIO_GPBQSEL1_GPIO45_S 26U +#define GPIO_GPBQSEL1_GPIO45_M 0xC000000U // Select input qualification type for GPIO45 +#define GPIO_GPBQSEL1_GPIO46_S 28U +#define GPIO_GPBQSEL1_GPIO46_M 0x30000000U // Select input qualification type for GPIO46 +#define GPIO_GPBQSEL1_GPIO47_S 30U +#define GPIO_GPBQSEL1_GPIO47_M 0xC0000000U // Select input qualification type for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPBQSEL2_GPIO48_S 0U +#define GPIO_GPBQSEL2_GPIO48_M 0x3U // Select input qualification type for GPIO48 +#define GPIO_GPBQSEL2_GPIO49_S 2U +#define GPIO_GPBQSEL2_GPIO49_M 0xCU // Select input qualification type for GPIO49 +#define GPIO_GPBQSEL2_GPIO50_S 4U +#define GPIO_GPBQSEL2_GPIO50_M 0x30U // Select input qualification type for GPIO50 +#define GPIO_GPBQSEL2_GPIO51_S 6U +#define GPIO_GPBQSEL2_GPIO51_M 0xC0U // Select input qualification type for GPIO51 +#define GPIO_GPBQSEL2_GPIO52_S 8U +#define GPIO_GPBQSEL2_GPIO52_M 0x300U // Select input qualification type for GPIO52 +#define GPIO_GPBQSEL2_GPIO53_S 10U +#define GPIO_GPBQSEL2_GPIO53_M 0xC00U // Select input qualification type for GPIO53 +#define GPIO_GPBQSEL2_GPIO54_S 12U +#define GPIO_GPBQSEL2_GPIO54_M 0x3000U // Select input qualification type for GPIO54 +#define GPIO_GPBQSEL2_GPIO55_S 14U +#define GPIO_GPBQSEL2_GPIO55_M 0xC000U // Select input qualification type for GPIO55 +#define GPIO_GPBQSEL2_GPIO56_S 16U +#define GPIO_GPBQSEL2_GPIO56_M 0x30000U // Select input qualification type for GPIO56 +#define GPIO_GPBQSEL2_GPIO57_S 18U +#define GPIO_GPBQSEL2_GPIO57_M 0xC0000U // Select input qualification type for GPIO57 +#define GPIO_GPBQSEL2_GPIO58_S 20U +#define GPIO_GPBQSEL2_GPIO58_M 0x300000U // Select input qualification type for GPIO58 +#define GPIO_GPBQSEL2_GPIO59_S 22U +#define GPIO_GPBQSEL2_GPIO59_M 0xC00000U // Select input qualification type for GPIO59 +#define GPIO_GPBQSEL2_GPIO60_S 24U +#define GPIO_GPBQSEL2_GPIO60_M 0x3000000U // Select input qualification type for GPIO60 +#define GPIO_GPBQSEL2_GPIO61_S 26U +#define GPIO_GPBQSEL2_GPIO61_M 0xC000000U // Select input qualification type for GPIO61 +#define GPIO_GPBQSEL2_GPIO62_S 28U +#define GPIO_GPBQSEL2_GPIO62_M 0x30000000U // Select input qualification type for GPIO62 +#define GPIO_GPBQSEL2_GPIO63_S 30U +#define GPIO_GPBQSEL2_GPIO63_M 0xC0000000U // Select input qualification type for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBMUX1 register +// +//************************************************************************************************* +#define GPIO_GPBMUX1_GPIO32_S 0U +#define GPIO_GPBMUX1_GPIO32_M 0x3U // Defines pin-muxing selection for GPIO32 +#define GPIO_GPBMUX1_GPIO33_S 2U +#define GPIO_GPBMUX1_GPIO33_M 0xCU // Defines pin-muxing selection for GPIO33 +#define GPIO_GPBMUX1_GPIO34_S 4U +#define GPIO_GPBMUX1_GPIO34_M 0x30U // Defines pin-muxing selection for GPIO34 +#define GPIO_GPBMUX1_GPIO35_S 6U +#define GPIO_GPBMUX1_GPIO35_M 0xC0U // Defines pin-muxing selection for GPIO35 +#define GPIO_GPBMUX1_GPIO36_S 8U +#define GPIO_GPBMUX1_GPIO36_M 0x300U // Defines pin-muxing selection for GPIO36 +#define GPIO_GPBMUX1_GPIO37_S 10U +#define GPIO_GPBMUX1_GPIO37_M 0xC00U // Defines pin-muxing selection for GPIO37 +#define GPIO_GPBMUX1_GPIO38_S 12U +#define GPIO_GPBMUX1_GPIO38_M 0x3000U // Defines pin-muxing selection for GPIO38 +#define GPIO_GPBMUX1_GPIO39_S 14U +#define GPIO_GPBMUX1_GPIO39_M 0xC000U // Defines pin-muxing selection for GPIO39 +#define GPIO_GPBMUX1_GPIO40_S 16U +#define GPIO_GPBMUX1_GPIO40_M 0x30000U // Defines pin-muxing selection for GPIO40 +#define GPIO_GPBMUX1_GPIO41_S 18U +#define GPIO_GPBMUX1_GPIO41_M 0xC0000U // Defines pin-muxing selection for GPIO41 +#define GPIO_GPBMUX1_GPIO42_S 20U +#define GPIO_GPBMUX1_GPIO42_M 0x300000U // Defines pin-muxing selection for GPIO42 +#define GPIO_GPBMUX1_GPIO43_S 22U +#define GPIO_GPBMUX1_GPIO43_M 0xC00000U // Defines pin-muxing selection for GPIO43 +#define GPIO_GPBMUX1_GPIO44_S 24U +#define GPIO_GPBMUX1_GPIO44_M 0x3000000U // Defines pin-muxing selection for GPIO44 +#define GPIO_GPBMUX1_GPIO45_S 26U +#define GPIO_GPBMUX1_GPIO45_M 0xC000000U // Defines pin-muxing selection for GPIO45 +#define GPIO_GPBMUX1_GPIO46_S 28U +#define GPIO_GPBMUX1_GPIO46_M 0x30000000U // Defines pin-muxing selection for GPIO46 +#define GPIO_GPBMUX1_GPIO47_S 30U +#define GPIO_GPBMUX1_GPIO47_M 0xC0000000U // Defines pin-muxing selection for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBMUX2 register +// +//************************************************************************************************* +#define GPIO_GPBMUX2_GPIO48_S 0U +#define GPIO_GPBMUX2_GPIO48_M 0x3U // Defines pin-muxing selection for GPIO48 +#define GPIO_GPBMUX2_GPIO49_S 2U +#define GPIO_GPBMUX2_GPIO49_M 0xCU // Defines pin-muxing selection for GPIO49 +#define GPIO_GPBMUX2_GPIO50_S 4U +#define GPIO_GPBMUX2_GPIO50_M 0x30U // Defines pin-muxing selection for GPIO50 +#define GPIO_GPBMUX2_GPIO51_S 6U +#define GPIO_GPBMUX2_GPIO51_M 0xC0U // Defines pin-muxing selection for GPIO51 +#define GPIO_GPBMUX2_GPIO52_S 8U +#define GPIO_GPBMUX2_GPIO52_M 0x300U // Defines pin-muxing selection for GPIO52 +#define GPIO_GPBMUX2_GPIO53_S 10U +#define GPIO_GPBMUX2_GPIO53_M 0xC00U // Defines pin-muxing selection for GPIO53 +#define GPIO_GPBMUX2_GPIO54_S 12U +#define GPIO_GPBMUX2_GPIO54_M 0x3000U // Defines pin-muxing selection for GPIO54 +#define GPIO_GPBMUX2_GPIO55_S 14U +#define GPIO_GPBMUX2_GPIO55_M 0xC000U // Defines pin-muxing selection for GPIO55 +#define GPIO_GPBMUX2_GPIO56_S 16U +#define GPIO_GPBMUX2_GPIO56_M 0x30000U // Defines pin-muxing selection for GPIO56 +#define GPIO_GPBMUX2_GPIO57_S 18U +#define GPIO_GPBMUX2_GPIO57_M 0xC0000U // Defines pin-muxing selection for GPIO57 +#define GPIO_GPBMUX2_GPIO58_S 20U +#define GPIO_GPBMUX2_GPIO58_M 0x300000U // Defines pin-muxing selection for GPIO58 +#define GPIO_GPBMUX2_GPIO59_S 22U +#define GPIO_GPBMUX2_GPIO59_M 0xC00000U // Defines pin-muxing selection for GPIO59 +#define GPIO_GPBMUX2_GPIO60_S 24U +#define GPIO_GPBMUX2_GPIO60_M 0x3000000U // Defines pin-muxing selection for GPIO60 +#define GPIO_GPBMUX2_GPIO61_S 26U +#define GPIO_GPBMUX2_GPIO61_M 0xC000000U // Defines pin-muxing selection for GPIO61 +#define GPIO_GPBMUX2_GPIO62_S 28U +#define GPIO_GPBMUX2_GPIO62_M 0x30000000U // Defines pin-muxing selection for GPIO62 +#define GPIO_GPBMUX2_GPIO63_S 30U +#define GPIO_GPBMUX2_GPIO63_M 0xC0000000U // Defines pin-muxing selection for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBDIR register +// +//************************************************************************************************* +#define GPIO_GPBDIR_GPIO32 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO33 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO34 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO35 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO36 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO37 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO38 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO39 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO40 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO41 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO42 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO43 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO44 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO45 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO46 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO47 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO48 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO49 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO50 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO51 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO52 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO53 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO54 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO55 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO56 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO57 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO58 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO59 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO60 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO61 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO62 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPBDIR_GPIO63 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBPUD register +// +//************************************************************************************************* +#define GPIO_GPBPUD_GPIO32 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO33 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO34 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO35 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO36 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO37 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO38 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO39 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO40 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO41 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO42 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO43 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO44 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO45 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO46 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO47 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO48 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO49 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO50 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO51 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO52 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO53 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO54 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO55 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO56 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO57 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO58 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO59 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO60 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO61 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO62 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPBPUD_GPIO63 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBINV register +// +//************************************************************************************************* +#define GPIO_GPBINV_GPIO32 0x1U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO33 0x2U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO34 0x4U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO35 0x8U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO36 0x10U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO37 0x20U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO38 0x40U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO39 0x80U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO40 0x100U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO41 0x200U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO42 0x400U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO43 0x800U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO44 0x1000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO45 0x2000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO46 0x4000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO47 0x8000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO48 0x10000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO49 0x20000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO50 0x40000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO51 0x80000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO52 0x100000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO53 0x200000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO54 0x400000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO55 0x800000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO56 0x1000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO57 0x2000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO58 0x4000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO59 0x8000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO60 0x10000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO61 0x20000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO62 0x40000000U // Input inversion control for this pin +#define GPIO_GPBINV_GPIO63 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBODR register +// +//************************************************************************************************* +#define GPIO_GPBODR_GPIO32 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO33 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO34 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO35 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO36 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO37 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO38 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO39 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO40 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO41 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO42 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO43 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO44 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO45 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO46 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO47 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO48 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO49 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO50 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO51 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO52 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO53 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO54 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO55 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO56 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO57 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO58 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO59 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO60 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO61 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO62 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPBODR_GPIO63 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBAMSEL register +// +//************************************************************************************************* +#define GPIO_GPBAMSEL_GPIO42 0x400U // Analog Mode select for this pin +#define GPIO_GPBAMSEL_GPIO43 0x800U // Analog Mode select for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPBGMUX1_GPIO32_S 0U +#define GPIO_GPBGMUX1_GPIO32_M 0x3U // Defines pin-muxing selection for GPIO32 +#define GPIO_GPBGMUX1_GPIO33_S 2U +#define GPIO_GPBGMUX1_GPIO33_M 0xCU // Defines pin-muxing selection for GPIO33 +#define GPIO_GPBGMUX1_GPIO34_S 4U +#define GPIO_GPBGMUX1_GPIO34_M 0x30U // Defines pin-muxing selection for GPIO34 +#define GPIO_GPBGMUX1_GPIO35_S 6U +#define GPIO_GPBGMUX1_GPIO35_M 0xC0U // Defines pin-muxing selection for GPIO35 +#define GPIO_GPBGMUX1_GPIO36_S 8U +#define GPIO_GPBGMUX1_GPIO36_M 0x300U // Defines pin-muxing selection for GPIO36 +#define GPIO_GPBGMUX1_GPIO37_S 10U +#define GPIO_GPBGMUX1_GPIO37_M 0xC00U // Defines pin-muxing selection for GPIO37 +#define GPIO_GPBGMUX1_GPIO38_S 12U +#define GPIO_GPBGMUX1_GPIO38_M 0x3000U // Defines pin-muxing selection for GPIO38 +#define GPIO_GPBGMUX1_GPIO39_S 14U +#define GPIO_GPBGMUX1_GPIO39_M 0xC000U // Defines pin-muxing selection for GPIO39 +#define GPIO_GPBGMUX1_GPIO40_S 16U +#define GPIO_GPBGMUX1_GPIO40_M 0x30000U // Defines pin-muxing selection for GPIO40 +#define GPIO_GPBGMUX1_GPIO41_S 18U +#define GPIO_GPBGMUX1_GPIO41_M 0xC0000U // Defines pin-muxing selection for GPIO41 +#define GPIO_GPBGMUX1_GPIO42_S 20U +#define GPIO_GPBGMUX1_GPIO42_M 0x300000U // Defines pin-muxing selection for GPIO42 +#define GPIO_GPBGMUX1_GPIO43_S 22U +#define GPIO_GPBGMUX1_GPIO43_M 0xC00000U // Defines pin-muxing selection for GPIO43 +#define GPIO_GPBGMUX1_GPIO44_S 24U +#define GPIO_GPBGMUX1_GPIO44_M 0x3000000U // Defines pin-muxing selection for GPIO44 +#define GPIO_GPBGMUX1_GPIO45_S 26U +#define GPIO_GPBGMUX1_GPIO45_M 0xC000000U // Defines pin-muxing selection for GPIO45 +#define GPIO_GPBGMUX1_GPIO46_S 28U +#define GPIO_GPBGMUX1_GPIO46_M 0x30000000U // Defines pin-muxing selection for GPIO46 +#define GPIO_GPBGMUX1_GPIO47_S 30U +#define GPIO_GPBGMUX1_GPIO47_M 0xC0000000U // Defines pin-muxing selection for GPIO47 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPBGMUX2_GPIO48_S 0U +#define GPIO_GPBGMUX2_GPIO48_M 0x3U // Defines pin-muxing selection for GPIO48 +#define GPIO_GPBGMUX2_GPIO49_S 2U +#define GPIO_GPBGMUX2_GPIO49_M 0xCU // Defines pin-muxing selection for GPIO49 +#define GPIO_GPBGMUX2_GPIO50_S 4U +#define GPIO_GPBGMUX2_GPIO50_M 0x30U // Defines pin-muxing selection for GPIO50 +#define GPIO_GPBGMUX2_GPIO51_S 6U +#define GPIO_GPBGMUX2_GPIO51_M 0xC0U // Defines pin-muxing selection for GPIO51 +#define GPIO_GPBGMUX2_GPIO52_S 8U +#define GPIO_GPBGMUX2_GPIO52_M 0x300U // Defines pin-muxing selection for GPIO52 +#define GPIO_GPBGMUX2_GPIO53_S 10U +#define GPIO_GPBGMUX2_GPIO53_M 0xC00U // Defines pin-muxing selection for GPIO53 +#define GPIO_GPBGMUX2_GPIO54_S 12U +#define GPIO_GPBGMUX2_GPIO54_M 0x3000U // Defines pin-muxing selection for GPIO54 +#define GPIO_GPBGMUX2_GPIO55_S 14U +#define GPIO_GPBGMUX2_GPIO55_M 0xC000U // Defines pin-muxing selection for GPIO55 +#define GPIO_GPBGMUX2_GPIO56_S 16U +#define GPIO_GPBGMUX2_GPIO56_M 0x30000U // Defines pin-muxing selection for GPIO56 +#define GPIO_GPBGMUX2_GPIO57_S 18U +#define GPIO_GPBGMUX2_GPIO57_M 0xC0000U // Defines pin-muxing selection for GPIO57 +#define GPIO_GPBGMUX2_GPIO58_S 20U +#define GPIO_GPBGMUX2_GPIO58_M 0x300000U // Defines pin-muxing selection for GPIO58 +#define GPIO_GPBGMUX2_GPIO59_S 22U +#define GPIO_GPBGMUX2_GPIO59_M 0xC00000U // Defines pin-muxing selection for GPIO59 +#define GPIO_GPBGMUX2_GPIO60_S 24U +#define GPIO_GPBGMUX2_GPIO60_M 0x3000000U // Defines pin-muxing selection for GPIO60 +#define GPIO_GPBGMUX2_GPIO61_S 26U +#define GPIO_GPBGMUX2_GPIO61_M 0xC000000U // Defines pin-muxing selection for GPIO61 +#define GPIO_GPBGMUX2_GPIO62_S 28U +#define GPIO_GPBGMUX2_GPIO62_M 0x30000000U // Defines pin-muxing selection for GPIO62 +#define GPIO_GPBGMUX2_GPIO63_S 30U +#define GPIO_GPBGMUX2_GPIO63_M 0xC0000000U // Defines pin-muxing selection for GPIO63 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL1_GPIO32_S 0U +#define GPIO_GPBCSEL1_GPIO32_M 0xFU // GPIO32 Master CPU Select +#define GPIO_GPBCSEL1_GPIO33_S 4U +#define GPIO_GPBCSEL1_GPIO33_M 0xF0U // GPIO33 Master CPU Select +#define GPIO_GPBCSEL1_GPIO34_S 8U +#define GPIO_GPBCSEL1_GPIO34_M 0xF00U // GPIO34 Master CPU Select +#define GPIO_GPBCSEL1_GPIO35_S 12U +#define GPIO_GPBCSEL1_GPIO35_M 0xF000U // GPIO35 Master CPU Select +#define GPIO_GPBCSEL1_GPIO36_S 16U +#define GPIO_GPBCSEL1_GPIO36_M 0xF0000U // GPIO36 Master CPU Select +#define GPIO_GPBCSEL1_GPIO37_S 20U +#define GPIO_GPBCSEL1_GPIO37_M 0xF00000U // GPIO37 Master CPU Select +#define GPIO_GPBCSEL1_GPIO38_S 24U +#define GPIO_GPBCSEL1_GPIO38_M 0xF000000U // GPIO38 Master CPU Select +#define GPIO_GPBCSEL1_GPIO39_S 28U +#define GPIO_GPBCSEL1_GPIO39_M 0xF0000000U // GPIO39 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL2_GPIO40_S 0U +#define GPIO_GPBCSEL2_GPIO40_M 0xFU // GPIO40 Master CPU Select +#define GPIO_GPBCSEL2_GPIO41_S 4U +#define GPIO_GPBCSEL2_GPIO41_M 0xF0U // GPIO41 Master CPU Select +#define GPIO_GPBCSEL2_GPIO42_S 8U +#define GPIO_GPBCSEL2_GPIO42_M 0xF00U // GPIO42 Master CPU Select +#define GPIO_GPBCSEL2_GPIO43_S 12U +#define GPIO_GPBCSEL2_GPIO43_M 0xF000U // GPIO43 Master CPU Select +#define GPIO_GPBCSEL2_GPIO44_S 16U +#define GPIO_GPBCSEL2_GPIO44_M 0xF0000U // GPIO44 Master CPU Select +#define GPIO_GPBCSEL2_GPIO45_S 20U +#define GPIO_GPBCSEL2_GPIO45_M 0xF00000U // GPIO45 Master CPU Select +#define GPIO_GPBCSEL2_GPIO46_S 24U +#define GPIO_GPBCSEL2_GPIO46_M 0xF000000U // GPIO46 Master CPU Select +#define GPIO_GPBCSEL2_GPIO47_S 28U +#define GPIO_GPBCSEL2_GPIO47_M 0xF0000000U // GPIO47 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL3_GPIO48_S 0U +#define GPIO_GPBCSEL3_GPIO48_M 0xFU // GPIO48 Master CPU Select +#define GPIO_GPBCSEL3_GPIO49_S 4U +#define GPIO_GPBCSEL3_GPIO49_M 0xF0U // GPIO49 Master CPU Select +#define GPIO_GPBCSEL3_GPIO50_S 8U +#define GPIO_GPBCSEL3_GPIO50_M 0xF00U // GPIO50 Master CPU Select +#define GPIO_GPBCSEL3_GPIO51_S 12U +#define GPIO_GPBCSEL3_GPIO51_M 0xF000U // GPIO51 Master CPU Select +#define GPIO_GPBCSEL3_GPIO52_S 16U +#define GPIO_GPBCSEL3_GPIO52_M 0xF0000U // GPIO52 Master CPU Select +#define GPIO_GPBCSEL3_GPIO53_S 20U +#define GPIO_GPBCSEL3_GPIO53_M 0xF00000U // GPIO53 Master CPU Select +#define GPIO_GPBCSEL3_GPIO54_S 24U +#define GPIO_GPBCSEL3_GPIO54_M 0xF000000U // GPIO54 Master CPU Select +#define GPIO_GPBCSEL3_GPIO55_S 28U +#define GPIO_GPBCSEL3_GPIO55_M 0xF0000000U // GPIO55 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPBCSEL4_GPIO56_S 0U +#define GPIO_GPBCSEL4_GPIO56_M 0xFU // GPIO56 Master CPU Select +#define GPIO_GPBCSEL4_GPIO57_S 4U +#define GPIO_GPBCSEL4_GPIO57_M 0xF0U // GPIO57 Master CPU Select +#define GPIO_GPBCSEL4_GPIO58_S 8U +#define GPIO_GPBCSEL4_GPIO58_M 0xF00U // GPIO58 Master CPU Select +#define GPIO_GPBCSEL4_GPIO59_S 12U +#define GPIO_GPBCSEL4_GPIO59_M 0xF000U // GPIO59 Master CPU Select +#define GPIO_GPBCSEL4_GPIO60_S 16U +#define GPIO_GPBCSEL4_GPIO60_M 0xF0000U // GPIO60 Master CPU Select +#define GPIO_GPBCSEL4_GPIO61_S 20U +#define GPIO_GPBCSEL4_GPIO61_M 0xF00000U // GPIO61 Master CPU Select +#define GPIO_GPBCSEL4_GPIO62_S 24U +#define GPIO_GPBCSEL4_GPIO62_M 0xF000000U // GPIO62 Master CPU Select +#define GPIO_GPBCSEL4_GPIO63_S 28U +#define GPIO_GPBCSEL4_GPIO63_M 0xF0000000U // GPIO63 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBLOCK register +// +//************************************************************************************************* +#define GPIO_GPBLOCK_GPIO32 0x1U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO33 0x2U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO34 0x4U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO35 0x8U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO36 0x10U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO37 0x20U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO38 0x40U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO39 0x80U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO40 0x100U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO41 0x200U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO42 0x400U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO43 0x800U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO44 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO45 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO46 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO47 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO48 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO49 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO50 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO51 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO52 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO53 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO54 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO55 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO56 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO57 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO58 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO59 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO60 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO61 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO62 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPBLOCK_GPIO63 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCR register +// +//************************************************************************************************* +#define GPIO_GPBCR_GPIO32 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO33 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO34 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO35 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO36 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO37 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO38 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO39 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO40 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO41 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO42 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO43 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO44 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO45 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO46 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO47 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO48 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO49 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO50 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO51 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO52 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO53 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO54 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO55 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO56 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO57 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO58 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO59 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO60 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO61 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO62 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPBCR_GPIO63 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCTRL register +// +//************************************************************************************************* +#define GPIO_GPCCTRL_QUALPRD0_S 0U +#define GPIO_GPCCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO64 to + // GPIO71 +#define GPIO_GPCCTRL_QUALPRD1_S 8U +#define GPIO_GPCCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO72 to + // GPIO79 +#define GPIO_GPCCTRL_QUALPRD2_S 16U +#define GPIO_GPCCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO80 to + // GPIO87 +#define GPIO_GPCCTRL_QUALPRD3_S 24U +#define GPIO_GPCCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO88 to + // GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPCQSEL1_GPIO64_S 0U +#define GPIO_GPCQSEL1_GPIO64_M 0x3U // Select input qualification type for GPIO64 +#define GPIO_GPCQSEL1_GPIO65_S 2U +#define GPIO_GPCQSEL1_GPIO65_M 0xCU // Select input qualification type for GPIO65 +#define GPIO_GPCQSEL1_GPIO66_S 4U +#define GPIO_GPCQSEL1_GPIO66_M 0x30U // Select input qualification type for GPIO66 +#define GPIO_GPCQSEL1_GPIO67_S 6U +#define GPIO_GPCQSEL1_GPIO67_M 0xC0U // Select input qualification type for GPIO67 +#define GPIO_GPCQSEL1_GPIO68_S 8U +#define GPIO_GPCQSEL1_GPIO68_M 0x300U // Select input qualification type for GPIO68 +#define GPIO_GPCQSEL1_GPIO69_S 10U +#define GPIO_GPCQSEL1_GPIO69_M 0xC00U // Select input qualification type for GPIO69 +#define GPIO_GPCQSEL1_GPIO70_S 12U +#define GPIO_GPCQSEL1_GPIO70_M 0x3000U // Select input qualification type for GPIO70 +#define GPIO_GPCQSEL1_GPIO71_S 14U +#define GPIO_GPCQSEL1_GPIO71_M 0xC000U // Select input qualification type for GPIO71 +#define GPIO_GPCQSEL1_GPIO72_S 16U +#define GPIO_GPCQSEL1_GPIO72_M 0x30000U // Select input qualification type for GPIO72 +#define GPIO_GPCQSEL1_GPIO73_S 18U +#define GPIO_GPCQSEL1_GPIO73_M 0xC0000U // Select input qualification type for GPIO73 +#define GPIO_GPCQSEL1_GPIO74_S 20U +#define GPIO_GPCQSEL1_GPIO74_M 0x300000U // Select input qualification type for GPIO74 +#define GPIO_GPCQSEL1_GPIO75_S 22U +#define GPIO_GPCQSEL1_GPIO75_M 0xC00000U // Select input qualification type for GPIO75 +#define GPIO_GPCQSEL1_GPIO76_S 24U +#define GPIO_GPCQSEL1_GPIO76_M 0x3000000U // Select input qualification type for GPIO76 +#define GPIO_GPCQSEL1_GPIO77_S 26U +#define GPIO_GPCQSEL1_GPIO77_M 0xC000000U // Select input qualification type for GPIO77 +#define GPIO_GPCQSEL1_GPIO78_S 28U +#define GPIO_GPCQSEL1_GPIO78_M 0x30000000U // Select input qualification type for GPIO78 +#define GPIO_GPCQSEL1_GPIO79_S 30U +#define GPIO_GPCQSEL1_GPIO79_M 0xC0000000U // Select input qualification type for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPCQSEL2_GPIO80_S 0U +#define GPIO_GPCQSEL2_GPIO80_M 0x3U // Select input qualification type for GPIO80 +#define GPIO_GPCQSEL2_GPIO81_S 2U +#define GPIO_GPCQSEL2_GPIO81_M 0xCU // Select input qualification type for GPIO81 +#define GPIO_GPCQSEL2_GPIO82_S 4U +#define GPIO_GPCQSEL2_GPIO82_M 0x30U // Select input qualification type for GPIO82 +#define GPIO_GPCQSEL2_GPIO83_S 6U +#define GPIO_GPCQSEL2_GPIO83_M 0xC0U // Select input qualification type for GPIO83 +#define GPIO_GPCQSEL2_GPIO84_S 8U +#define GPIO_GPCQSEL2_GPIO84_M 0x300U // Select input qualification type for GPIO84 +#define GPIO_GPCQSEL2_GPIO85_S 10U +#define GPIO_GPCQSEL2_GPIO85_M 0xC00U // Select input qualification type for GPIO85 +#define GPIO_GPCQSEL2_GPIO86_S 12U +#define GPIO_GPCQSEL2_GPIO86_M 0x3000U // Select input qualification type for GPIO86 +#define GPIO_GPCQSEL2_GPIO87_S 14U +#define GPIO_GPCQSEL2_GPIO87_M 0xC000U // Select input qualification type for GPIO87 +#define GPIO_GPCQSEL2_GPIO88_S 16U +#define GPIO_GPCQSEL2_GPIO88_M 0x30000U // Select input qualification type for GPIO88 +#define GPIO_GPCQSEL2_GPIO89_S 18U +#define GPIO_GPCQSEL2_GPIO89_M 0xC0000U // Select input qualification type for GPIO89 +#define GPIO_GPCQSEL2_GPIO90_S 20U +#define GPIO_GPCQSEL2_GPIO90_M 0x300000U // Select input qualification type for GPIO90 +#define GPIO_GPCQSEL2_GPIO91_S 22U +#define GPIO_GPCQSEL2_GPIO91_M 0xC00000U // Select input qualification type for GPIO91 +#define GPIO_GPCQSEL2_GPIO92_S 24U +#define GPIO_GPCQSEL2_GPIO92_M 0x3000000U // Select input qualification type for GPIO92 +#define GPIO_GPCQSEL2_GPIO93_S 26U +#define GPIO_GPCQSEL2_GPIO93_M 0xC000000U // Select input qualification type for GPIO93 +#define GPIO_GPCQSEL2_GPIO94_S 28U +#define GPIO_GPCQSEL2_GPIO94_M 0x30000000U // Select input qualification type for GPIO94 +#define GPIO_GPCQSEL2_GPIO95_S 30U +#define GPIO_GPCQSEL2_GPIO95_M 0xC0000000U // Select input qualification type for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCMUX1 register +// +//************************************************************************************************* +#define GPIO_GPCMUX1_GPIO64_S 0U +#define GPIO_GPCMUX1_GPIO64_M 0x3U // Defines pin-muxing selection for GPIO64 +#define GPIO_GPCMUX1_GPIO65_S 2U +#define GPIO_GPCMUX1_GPIO65_M 0xCU // Defines pin-muxing selection for GPIO65 +#define GPIO_GPCMUX1_GPIO66_S 4U +#define GPIO_GPCMUX1_GPIO66_M 0x30U // Defines pin-muxing selection for GPIO66 +#define GPIO_GPCMUX1_GPIO67_S 6U +#define GPIO_GPCMUX1_GPIO67_M 0xC0U // Defines pin-muxing selection for GPIO67 +#define GPIO_GPCMUX1_GPIO68_S 8U +#define GPIO_GPCMUX1_GPIO68_M 0x300U // Defines pin-muxing selection for GPIO68 +#define GPIO_GPCMUX1_GPIO69_S 10U +#define GPIO_GPCMUX1_GPIO69_M 0xC00U // Defines pin-muxing selection for GPIO69 +#define GPIO_GPCMUX1_GPIO70_S 12U +#define GPIO_GPCMUX1_GPIO70_M 0x3000U // Defines pin-muxing selection for GPIO70 +#define GPIO_GPCMUX1_GPIO71_S 14U +#define GPIO_GPCMUX1_GPIO71_M 0xC000U // Defines pin-muxing selection for GPIO71 +#define GPIO_GPCMUX1_GPIO72_S 16U +#define GPIO_GPCMUX1_GPIO72_M 0x30000U // Defines pin-muxing selection for GPIO72 +#define GPIO_GPCMUX1_GPIO73_S 18U +#define GPIO_GPCMUX1_GPIO73_M 0xC0000U // Defines pin-muxing selection for GPIO73 +#define GPIO_GPCMUX1_GPIO74_S 20U +#define GPIO_GPCMUX1_GPIO74_M 0x300000U // Defines pin-muxing selection for GPIO74 +#define GPIO_GPCMUX1_GPIO75_S 22U +#define GPIO_GPCMUX1_GPIO75_M 0xC00000U // Defines pin-muxing selection for GPIO75 +#define GPIO_GPCMUX1_GPIO76_S 24U +#define GPIO_GPCMUX1_GPIO76_M 0x3000000U // Defines pin-muxing selection for GPIO76 +#define GPIO_GPCMUX1_GPIO77_S 26U +#define GPIO_GPCMUX1_GPIO77_M 0xC000000U // Defines pin-muxing selection for GPIO77 +#define GPIO_GPCMUX1_GPIO78_S 28U +#define GPIO_GPCMUX1_GPIO78_M 0x30000000U // Defines pin-muxing selection for GPIO78 +#define GPIO_GPCMUX1_GPIO79_S 30U +#define GPIO_GPCMUX1_GPIO79_M 0xC0000000U // Defines pin-muxing selection for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCMUX2 register +// +//************************************************************************************************* +#define GPIO_GPCMUX2_GPIO80_S 0U +#define GPIO_GPCMUX2_GPIO80_M 0x3U // Defines pin-muxing selection for GPIO80 +#define GPIO_GPCMUX2_GPIO81_S 2U +#define GPIO_GPCMUX2_GPIO81_M 0xCU // Defines pin-muxing selection for GPIO81 +#define GPIO_GPCMUX2_GPIO82_S 4U +#define GPIO_GPCMUX2_GPIO82_M 0x30U // Defines pin-muxing selection for GPIO82 +#define GPIO_GPCMUX2_GPIO83_S 6U +#define GPIO_GPCMUX2_GPIO83_M 0xC0U // Defines pin-muxing selection for GPIO83 +#define GPIO_GPCMUX2_GPIO84_S 8U +#define GPIO_GPCMUX2_GPIO84_M 0x300U // Defines pin-muxing selection for GPIO84 +#define GPIO_GPCMUX2_GPIO85_S 10U +#define GPIO_GPCMUX2_GPIO85_M 0xC00U // Defines pin-muxing selection for GPIO85 +#define GPIO_GPCMUX2_GPIO86_S 12U +#define GPIO_GPCMUX2_GPIO86_M 0x3000U // Defines pin-muxing selection for GPIO86 +#define GPIO_GPCMUX2_GPIO87_S 14U +#define GPIO_GPCMUX2_GPIO87_M 0xC000U // Defines pin-muxing selection for GPIO87 +#define GPIO_GPCMUX2_GPIO88_S 16U +#define GPIO_GPCMUX2_GPIO88_M 0x30000U // Defines pin-muxing selection for GPIO88 +#define GPIO_GPCMUX2_GPIO89_S 18U +#define GPIO_GPCMUX2_GPIO89_M 0xC0000U // Defines pin-muxing selection for GPIO89 +#define GPIO_GPCMUX2_GPIO90_S 20U +#define GPIO_GPCMUX2_GPIO90_M 0x300000U // Defines pin-muxing selection for GPIO90 +#define GPIO_GPCMUX2_GPIO91_S 22U +#define GPIO_GPCMUX2_GPIO91_M 0xC00000U // Defines pin-muxing selection for GPIO91 +#define GPIO_GPCMUX2_GPIO92_S 24U +#define GPIO_GPCMUX2_GPIO92_M 0x3000000U // Defines pin-muxing selection for GPIO92 +#define GPIO_GPCMUX2_GPIO93_S 26U +#define GPIO_GPCMUX2_GPIO93_M 0xC000000U // Defines pin-muxing selection for GPIO93 +#define GPIO_GPCMUX2_GPIO94_S 28U +#define GPIO_GPCMUX2_GPIO94_M 0x30000000U // Defines pin-muxing selection for GPIO94 +#define GPIO_GPCMUX2_GPIO95_S 30U +#define GPIO_GPCMUX2_GPIO95_M 0xC0000000U // Defines pin-muxing selection for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCDIR register +// +//************************************************************************************************* +#define GPIO_GPCDIR_GPIO64 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO65 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO66 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO67 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO68 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO69 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO70 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO71 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO72 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO73 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO74 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO75 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO76 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO77 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO78 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO79 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO80 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO81 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO82 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO83 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO84 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO85 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO86 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO87 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO88 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO89 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO90 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO91 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO92 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO93 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO94 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPCDIR_GPIO95 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCPUD register +// +//************************************************************************************************* +#define GPIO_GPCPUD_GPIO64 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO65 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO66 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO67 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO68 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO69 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO70 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO71 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO72 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO73 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO74 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO75 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO76 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO77 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO78 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO79 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO80 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO81 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO82 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO83 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO84 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO85 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO86 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO87 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO88 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO89 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO90 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO91 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO92 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO93 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO94 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPCPUD_GPIO95 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCINV register +// +//************************************************************************************************* +#define GPIO_GPCINV_GPIO64 0x1U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO65 0x2U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO66 0x4U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO67 0x8U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO68 0x10U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO69 0x20U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO70 0x40U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO71 0x80U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO72 0x100U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO73 0x200U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO74 0x400U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO75 0x800U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO76 0x1000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO77 0x2000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO78 0x4000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO79 0x8000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO80 0x10000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO81 0x20000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO82 0x40000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO83 0x80000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO84 0x100000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO85 0x200000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO86 0x400000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO87 0x800000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO88 0x1000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO89 0x2000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO90 0x4000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO91 0x8000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO92 0x10000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO93 0x20000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO94 0x40000000U // Input inversion control for this pin +#define GPIO_GPCINV_GPIO95 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCODR register +// +//************************************************************************************************* +#define GPIO_GPCODR_GPIO64 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO65 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO66 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO67 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO68 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO69 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO70 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO71 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO72 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO73 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO74 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO75 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO76 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO77 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO78 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO79 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO80 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO81 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO82 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO83 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO84 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO85 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO86 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO87 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO88 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO89 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO90 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO91 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO92 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO93 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO94 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPCODR_GPIO95 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPCGMUX1_GPIO64_S 0U +#define GPIO_GPCGMUX1_GPIO64_M 0x3U // Defines pin-muxing selection for GPIO64 +#define GPIO_GPCGMUX1_GPIO65_S 2U +#define GPIO_GPCGMUX1_GPIO65_M 0xCU // Defines pin-muxing selection for GPIO65 +#define GPIO_GPCGMUX1_GPIO66_S 4U +#define GPIO_GPCGMUX1_GPIO66_M 0x30U // Defines pin-muxing selection for GPIO66 +#define GPIO_GPCGMUX1_GPIO67_S 6U +#define GPIO_GPCGMUX1_GPIO67_M 0xC0U // Defines pin-muxing selection for GPIO67 +#define GPIO_GPCGMUX1_GPIO68_S 8U +#define GPIO_GPCGMUX1_GPIO68_M 0x300U // Defines pin-muxing selection for GPIO68 +#define GPIO_GPCGMUX1_GPIO69_S 10U +#define GPIO_GPCGMUX1_GPIO69_M 0xC00U // Defines pin-muxing selection for GPIO69 +#define GPIO_GPCGMUX1_GPIO70_S 12U +#define GPIO_GPCGMUX1_GPIO70_M 0x3000U // Defines pin-muxing selection for GPIO70 +#define GPIO_GPCGMUX1_GPIO71_S 14U +#define GPIO_GPCGMUX1_GPIO71_M 0xC000U // Defines pin-muxing selection for GPIO71 +#define GPIO_GPCGMUX1_GPIO72_S 16U +#define GPIO_GPCGMUX1_GPIO72_M 0x30000U // Defines pin-muxing selection for GPIO72 +#define GPIO_GPCGMUX1_GPIO73_S 18U +#define GPIO_GPCGMUX1_GPIO73_M 0xC0000U // Defines pin-muxing selection for GPIO73 +#define GPIO_GPCGMUX1_GPIO74_S 20U +#define GPIO_GPCGMUX1_GPIO74_M 0x300000U // Defines pin-muxing selection for GPIO74 +#define GPIO_GPCGMUX1_GPIO75_S 22U +#define GPIO_GPCGMUX1_GPIO75_M 0xC00000U // Defines pin-muxing selection for GPIO75 +#define GPIO_GPCGMUX1_GPIO76_S 24U +#define GPIO_GPCGMUX1_GPIO76_M 0x3000000U // Defines pin-muxing selection for GPIO76 +#define GPIO_GPCGMUX1_GPIO77_S 26U +#define GPIO_GPCGMUX1_GPIO77_M 0xC000000U // Defines pin-muxing selection for GPIO77 +#define GPIO_GPCGMUX1_GPIO78_S 28U +#define GPIO_GPCGMUX1_GPIO78_M 0x30000000U // Defines pin-muxing selection for GPIO78 +#define GPIO_GPCGMUX1_GPIO79_S 30U +#define GPIO_GPCGMUX1_GPIO79_M 0xC0000000U // Defines pin-muxing selection for GPIO79 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPCGMUX2_GPIO80_S 0U +#define GPIO_GPCGMUX2_GPIO80_M 0x3U // Defines pin-muxing selection for GPIO80 +#define GPIO_GPCGMUX2_GPIO81_S 2U +#define GPIO_GPCGMUX2_GPIO81_M 0xCU // Defines pin-muxing selection for GPIO81 +#define GPIO_GPCGMUX2_GPIO82_S 4U +#define GPIO_GPCGMUX2_GPIO82_M 0x30U // Defines pin-muxing selection for GPIO82 +#define GPIO_GPCGMUX2_GPIO83_S 6U +#define GPIO_GPCGMUX2_GPIO83_M 0xC0U // Defines pin-muxing selection for GPIO83 +#define GPIO_GPCGMUX2_GPIO84_S 8U +#define GPIO_GPCGMUX2_GPIO84_M 0x300U // Defines pin-muxing selection for GPIO84 +#define GPIO_GPCGMUX2_GPIO85_S 10U +#define GPIO_GPCGMUX2_GPIO85_M 0xC00U // Defines pin-muxing selection for GPIO85 +#define GPIO_GPCGMUX2_GPIO86_S 12U +#define GPIO_GPCGMUX2_GPIO86_M 0x3000U // Defines pin-muxing selection for GPIO86 +#define GPIO_GPCGMUX2_GPIO87_S 14U +#define GPIO_GPCGMUX2_GPIO87_M 0xC000U // Defines pin-muxing selection for GPIO87 +#define GPIO_GPCGMUX2_GPIO88_S 16U +#define GPIO_GPCGMUX2_GPIO88_M 0x30000U // Defines pin-muxing selection for GPIO88 +#define GPIO_GPCGMUX2_GPIO89_S 18U +#define GPIO_GPCGMUX2_GPIO89_M 0xC0000U // Defines pin-muxing selection for GPIO89 +#define GPIO_GPCGMUX2_GPIO90_S 20U +#define GPIO_GPCGMUX2_GPIO90_M 0x300000U // Defines pin-muxing selection for GPIO90 +#define GPIO_GPCGMUX2_GPIO91_S 22U +#define GPIO_GPCGMUX2_GPIO91_M 0xC00000U // Defines pin-muxing selection for GPIO91 +#define GPIO_GPCGMUX2_GPIO92_S 24U +#define GPIO_GPCGMUX2_GPIO92_M 0x3000000U // Defines pin-muxing selection for GPIO92 +#define GPIO_GPCGMUX2_GPIO93_S 26U +#define GPIO_GPCGMUX2_GPIO93_M 0xC000000U // Defines pin-muxing selection for GPIO93 +#define GPIO_GPCGMUX2_GPIO94_S 28U +#define GPIO_GPCGMUX2_GPIO94_M 0x30000000U // Defines pin-muxing selection for GPIO94 +#define GPIO_GPCGMUX2_GPIO95_S 30U +#define GPIO_GPCGMUX2_GPIO95_M 0xC0000000U // Defines pin-muxing selection for GPIO95 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL1_GPIO64_S 0U +#define GPIO_GPCCSEL1_GPIO64_M 0xFU // GPIO64 Master CPU Select +#define GPIO_GPCCSEL1_GPIO65_S 4U +#define GPIO_GPCCSEL1_GPIO65_M 0xF0U // GPIO65 Master CPU Select +#define GPIO_GPCCSEL1_GPIO66_S 8U +#define GPIO_GPCCSEL1_GPIO66_M 0xF00U // GPIO66 Master CPU Select +#define GPIO_GPCCSEL1_GPIO67_S 12U +#define GPIO_GPCCSEL1_GPIO67_M 0xF000U // GPIO67 Master CPU Select +#define GPIO_GPCCSEL1_GPIO68_S 16U +#define GPIO_GPCCSEL1_GPIO68_M 0xF0000U // GPIO68 Master CPU Select +#define GPIO_GPCCSEL1_GPIO69_S 20U +#define GPIO_GPCCSEL1_GPIO69_M 0xF00000U // GPIO69 Master CPU Select +#define GPIO_GPCCSEL1_GPIO70_S 24U +#define GPIO_GPCCSEL1_GPIO70_M 0xF000000U // GPIO70 Master CPU Select +#define GPIO_GPCCSEL1_GPIO71_S 28U +#define GPIO_GPCCSEL1_GPIO71_M 0xF0000000U // GPIO71 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL2_GPIO72_S 0U +#define GPIO_GPCCSEL2_GPIO72_M 0xFU // GPIO72 Master CPU Select +#define GPIO_GPCCSEL2_GPIO73_S 4U +#define GPIO_GPCCSEL2_GPIO73_M 0xF0U // GPIO73 Master CPU Select +#define GPIO_GPCCSEL2_GPIO74_S 8U +#define GPIO_GPCCSEL2_GPIO74_M 0xF00U // GPIO74 Master CPU Select +#define GPIO_GPCCSEL2_GPIO75_S 12U +#define GPIO_GPCCSEL2_GPIO75_M 0xF000U // GPIO75 Master CPU Select +#define GPIO_GPCCSEL2_GPIO76_S 16U +#define GPIO_GPCCSEL2_GPIO76_M 0xF0000U // GPIO76 Master CPU Select +#define GPIO_GPCCSEL2_GPIO77_S 20U +#define GPIO_GPCCSEL2_GPIO77_M 0xF00000U // GPIO77 Master CPU Select +#define GPIO_GPCCSEL2_GPIO78_S 24U +#define GPIO_GPCCSEL2_GPIO78_M 0xF000000U // GPIO78 Master CPU Select +#define GPIO_GPCCSEL2_GPIO79_S 28U +#define GPIO_GPCCSEL2_GPIO79_M 0xF0000000U // GPIO79 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL3_GPIO80_S 0U +#define GPIO_GPCCSEL3_GPIO80_M 0xFU // GPIO80 Master CPU Select +#define GPIO_GPCCSEL3_GPIO81_S 4U +#define GPIO_GPCCSEL3_GPIO81_M 0xF0U // GPIO81 Master CPU Select +#define GPIO_GPCCSEL3_GPIO82_S 8U +#define GPIO_GPCCSEL3_GPIO82_M 0xF00U // GPIO82 Master CPU Select +#define GPIO_GPCCSEL3_GPIO83_S 12U +#define GPIO_GPCCSEL3_GPIO83_M 0xF000U // GPIO83 Master CPU Select +#define GPIO_GPCCSEL3_GPIO84_S 16U +#define GPIO_GPCCSEL3_GPIO84_M 0xF0000U // GPIO84 Master CPU Select +#define GPIO_GPCCSEL3_GPIO85_S 20U +#define GPIO_GPCCSEL3_GPIO85_M 0xF00000U // GPIO85 Master CPU Select +#define GPIO_GPCCSEL3_GPIO86_S 24U +#define GPIO_GPCCSEL3_GPIO86_M 0xF000000U // GPIO86 Master CPU Select +#define GPIO_GPCCSEL3_GPIO87_S 28U +#define GPIO_GPCCSEL3_GPIO87_M 0xF0000000U // GPIO87 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPCCSEL4_GPIO88_S 0U +#define GPIO_GPCCSEL4_GPIO88_M 0xFU // GPIO88 Master CPU Select +#define GPIO_GPCCSEL4_GPIO89_S 4U +#define GPIO_GPCCSEL4_GPIO89_M 0xF0U // GPIO89 Master CPU Select +#define GPIO_GPCCSEL4_GPIO90_S 8U +#define GPIO_GPCCSEL4_GPIO90_M 0xF00U // GPIO90 Master CPU Select +#define GPIO_GPCCSEL4_GPIO91_S 12U +#define GPIO_GPCCSEL4_GPIO91_M 0xF000U // GPIO91 Master CPU Select +#define GPIO_GPCCSEL4_GPIO92_S 16U +#define GPIO_GPCCSEL4_GPIO92_M 0xF0000U // GPIO92 Master CPU Select +#define GPIO_GPCCSEL4_GPIO93_S 20U +#define GPIO_GPCCSEL4_GPIO93_M 0xF00000U // GPIO93 Master CPU Select +#define GPIO_GPCCSEL4_GPIO94_S 24U +#define GPIO_GPCCSEL4_GPIO94_M 0xF000000U // GPIO94 Master CPU Select +#define GPIO_GPCCSEL4_GPIO95_S 28U +#define GPIO_GPCCSEL4_GPIO95_M 0xF0000000U // GPIO95 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCLOCK register +// +//************************************************************************************************* +#define GPIO_GPCLOCK_GPIO64 0x1U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO65 0x2U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO66 0x4U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO67 0x8U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO68 0x10U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO69 0x20U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO70 0x40U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO71 0x80U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO72 0x100U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO73 0x200U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO74 0x400U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO75 0x800U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO76 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO77 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO78 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO79 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO80 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO81 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO82 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO83 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO84 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO85 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO86 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO87 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO88 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO89 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO90 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO91 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO92 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO93 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO94 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPCLOCK_GPIO95 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCR register +// +//************************************************************************************************* +#define GPIO_GPCCR_GPIO64 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO65 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO66 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO67 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO68 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO69 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO70 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO71 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO72 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO73 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO74 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO75 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO76 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO77 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO78 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO79 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO80 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO81 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO82 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO83 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO84 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO85 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO86 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO87 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO88 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO89 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO90 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO91 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO92 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO93 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO94 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPCCR_GPIO95 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCTRL register +// +//************************************************************************************************* +#define GPIO_GPDCTRL_QUALPRD0_S 0U +#define GPIO_GPDCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO96 to + // GPIO103 +#define GPIO_GPDCTRL_QUALPRD1_S 8U +#define GPIO_GPDCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO104 to + // GPIO111 +#define GPIO_GPDCTRL_QUALPRD2_S 16U +#define GPIO_GPDCTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO112 to + // GPIO119 +#define GPIO_GPDCTRL_QUALPRD3_S 24U +#define GPIO_GPDCTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO120 to + // GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPDQSEL1_GPIO96_S 0U +#define GPIO_GPDQSEL1_GPIO96_M 0x3U // Select input qualification type for GPIO96 +#define GPIO_GPDQSEL1_GPIO97_S 2U +#define GPIO_GPDQSEL1_GPIO97_M 0xCU // Select input qualification type for GPIO97 +#define GPIO_GPDQSEL1_GPIO98_S 4U +#define GPIO_GPDQSEL1_GPIO98_M 0x30U // Select input qualification type for GPIO98 +#define GPIO_GPDQSEL1_GPIO99_S 6U +#define GPIO_GPDQSEL1_GPIO99_M 0xC0U // Select input qualification type for GPIO99 +#define GPIO_GPDQSEL1_GPIO100_S 8U +#define GPIO_GPDQSEL1_GPIO100_M 0x300U // Select input qualification type for GPIO100 +#define GPIO_GPDQSEL1_GPIO101_S 10U +#define GPIO_GPDQSEL1_GPIO101_M 0xC00U // Select input qualification type for GPIO101 +#define GPIO_GPDQSEL1_GPIO102_S 12U +#define GPIO_GPDQSEL1_GPIO102_M 0x3000U // Select input qualification type for GPIO102 +#define GPIO_GPDQSEL1_GPIO103_S 14U +#define GPIO_GPDQSEL1_GPIO103_M 0xC000U // Select input qualification type for GPIO103 +#define GPIO_GPDQSEL1_GPIO104_S 16U +#define GPIO_GPDQSEL1_GPIO104_M 0x30000U // Select input qualification type for GPIO104 +#define GPIO_GPDQSEL1_GPIO105_S 18U +#define GPIO_GPDQSEL1_GPIO105_M 0xC0000U // Select input qualification type for GPIO105 +#define GPIO_GPDQSEL1_GPIO106_S 20U +#define GPIO_GPDQSEL1_GPIO106_M 0x300000U // Select input qualification type for GPIO106 +#define GPIO_GPDQSEL1_GPIO107_S 22U +#define GPIO_GPDQSEL1_GPIO107_M 0xC00000U // Select input qualification type for GPIO107 +#define GPIO_GPDQSEL1_GPIO108_S 24U +#define GPIO_GPDQSEL1_GPIO108_M 0x3000000U // Select input qualification type for GPIO108 +#define GPIO_GPDQSEL1_GPIO109_S 26U +#define GPIO_GPDQSEL1_GPIO109_M 0xC000000U // Select input qualification type for GPIO109 +#define GPIO_GPDQSEL1_GPIO110_S 28U +#define GPIO_GPDQSEL1_GPIO110_M 0x30000000U // Select input qualification type for GPIO110 +#define GPIO_GPDQSEL1_GPIO111_S 30U +#define GPIO_GPDQSEL1_GPIO111_M 0xC0000000U // Select input qualification type for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPDQSEL2_GPIO112_S 0U +#define GPIO_GPDQSEL2_GPIO112_M 0x3U // Select input qualification type for GPIO112 +#define GPIO_GPDQSEL2_GPIO113_S 2U +#define GPIO_GPDQSEL2_GPIO113_M 0xCU // Select input qualification type for GPIO113 +#define GPIO_GPDQSEL2_GPIO114_S 4U +#define GPIO_GPDQSEL2_GPIO114_M 0x30U // Select input qualification type for GPIO114 +#define GPIO_GPDQSEL2_GPIO115_S 6U +#define GPIO_GPDQSEL2_GPIO115_M 0xC0U // Select input qualification type for GPIO115 +#define GPIO_GPDQSEL2_GPIO116_S 8U +#define GPIO_GPDQSEL2_GPIO116_M 0x300U // Select input qualification type for GPIO116 +#define GPIO_GPDQSEL2_GPIO117_S 10U +#define GPIO_GPDQSEL2_GPIO117_M 0xC00U // Select input qualification type for GPIO117 +#define GPIO_GPDQSEL2_GPIO118_S 12U +#define GPIO_GPDQSEL2_GPIO118_M 0x3000U // Select input qualification type for GPIO118 +#define GPIO_GPDQSEL2_GPIO119_S 14U +#define GPIO_GPDQSEL2_GPIO119_M 0xC000U // Select input qualification type for GPIO119 +#define GPIO_GPDQSEL2_GPIO120_S 16U +#define GPIO_GPDQSEL2_GPIO120_M 0x30000U // Select input qualification type for GPIO120 +#define GPIO_GPDQSEL2_GPIO121_S 18U +#define GPIO_GPDQSEL2_GPIO121_M 0xC0000U // Select input qualification type for GPIO121 +#define GPIO_GPDQSEL2_GPIO122_S 20U +#define GPIO_GPDQSEL2_GPIO122_M 0x300000U // Select input qualification type for GPIO122 +#define GPIO_GPDQSEL2_GPIO123_S 22U +#define GPIO_GPDQSEL2_GPIO123_M 0xC00000U // Select input qualification type for GPIO123 +#define GPIO_GPDQSEL2_GPIO124_S 24U +#define GPIO_GPDQSEL2_GPIO124_M 0x3000000U // Select input qualification type for GPIO124 +#define GPIO_GPDQSEL2_GPIO125_S 26U +#define GPIO_GPDQSEL2_GPIO125_M 0xC000000U // Select input qualification type for GPIO125 +#define GPIO_GPDQSEL2_GPIO126_S 28U +#define GPIO_GPDQSEL2_GPIO126_M 0x30000000U // Select input qualification type for GPIO126 +#define GPIO_GPDQSEL2_GPIO127_S 30U +#define GPIO_GPDQSEL2_GPIO127_M 0xC0000000U // Select input qualification type for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDMUX1 register +// +//************************************************************************************************* +#define GPIO_GPDMUX1_GPIO96_S 0U +#define GPIO_GPDMUX1_GPIO96_M 0x3U // Defines pin-muxing selection for GPIO96 +#define GPIO_GPDMUX1_GPIO97_S 2U +#define GPIO_GPDMUX1_GPIO97_M 0xCU // Defines pin-muxing selection for GPIO97 +#define GPIO_GPDMUX1_GPIO98_S 4U +#define GPIO_GPDMUX1_GPIO98_M 0x30U // Defines pin-muxing selection for GPIO98 +#define GPIO_GPDMUX1_GPIO99_S 6U +#define GPIO_GPDMUX1_GPIO99_M 0xC0U // Defines pin-muxing selection for GPIO99 +#define GPIO_GPDMUX1_GPIO100_S 8U +#define GPIO_GPDMUX1_GPIO100_M 0x300U // Defines pin-muxing selection for GPIO100 +#define GPIO_GPDMUX1_GPIO101_S 10U +#define GPIO_GPDMUX1_GPIO101_M 0xC00U // Defines pin-muxing selection for GPIO101 +#define GPIO_GPDMUX1_GPIO102_S 12U +#define GPIO_GPDMUX1_GPIO102_M 0x3000U // Defines pin-muxing selection for GPIO102 +#define GPIO_GPDMUX1_GPIO103_S 14U +#define GPIO_GPDMUX1_GPIO103_M 0xC000U // Defines pin-muxing selection for GPIO103 +#define GPIO_GPDMUX1_GPIO104_S 16U +#define GPIO_GPDMUX1_GPIO104_M 0x30000U // Defines pin-muxing selection for GPIO104 +#define GPIO_GPDMUX1_GPIO105_S 18U +#define GPIO_GPDMUX1_GPIO105_M 0xC0000U // Defines pin-muxing selection for GPIO105 +#define GPIO_GPDMUX1_GPIO106_S 20U +#define GPIO_GPDMUX1_GPIO106_M 0x300000U // Defines pin-muxing selection for GPIO106 +#define GPIO_GPDMUX1_GPIO107_S 22U +#define GPIO_GPDMUX1_GPIO107_M 0xC00000U // Defines pin-muxing selection for GPIO107 +#define GPIO_GPDMUX1_GPIO108_S 24U +#define GPIO_GPDMUX1_GPIO108_M 0x3000000U // Defines pin-muxing selection for GPIO108 +#define GPIO_GPDMUX1_GPIO109_S 26U +#define GPIO_GPDMUX1_GPIO109_M 0xC000000U // Defines pin-muxing selection for GPIO109 +#define GPIO_GPDMUX1_GPIO110_S 28U +#define GPIO_GPDMUX1_GPIO110_M 0x30000000U // Defines pin-muxing selection for GPIO110 +#define GPIO_GPDMUX1_GPIO111_S 30U +#define GPIO_GPDMUX1_GPIO111_M 0xC0000000U // Defines pin-muxing selection for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDMUX2 register +// +//************************************************************************************************* +#define GPIO_GPDMUX2_GPIO112_S 0U +#define GPIO_GPDMUX2_GPIO112_M 0x3U // Defines pin-muxing selection for GPIO112 +#define GPIO_GPDMUX2_GPIO113_S 2U +#define GPIO_GPDMUX2_GPIO113_M 0xCU // Defines pin-muxing selection for GPIO113 +#define GPIO_GPDMUX2_GPIO114_S 4U +#define GPIO_GPDMUX2_GPIO114_M 0x30U // Defines pin-muxing selection for GPIO114 +#define GPIO_GPDMUX2_GPIO115_S 6U +#define GPIO_GPDMUX2_GPIO115_M 0xC0U // Defines pin-muxing selection for GPIO115 +#define GPIO_GPDMUX2_GPIO116_S 8U +#define GPIO_GPDMUX2_GPIO116_M 0x300U // Defines pin-muxing selection for GPIO116 +#define GPIO_GPDMUX2_GPIO117_S 10U +#define GPIO_GPDMUX2_GPIO117_M 0xC00U // Defines pin-muxing selection for GPIO117 +#define GPIO_GPDMUX2_GPIO118_S 12U +#define GPIO_GPDMUX2_GPIO118_M 0x3000U // Defines pin-muxing selection for GPIO118 +#define GPIO_GPDMUX2_GPIO119_S 14U +#define GPIO_GPDMUX2_GPIO119_M 0xC000U // Defines pin-muxing selection for GPIO119 +#define GPIO_GPDMUX2_GPIO120_S 16U +#define GPIO_GPDMUX2_GPIO120_M 0x30000U // Defines pin-muxing selection for GPIO120 +#define GPIO_GPDMUX2_GPIO121_S 18U +#define GPIO_GPDMUX2_GPIO121_M 0xC0000U // Defines pin-muxing selection for GPIO121 +#define GPIO_GPDMUX2_GPIO122_S 20U +#define GPIO_GPDMUX2_GPIO122_M 0x300000U // Defines pin-muxing selection for GPIO122 +#define GPIO_GPDMUX2_GPIO123_S 22U +#define GPIO_GPDMUX2_GPIO123_M 0xC00000U // Defines pin-muxing selection for GPIO123 +#define GPIO_GPDMUX2_GPIO124_S 24U +#define GPIO_GPDMUX2_GPIO124_M 0x3000000U // Defines pin-muxing selection for GPIO124 +#define GPIO_GPDMUX2_GPIO125_S 26U +#define GPIO_GPDMUX2_GPIO125_M 0xC000000U // Defines pin-muxing selection for GPIO125 +#define GPIO_GPDMUX2_GPIO126_S 28U +#define GPIO_GPDMUX2_GPIO126_M 0x30000000U // Defines pin-muxing selection for GPIO126 +#define GPIO_GPDMUX2_GPIO127_S 30U +#define GPIO_GPDMUX2_GPIO127_M 0xC0000000U // Defines pin-muxing selection for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDDIR register +// +//************************************************************************************************* +#define GPIO_GPDDIR_GPIO96 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO97 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO98 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO99 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO100 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO101 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO102 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO103 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO104 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO105 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO106 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO107 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO108 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO109 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO110 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO111 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO112 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO113 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO114 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO115 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO116 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO117 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO118 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO119 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO120 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO121 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO122 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO123 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO124 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO125 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO126 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPDDIR_GPIO127 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDPUD register +// +//************************************************************************************************* +#define GPIO_GPDPUD_GPIO96 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO97 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO98 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO99 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO100 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO101 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO102 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO103 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO104 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO105 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO106 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO107 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO108 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO109 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO110 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO111 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO112 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO113 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO114 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO115 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO116 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO117 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO118 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO119 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO120 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO121 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO122 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO123 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO124 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO125 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO126 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPDPUD_GPIO127 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDINV register +// +//************************************************************************************************* +#define GPIO_GPDINV_GPIO96 0x1U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO97 0x2U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO98 0x4U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO99 0x8U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO100 0x10U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO101 0x20U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO102 0x40U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO103 0x80U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO104 0x100U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO105 0x200U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO106 0x400U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO107 0x800U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO108 0x1000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO109 0x2000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO110 0x4000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO111 0x8000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO112 0x10000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO113 0x20000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO114 0x40000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO115 0x80000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO116 0x100000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO117 0x200000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO118 0x400000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO119 0x800000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO120 0x1000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO121 0x2000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO122 0x4000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO123 0x8000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO124 0x10000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO125 0x20000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO126 0x40000000U // Input inversion control for this pin +#define GPIO_GPDINV_GPIO127 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDODR register +// +//************************************************************************************************* +#define GPIO_GPDODR_GPIO96 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO97 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO98 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO99 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO100 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO101 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO102 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO103 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO104 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO105 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO106 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO107 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO108 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO109 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO110 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO111 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO112 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO113 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO114 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO115 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO116 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO117 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO118 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO119 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO120 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO121 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO122 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO123 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO124 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO125 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO126 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPDODR_GPIO127 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPDGMUX1_GPIO96_S 0U +#define GPIO_GPDGMUX1_GPIO96_M 0x3U // Defines pin-muxing selection for GPIO96 +#define GPIO_GPDGMUX1_GPIO97_S 2U +#define GPIO_GPDGMUX1_GPIO97_M 0xCU // Defines pin-muxing selection for GPIO97 +#define GPIO_GPDGMUX1_GPIO98_S 4U +#define GPIO_GPDGMUX1_GPIO98_M 0x30U // Defines pin-muxing selection for GPIO98 +#define GPIO_GPDGMUX1_GPIO99_S 6U +#define GPIO_GPDGMUX1_GPIO99_M 0xC0U // Defines pin-muxing selection for GPIO99 +#define GPIO_GPDGMUX1_GPIO100_S 8U +#define GPIO_GPDGMUX1_GPIO100_M 0x300U // Defines pin-muxing selection for GPIO100 +#define GPIO_GPDGMUX1_GPIO101_S 10U +#define GPIO_GPDGMUX1_GPIO101_M 0xC00U // Defines pin-muxing selection for GPIO101 +#define GPIO_GPDGMUX1_GPIO102_S 12U +#define GPIO_GPDGMUX1_GPIO102_M 0x3000U // Defines pin-muxing selection for GPIO102 +#define GPIO_GPDGMUX1_GPIO103_S 14U +#define GPIO_GPDGMUX1_GPIO103_M 0xC000U // Defines pin-muxing selection for GPIO103 +#define GPIO_GPDGMUX1_GPIO104_S 16U +#define GPIO_GPDGMUX1_GPIO104_M 0x30000U // Defines pin-muxing selection for GPIO104 +#define GPIO_GPDGMUX1_GPIO105_S 18U +#define GPIO_GPDGMUX1_GPIO105_M 0xC0000U // Defines pin-muxing selection for GPIO105 +#define GPIO_GPDGMUX1_GPIO106_S 20U +#define GPIO_GPDGMUX1_GPIO106_M 0x300000U // Defines pin-muxing selection for GPIO106 +#define GPIO_GPDGMUX1_GPIO107_S 22U +#define GPIO_GPDGMUX1_GPIO107_M 0xC00000U // Defines pin-muxing selection for GPIO107 +#define GPIO_GPDGMUX1_GPIO108_S 24U +#define GPIO_GPDGMUX1_GPIO108_M 0x3000000U // Defines pin-muxing selection for GPIO108 +#define GPIO_GPDGMUX1_GPIO109_S 26U +#define GPIO_GPDGMUX1_GPIO109_M 0xC000000U // Defines pin-muxing selection for GPIO109 +#define GPIO_GPDGMUX1_GPIO110_S 28U +#define GPIO_GPDGMUX1_GPIO110_M 0x30000000U // Defines pin-muxing selection for GPIO110 +#define GPIO_GPDGMUX1_GPIO111_S 30U +#define GPIO_GPDGMUX1_GPIO111_M 0xC0000000U // Defines pin-muxing selection for GPIO111 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPDGMUX2_GPIO112_S 0U +#define GPIO_GPDGMUX2_GPIO112_M 0x3U // Defines pin-muxing selection for GPIO112 +#define GPIO_GPDGMUX2_GPIO113_S 2U +#define GPIO_GPDGMUX2_GPIO113_M 0xCU // Defines pin-muxing selection for GPIO113 +#define GPIO_GPDGMUX2_GPIO114_S 4U +#define GPIO_GPDGMUX2_GPIO114_M 0x30U // Defines pin-muxing selection for GPIO114 +#define GPIO_GPDGMUX2_GPIO115_S 6U +#define GPIO_GPDGMUX2_GPIO115_M 0xC0U // Defines pin-muxing selection for GPIO115 +#define GPIO_GPDGMUX2_GPIO116_S 8U +#define GPIO_GPDGMUX2_GPIO116_M 0x300U // Defines pin-muxing selection for GPIO116 +#define GPIO_GPDGMUX2_GPIO117_S 10U +#define GPIO_GPDGMUX2_GPIO117_M 0xC00U // Defines pin-muxing selection for GPIO117 +#define GPIO_GPDGMUX2_GPIO118_S 12U +#define GPIO_GPDGMUX2_GPIO118_M 0x3000U // Defines pin-muxing selection for GPIO118 +#define GPIO_GPDGMUX2_GPIO119_S 14U +#define GPIO_GPDGMUX2_GPIO119_M 0xC000U // Defines pin-muxing selection for GPIO119 +#define GPIO_GPDGMUX2_GPIO120_S 16U +#define GPIO_GPDGMUX2_GPIO120_M 0x30000U // Defines pin-muxing selection for GPIO120 +#define GPIO_GPDGMUX2_GPIO121_S 18U +#define GPIO_GPDGMUX2_GPIO121_M 0xC0000U // Defines pin-muxing selection for GPIO121 +#define GPIO_GPDGMUX2_GPIO122_S 20U +#define GPIO_GPDGMUX2_GPIO122_M 0x300000U // Defines pin-muxing selection for GPIO122 +#define GPIO_GPDGMUX2_GPIO123_S 22U +#define GPIO_GPDGMUX2_GPIO123_M 0xC00000U // Defines pin-muxing selection for GPIO123 +#define GPIO_GPDGMUX2_GPIO124_S 24U +#define GPIO_GPDGMUX2_GPIO124_M 0x3000000U // Defines pin-muxing selection for GPIO124 +#define GPIO_GPDGMUX2_GPIO125_S 26U +#define GPIO_GPDGMUX2_GPIO125_M 0xC000000U // Defines pin-muxing selection for GPIO125 +#define GPIO_GPDGMUX2_GPIO126_S 28U +#define GPIO_GPDGMUX2_GPIO126_M 0x30000000U // Defines pin-muxing selection for GPIO126 +#define GPIO_GPDGMUX2_GPIO127_S 30U +#define GPIO_GPDGMUX2_GPIO127_M 0xC0000000U // Defines pin-muxing selection for GPIO127 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL1_GPIO96_S 0U +#define GPIO_GPDCSEL1_GPIO96_M 0xFU // GPIO96 Master CPU Select +#define GPIO_GPDCSEL1_GPIO97_S 4U +#define GPIO_GPDCSEL1_GPIO97_M 0xF0U // GPIO97 Master CPU Select +#define GPIO_GPDCSEL1_GPIO98_S 8U +#define GPIO_GPDCSEL1_GPIO98_M 0xF00U // GPIO98 Master CPU Select +#define GPIO_GPDCSEL1_GPIO99_S 12U +#define GPIO_GPDCSEL1_GPIO99_M 0xF000U // GPIO99 Master CPU Select +#define GPIO_GPDCSEL1_GPIO100_S 16U +#define GPIO_GPDCSEL1_GPIO100_M 0xF0000U // GPIO100 Master CPU Select +#define GPIO_GPDCSEL1_GPIO101_S 20U +#define GPIO_GPDCSEL1_GPIO101_M 0xF00000U // GPIO101 Master CPU Select +#define GPIO_GPDCSEL1_GPIO102_S 24U +#define GPIO_GPDCSEL1_GPIO102_M 0xF000000U // GPIO102 Master CPU Select +#define GPIO_GPDCSEL1_GPIO103_S 28U +#define GPIO_GPDCSEL1_GPIO103_M 0xF0000000U // GPIO103 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL2_GPIO104_S 0U +#define GPIO_GPDCSEL2_GPIO104_M 0xFU // GPIO104 Master CPU Select +#define GPIO_GPDCSEL2_GPIO105_S 4U +#define GPIO_GPDCSEL2_GPIO105_M 0xF0U // GPIO105 Master CPU Select +#define GPIO_GPDCSEL2_GPIO106_S 8U +#define GPIO_GPDCSEL2_GPIO106_M 0xF00U // GPIO106 Master CPU Select +#define GPIO_GPDCSEL2_GPIO107_S 12U +#define GPIO_GPDCSEL2_GPIO107_M 0xF000U // GPIO107 Master CPU Select +#define GPIO_GPDCSEL2_GPIO108_S 16U +#define GPIO_GPDCSEL2_GPIO108_M 0xF0000U // GPIO108 Master CPU Select +#define GPIO_GPDCSEL2_GPIO109_S 20U +#define GPIO_GPDCSEL2_GPIO109_M 0xF00000U // GPIO109 Master CPU Select +#define GPIO_GPDCSEL2_GPIO110_S 24U +#define GPIO_GPDCSEL2_GPIO110_M 0xF000000U // GPIO110 Master CPU Select +#define GPIO_GPDCSEL2_GPIO111_S 28U +#define GPIO_GPDCSEL2_GPIO111_M 0xF0000000U // GPIO111 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL3 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL3_GPIO112_S 0U +#define GPIO_GPDCSEL3_GPIO112_M 0xFU // GPIO112 Master CPU Select +#define GPIO_GPDCSEL3_GPIO113_S 4U +#define GPIO_GPDCSEL3_GPIO113_M 0xF0U // GPIO113 Master CPU Select +#define GPIO_GPDCSEL3_GPIO114_S 8U +#define GPIO_GPDCSEL3_GPIO114_M 0xF00U // GPIO114 Master CPU Select +#define GPIO_GPDCSEL3_GPIO115_S 12U +#define GPIO_GPDCSEL3_GPIO115_M 0xF000U // GPIO115 Master CPU Select +#define GPIO_GPDCSEL3_GPIO116_S 16U +#define GPIO_GPDCSEL3_GPIO116_M 0xF0000U // GPIO116 Master CPU Select +#define GPIO_GPDCSEL3_GPIO117_S 20U +#define GPIO_GPDCSEL3_GPIO117_M 0xF00000U // GPIO117 Master CPU Select +#define GPIO_GPDCSEL3_GPIO118_S 24U +#define GPIO_GPDCSEL3_GPIO118_M 0xF000000U // GPIO118 Master CPU Select +#define GPIO_GPDCSEL3_GPIO119_S 28U +#define GPIO_GPDCSEL3_GPIO119_M 0xF0000000U // GPIO119 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCSEL4 register +// +//************************************************************************************************* +#define GPIO_GPDCSEL4_GPIO120_S 0U +#define GPIO_GPDCSEL4_GPIO120_M 0xFU // GPIO120 Master CPU Select +#define GPIO_GPDCSEL4_GPIO121_S 4U +#define GPIO_GPDCSEL4_GPIO121_M 0xF0U // GPIO121 Master CPU Select +#define GPIO_GPDCSEL4_GPIO122_S 8U +#define GPIO_GPDCSEL4_GPIO122_M 0xF00U // GPIO122 Master CPU Select +#define GPIO_GPDCSEL4_GPIO123_S 12U +#define GPIO_GPDCSEL4_GPIO123_M 0xF000U // GPIO123 Master CPU Select +#define GPIO_GPDCSEL4_GPIO124_S 16U +#define GPIO_GPDCSEL4_GPIO124_M 0xF0000U // GPIO124 Master CPU Select +#define GPIO_GPDCSEL4_GPIO125_S 20U +#define GPIO_GPDCSEL4_GPIO125_M 0xF00000U // GPIO125 Master CPU Select +#define GPIO_GPDCSEL4_GPIO126_S 24U +#define GPIO_GPDCSEL4_GPIO126_M 0xF000000U // GPIO126 Master CPU Select +#define GPIO_GPDCSEL4_GPIO127_S 28U +#define GPIO_GPDCSEL4_GPIO127_M 0xF0000000U // GPIO127 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDLOCK register +// +//************************************************************************************************* +#define GPIO_GPDLOCK_GPIO96 0x1U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO97 0x2U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO98 0x4U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO99 0x8U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO100 0x10U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO101 0x20U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO102 0x40U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO103 0x80U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO104 0x100U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO105 0x200U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO106 0x400U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO107 0x800U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO108 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO109 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO110 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO111 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO112 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO113 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO114 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO115 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO116 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO117 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO118 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO119 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO120 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO121 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO122 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO123 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO124 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO125 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO126 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPDLOCK_GPIO127 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCR register +// +//************************************************************************************************* +#define GPIO_GPDCR_GPIO96 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO97 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO98 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO99 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO100 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO101 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO102 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO103 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO104 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO105 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO106 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO107 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO108 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO109 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO110 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO111 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO112 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO113 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO114 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO115 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO116 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO117 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO118 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO119 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO120 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO121 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO122 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO123 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO124 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO125 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO126 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPDCR_GPIO127 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECTRL register +// +//************************************************************************************************* +#define GPIO_GPECTRL_QUALPRD0_S 0U +#define GPIO_GPECTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO128 to + // GPIO135 +#define GPIO_GPECTRL_QUALPRD1_S 8U +#define GPIO_GPECTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO136 to + // GPIO143 +#define GPIO_GPECTRL_QUALPRD2_S 16U +#define GPIO_GPECTRL_QUALPRD2_M 0xFF0000U // Qualification sampling period for GPIO144 to + // GPIO151 +#define GPIO_GPECTRL_QUALPRD3_S 24U +#define GPIO_GPECTRL_QUALPRD3_M 0xFF000000U // Qualification sampling period for GPIO152 to + // GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPEQSEL1_GPIO128_S 0U +#define GPIO_GPEQSEL1_GPIO128_M 0x3U // Select input qualification type for GPIO128 +#define GPIO_GPEQSEL1_GPIO129_S 2U +#define GPIO_GPEQSEL1_GPIO129_M 0xCU // Select input qualification type for GPIO129 +#define GPIO_GPEQSEL1_GPIO130_S 4U +#define GPIO_GPEQSEL1_GPIO130_M 0x30U // Select input qualification type for GPIO130 +#define GPIO_GPEQSEL1_GPIO131_S 6U +#define GPIO_GPEQSEL1_GPIO131_M 0xC0U // Select input qualification type for GPIO131 +#define GPIO_GPEQSEL1_GPIO132_S 8U +#define GPIO_GPEQSEL1_GPIO132_M 0x300U // Select input qualification type for GPIO132 +#define GPIO_GPEQSEL1_GPIO133_S 10U +#define GPIO_GPEQSEL1_GPIO133_M 0xC00U // Select input qualification type for GPIO133 +#define GPIO_GPEQSEL1_GPIO134_S 12U +#define GPIO_GPEQSEL1_GPIO134_M 0x3000U // Select input qualification type for GPIO134 +#define GPIO_GPEQSEL1_GPIO135_S 14U +#define GPIO_GPEQSEL1_GPIO135_M 0xC000U // Select input qualification type for GPIO135 +#define GPIO_GPEQSEL1_GPIO136_S 16U +#define GPIO_GPEQSEL1_GPIO136_M 0x30000U // Select input qualification type for GPIO136 +#define GPIO_GPEQSEL1_GPIO137_S 18U +#define GPIO_GPEQSEL1_GPIO137_M 0xC0000U // Select input qualification type for GPIO137 +#define GPIO_GPEQSEL1_GPIO138_S 20U +#define GPIO_GPEQSEL1_GPIO138_M 0x300000U // Select input qualification type for GPIO138 +#define GPIO_GPEQSEL1_GPIO139_S 22U +#define GPIO_GPEQSEL1_GPIO139_M 0xC00000U // Select input qualification type for GPIO139 +#define GPIO_GPEQSEL1_GPIO140_S 24U +#define GPIO_GPEQSEL1_GPIO140_M 0x3000000U // Select input qualification type for GPIO140 +#define GPIO_GPEQSEL1_GPIO141_S 26U +#define GPIO_GPEQSEL1_GPIO141_M 0xC000000U // Select input qualification type for GPIO141 +#define GPIO_GPEQSEL1_GPIO142_S 28U +#define GPIO_GPEQSEL1_GPIO142_M 0x30000000U // Select input qualification type for GPIO142 +#define GPIO_GPEQSEL1_GPIO143_S 30U +#define GPIO_GPEQSEL1_GPIO143_M 0xC0000000U // Select input qualification type for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEQSEL2 register +// +//************************************************************************************************* +#define GPIO_GPEQSEL2_GPIO144_S 0U +#define GPIO_GPEQSEL2_GPIO144_M 0x3U // Select input qualification type for GPIO144 +#define GPIO_GPEQSEL2_GPIO145_S 2U +#define GPIO_GPEQSEL2_GPIO145_M 0xCU // Select input qualification type for GPIO145 +#define GPIO_GPEQSEL2_GPIO146_S 4U +#define GPIO_GPEQSEL2_GPIO146_M 0x30U // Select input qualification type for GPIO146 +#define GPIO_GPEQSEL2_GPIO147_S 6U +#define GPIO_GPEQSEL2_GPIO147_M 0xC0U // Select input qualification type for GPIO147 +#define GPIO_GPEQSEL2_GPIO148_S 8U +#define GPIO_GPEQSEL2_GPIO148_M 0x300U // Select input qualification type for GPIO148 +#define GPIO_GPEQSEL2_GPIO149_S 10U +#define GPIO_GPEQSEL2_GPIO149_M 0xC00U // Select input qualification type for GPIO149 +#define GPIO_GPEQSEL2_GPIO150_S 12U +#define GPIO_GPEQSEL2_GPIO150_M 0x3000U // Select input qualification type for GPIO150 +#define GPIO_GPEQSEL2_GPIO151_S 14U +#define GPIO_GPEQSEL2_GPIO151_M 0xC000U // Select input qualification type for GPIO151 +#define GPIO_GPEQSEL2_GPIO152_S 16U +#define GPIO_GPEQSEL2_GPIO152_M 0x30000U // Select input qualification type for GPIO152 +#define GPIO_GPEQSEL2_GPIO153_S 18U +#define GPIO_GPEQSEL2_GPIO153_M 0xC0000U // Select input qualification type for GPIO153 +#define GPIO_GPEQSEL2_GPIO154_S 20U +#define GPIO_GPEQSEL2_GPIO154_M 0x300000U // Select input qualification type for GPIO154 +#define GPIO_GPEQSEL2_GPIO155_S 22U +#define GPIO_GPEQSEL2_GPIO155_M 0xC00000U // Select input qualification type for GPIO155 +#define GPIO_GPEQSEL2_GPIO156_S 24U +#define GPIO_GPEQSEL2_GPIO156_M 0x3000000U // Select input qualification type for GPIO156 +#define GPIO_GPEQSEL2_GPIO157_S 26U +#define GPIO_GPEQSEL2_GPIO157_M 0xC000000U // Select input qualification type for GPIO157 +#define GPIO_GPEQSEL2_GPIO158_S 28U +#define GPIO_GPEQSEL2_GPIO158_M 0x30000000U // Select input qualification type for GPIO158 +#define GPIO_GPEQSEL2_GPIO159_S 30U +#define GPIO_GPEQSEL2_GPIO159_M 0xC0000000U // Select input qualification type for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEMUX1 register +// +//************************************************************************************************* +#define GPIO_GPEMUX1_GPIO128_S 0U +#define GPIO_GPEMUX1_GPIO128_M 0x3U // Defines pin-muxing selection for GPIO128 +#define GPIO_GPEMUX1_GPIO129_S 2U +#define GPIO_GPEMUX1_GPIO129_M 0xCU // Defines pin-muxing selection for GPIO129 +#define GPIO_GPEMUX1_GPIO130_S 4U +#define GPIO_GPEMUX1_GPIO130_M 0x30U // Defines pin-muxing selection for GPIO130 +#define GPIO_GPEMUX1_GPIO131_S 6U +#define GPIO_GPEMUX1_GPIO131_M 0xC0U // Defines pin-muxing selection for GPIO131 +#define GPIO_GPEMUX1_GPIO132_S 8U +#define GPIO_GPEMUX1_GPIO132_M 0x300U // Defines pin-muxing selection for GPIO132 +#define GPIO_GPEMUX1_GPIO133_S 10U +#define GPIO_GPEMUX1_GPIO133_M 0xC00U // Defines pin-muxing selection for GPIO133 +#define GPIO_GPEMUX1_GPIO134_S 12U +#define GPIO_GPEMUX1_GPIO134_M 0x3000U // Defines pin-muxing selection for GPIO134 +#define GPIO_GPEMUX1_GPIO135_S 14U +#define GPIO_GPEMUX1_GPIO135_M 0xC000U // Defines pin-muxing selection for GPIO135 +#define GPIO_GPEMUX1_GPIO136_S 16U +#define GPIO_GPEMUX1_GPIO136_M 0x30000U // Defines pin-muxing selection for GPIO136 +#define GPIO_GPEMUX1_GPIO137_S 18U +#define GPIO_GPEMUX1_GPIO137_M 0xC0000U // Defines pin-muxing selection for GPIO137 +#define GPIO_GPEMUX1_GPIO138_S 20U +#define GPIO_GPEMUX1_GPIO138_M 0x300000U // Defines pin-muxing selection for GPIO138 +#define GPIO_GPEMUX1_GPIO139_S 22U +#define GPIO_GPEMUX1_GPIO139_M 0xC00000U // Defines pin-muxing selection for GPIO139 +#define GPIO_GPEMUX1_GPIO140_S 24U +#define GPIO_GPEMUX1_GPIO140_M 0x3000000U // Defines pin-muxing selection for GPIO140 +#define GPIO_GPEMUX1_GPIO141_S 26U +#define GPIO_GPEMUX1_GPIO141_M 0xC000000U // Defines pin-muxing selection for GPIO141 +#define GPIO_GPEMUX1_GPIO142_S 28U +#define GPIO_GPEMUX1_GPIO142_M 0x30000000U // Defines pin-muxing selection for GPIO142 +#define GPIO_GPEMUX1_GPIO143_S 30U +#define GPIO_GPEMUX1_GPIO143_M 0xC0000000U // Defines pin-muxing selection for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEMUX2 register +// +//************************************************************************************************* +#define GPIO_GPEMUX2_GPIO144_S 0U +#define GPIO_GPEMUX2_GPIO144_M 0x3U // Defines pin-muxing selection for GPIO144 +#define GPIO_GPEMUX2_GPIO145_S 2U +#define GPIO_GPEMUX2_GPIO145_M 0xCU // Defines pin-muxing selection for GPIO145 +#define GPIO_GPEMUX2_GPIO146_S 4U +#define GPIO_GPEMUX2_GPIO146_M 0x30U // Defines pin-muxing selection for GPIO146 +#define GPIO_GPEMUX2_GPIO147_S 6U +#define GPIO_GPEMUX2_GPIO147_M 0xC0U // Defines pin-muxing selection for GPIO147 +#define GPIO_GPEMUX2_GPIO148_S 8U +#define GPIO_GPEMUX2_GPIO148_M 0x300U // Defines pin-muxing selection for GPIO148 +#define GPIO_GPEMUX2_GPIO149_S 10U +#define GPIO_GPEMUX2_GPIO149_M 0xC00U // Defines pin-muxing selection for GPIO149 +#define GPIO_GPEMUX2_GPIO150_S 12U +#define GPIO_GPEMUX2_GPIO150_M 0x3000U // Defines pin-muxing selection for GPIO150 +#define GPIO_GPEMUX2_GPIO151_S 14U +#define GPIO_GPEMUX2_GPIO151_M 0xC000U // Defines pin-muxing selection for GPIO151 +#define GPIO_GPEMUX2_GPIO152_S 16U +#define GPIO_GPEMUX2_GPIO152_M 0x30000U // Defines pin-muxing selection for GPIO152 +#define GPIO_GPEMUX2_GPIO153_S 18U +#define GPIO_GPEMUX2_GPIO153_M 0xC0000U // Defines pin-muxing selection for GPIO153 +#define GPIO_GPEMUX2_GPIO154_S 20U +#define GPIO_GPEMUX2_GPIO154_M 0x300000U // Defines pin-muxing selection for GPIO154 +#define GPIO_GPEMUX2_GPIO155_S 22U +#define GPIO_GPEMUX2_GPIO155_M 0xC00000U // Defines pin-muxing selection for GPIO155 +#define GPIO_GPEMUX2_GPIO156_S 24U +#define GPIO_GPEMUX2_GPIO156_M 0x3000000U // Defines pin-muxing selection for GPIO156 +#define GPIO_GPEMUX2_GPIO157_S 26U +#define GPIO_GPEMUX2_GPIO157_M 0xC000000U // Defines pin-muxing selection for GPIO157 +#define GPIO_GPEMUX2_GPIO158_S 28U +#define GPIO_GPEMUX2_GPIO158_M 0x30000000U // Defines pin-muxing selection for GPIO158 +#define GPIO_GPEMUX2_GPIO159_S 30U +#define GPIO_GPEMUX2_GPIO159_M 0xC0000000U // Defines pin-muxing selection for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEDIR register +// +//************************************************************************************************* +#define GPIO_GPEDIR_GPIO128 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO129 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO130 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO131 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO132 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO133 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO134 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO135 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO136 0x100U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO137 0x200U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO138 0x400U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO139 0x800U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO140 0x1000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO141 0x2000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO142 0x4000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO143 0x8000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO144 0x10000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO145 0x20000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO146 0x40000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO147 0x80000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO148 0x100000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO149 0x200000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO150 0x400000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO151 0x800000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO152 0x1000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO153 0x2000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO154 0x4000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO155 0x8000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO156 0x10000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO157 0x20000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO158 0x40000000U // Defines direction for this pin in GPIO mode +#define GPIO_GPEDIR_GPIO159 0x80000000U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEPUD register +// +//************************************************************************************************* +#define GPIO_GPEPUD_GPIO128 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO129 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO130 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO131 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO132 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO133 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO134 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO135 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO136 0x100U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO137 0x200U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO138 0x400U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO139 0x800U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO140 0x1000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO141 0x2000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO142 0x4000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO143 0x8000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO144 0x10000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO145 0x20000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO146 0x40000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO147 0x80000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO148 0x100000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO149 0x200000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO150 0x400000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO151 0x800000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO152 0x1000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO153 0x2000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO154 0x4000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO155 0x8000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO156 0x10000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO157 0x20000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO158 0x40000000U // Pull-Up Disable control for this pin +#define GPIO_GPEPUD_GPIO159 0x80000000U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEINV register +// +//************************************************************************************************* +#define GPIO_GPEINV_GPIO128 0x1U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO129 0x2U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO130 0x4U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO131 0x8U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO132 0x10U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO133 0x20U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO134 0x40U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO135 0x80U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO136 0x100U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO137 0x200U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO138 0x400U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO139 0x800U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO140 0x1000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO141 0x2000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO142 0x4000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO143 0x8000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO144 0x10000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO145 0x20000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO146 0x40000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO147 0x80000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO148 0x100000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO149 0x200000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO150 0x400000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO151 0x800000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO152 0x1000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO153 0x2000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO154 0x4000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO155 0x8000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO156 0x10000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO157 0x20000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO158 0x40000000U // Input inversion control for this pin +#define GPIO_GPEINV_GPIO159 0x80000000U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEODR register +// +//************************************************************************************************* +#define GPIO_GPEODR_GPIO128 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO129 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO130 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO131 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO132 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO133 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO134 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO135 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO136 0x100U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO137 0x200U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO138 0x400U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO139 0x800U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO140 0x1000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO141 0x2000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO142 0x4000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO143 0x8000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO144 0x10000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO145 0x20000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO146 0x40000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO147 0x80000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO148 0x100000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO149 0x200000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO150 0x400000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO151 0x800000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO152 0x1000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO153 0x2000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO154 0x4000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO155 0x8000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO156 0x10000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO157 0x20000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO158 0x40000000U // Outpout Open-Drain control for this pin +#define GPIO_GPEODR_GPIO159 0x80000000U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPEGMUX1_GPIO128_S 0U +#define GPIO_GPEGMUX1_GPIO128_M 0x3U // Defines pin-muxing selection for GPIO128 +#define GPIO_GPEGMUX1_GPIO129_S 2U +#define GPIO_GPEGMUX1_GPIO129_M 0xCU // Defines pin-muxing selection for GPIO129 +#define GPIO_GPEGMUX1_GPIO130_S 4U +#define GPIO_GPEGMUX1_GPIO130_M 0x30U // Defines pin-muxing selection for GPIO130 +#define GPIO_GPEGMUX1_GPIO131_S 6U +#define GPIO_GPEGMUX1_GPIO131_M 0xC0U // Defines pin-muxing selection for GPIO131 +#define GPIO_GPEGMUX1_GPIO132_S 8U +#define GPIO_GPEGMUX1_GPIO132_M 0x300U // Defines pin-muxing selection for GPIO132 +#define GPIO_GPEGMUX1_GPIO133_S 10U +#define GPIO_GPEGMUX1_GPIO133_M 0xC00U // Defines pin-muxing selection for GPIO133 +#define GPIO_GPEGMUX1_GPIO134_S 12U +#define GPIO_GPEGMUX1_GPIO134_M 0x3000U // Defines pin-muxing selection for GPIO134 +#define GPIO_GPEGMUX1_GPIO135_S 14U +#define GPIO_GPEGMUX1_GPIO135_M 0xC000U // Defines pin-muxing selection for GPIO135 +#define GPIO_GPEGMUX1_GPIO136_S 16U +#define GPIO_GPEGMUX1_GPIO136_M 0x30000U // Defines pin-muxing selection for GPIO136 +#define GPIO_GPEGMUX1_GPIO137_S 18U +#define GPIO_GPEGMUX1_GPIO137_M 0xC0000U // Defines pin-muxing selection for GPIO137 +#define GPIO_GPEGMUX1_GPIO138_S 20U +#define GPIO_GPEGMUX1_GPIO138_M 0x300000U // Defines pin-muxing selection for GPIO138 +#define GPIO_GPEGMUX1_GPIO139_S 22U +#define GPIO_GPEGMUX1_GPIO139_M 0xC00000U // Defines pin-muxing selection for GPIO139 +#define GPIO_GPEGMUX1_GPIO140_S 24U +#define GPIO_GPEGMUX1_GPIO140_M 0x3000000U // Defines pin-muxing selection for GPIO140 +#define GPIO_GPEGMUX1_GPIO141_S 26U +#define GPIO_GPEGMUX1_GPIO141_M 0xC000000U // Defines pin-muxing selection for GPIO141 +#define GPIO_GPEGMUX1_GPIO142_S 28U +#define GPIO_GPEGMUX1_GPIO142_M 0x30000000U // Defines pin-muxing selection for GPIO142 +#define GPIO_GPEGMUX1_GPIO143_S 30U +#define GPIO_GPEGMUX1_GPIO143_M 0xC0000000U // Defines pin-muxing selection for GPIO143 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEGMUX2 register +// +//************************************************************************************************* +#define GPIO_GPEGMUX2_GPIO144_S 0U +#define GPIO_GPEGMUX2_GPIO144_M 0x3U // Defines pin-muxing selection for GPIO144 +#define GPIO_GPEGMUX2_GPIO145_S 2U +#define GPIO_GPEGMUX2_GPIO145_M 0xCU // Defines pin-muxing selection for GPIO145 +#define GPIO_GPEGMUX2_GPIO146_S 4U +#define GPIO_GPEGMUX2_GPIO146_M 0x30U // Defines pin-muxing selection for GPIO146 +#define GPIO_GPEGMUX2_GPIO147_S 6U +#define GPIO_GPEGMUX2_GPIO147_M 0xC0U // Defines pin-muxing selection for GPIO147 +#define GPIO_GPEGMUX2_GPIO148_S 8U +#define GPIO_GPEGMUX2_GPIO148_M 0x300U // Defines pin-muxing selection for GPIO148 +#define GPIO_GPEGMUX2_GPIO149_S 10U +#define GPIO_GPEGMUX2_GPIO149_M 0xC00U // Defines pin-muxing selection for GPIO149 +#define GPIO_GPEGMUX2_GPIO150_S 12U +#define GPIO_GPEGMUX2_GPIO150_M 0x3000U // Defines pin-muxing selection for GPIO150 +#define GPIO_GPEGMUX2_GPIO151_S 14U +#define GPIO_GPEGMUX2_GPIO151_M 0xC000U // Defines pin-muxing selection for GPIO151 +#define GPIO_GPEGMUX2_GPIO152_S 16U +#define GPIO_GPEGMUX2_GPIO152_M 0x30000U // Defines pin-muxing selection for GPIO152 +#define GPIO_GPEGMUX2_GPIO153_S 18U +#define GPIO_GPEGMUX2_GPIO153_M 0xC0000U // Defines pin-muxing selection for GPIO153 +#define GPIO_GPEGMUX2_GPIO154_S 20U +#define GPIO_GPEGMUX2_GPIO154_M 0x300000U // Defines pin-muxing selection for GPIO154 +#define GPIO_GPEGMUX2_GPIO155_S 22U +#define GPIO_GPEGMUX2_GPIO155_M 0xC00000U // Defines pin-muxing selection for GPIO155 +#define GPIO_GPEGMUX2_GPIO156_S 24U +#define GPIO_GPEGMUX2_GPIO156_M 0x3000000U // Defines pin-muxing selection for GPIO156 +#define GPIO_GPEGMUX2_GPIO157_S 26U +#define GPIO_GPEGMUX2_GPIO157_M 0xC000000U // Defines pin-muxing selection for GPIO157 +#define GPIO_GPEGMUX2_GPIO158_S 28U +#define GPIO_GPEGMUX2_GPIO158_M 0x30000000U // Defines pin-muxing selection for GPIO158 +#define GPIO_GPEGMUX2_GPIO159_S 30U +#define GPIO_GPEGMUX2_GPIO159_M 0xC0000000U // Defines pin-muxing selection for GPIO159 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL1 register +// +//************************************************************************************************* +#define GPIO_GPECSEL1_GPIO128_S 0U +#define GPIO_GPECSEL1_GPIO128_M 0xFU // GPIO128 Master CPU Select +#define GPIO_GPECSEL1_GPIO129_S 4U +#define GPIO_GPECSEL1_GPIO129_M 0xF0U // GPIO129 Master CPU Select +#define GPIO_GPECSEL1_GPIO130_S 8U +#define GPIO_GPECSEL1_GPIO130_M 0xF00U // GPIO130 Master CPU Select +#define GPIO_GPECSEL1_GPIO131_S 12U +#define GPIO_GPECSEL1_GPIO131_M 0xF000U // GPIO131 Master CPU Select +#define GPIO_GPECSEL1_GPIO132_S 16U +#define GPIO_GPECSEL1_GPIO132_M 0xF0000U // GPIO132 Master CPU Select +#define GPIO_GPECSEL1_GPIO133_S 20U +#define GPIO_GPECSEL1_GPIO133_M 0xF00000U // GPIO133 Master CPU Select +#define GPIO_GPECSEL1_GPIO134_S 24U +#define GPIO_GPECSEL1_GPIO134_M 0xF000000U // GPIO134 Master CPU Select +#define GPIO_GPECSEL1_GPIO135_S 28U +#define GPIO_GPECSEL1_GPIO135_M 0xF0000000U // GPIO135 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL2 register +// +//************************************************************************************************* +#define GPIO_GPECSEL2_GPIO136_S 0U +#define GPIO_GPECSEL2_GPIO136_M 0xFU // GPIO136 Master CPU Select +#define GPIO_GPECSEL2_GPIO137_S 4U +#define GPIO_GPECSEL2_GPIO137_M 0xF0U // GPIO137 Master CPU Select +#define GPIO_GPECSEL2_GPIO138_S 8U +#define GPIO_GPECSEL2_GPIO138_M 0xF00U // GPIO138 Master CPU Select +#define GPIO_GPECSEL2_GPIO139_S 12U +#define GPIO_GPECSEL2_GPIO139_M 0xF000U // GPIO139 Master CPU Select +#define GPIO_GPECSEL2_GPIO140_S 16U +#define GPIO_GPECSEL2_GPIO140_M 0xF0000U // GPIO140 Master CPU Select +#define GPIO_GPECSEL2_GPIO141_S 20U +#define GPIO_GPECSEL2_GPIO141_M 0xF00000U // GPIO141 Master CPU Select +#define GPIO_GPECSEL2_GPIO142_S 24U +#define GPIO_GPECSEL2_GPIO142_M 0xF000000U // GPIO142 Master CPU Select +#define GPIO_GPECSEL2_GPIO143_S 28U +#define GPIO_GPECSEL2_GPIO143_M 0xF0000000U // GPIO143 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL3 register +// +//************************************************************************************************* +#define GPIO_GPECSEL3_GPIO144_S 0U +#define GPIO_GPECSEL3_GPIO144_M 0xFU // GPIO144 Master CPU Select +#define GPIO_GPECSEL3_GPIO145_S 4U +#define GPIO_GPECSEL3_GPIO145_M 0xF0U // GPIO145 Master CPU Select +#define GPIO_GPECSEL3_GPIO146_S 8U +#define GPIO_GPECSEL3_GPIO146_M 0xF00U // GPIO146 Master CPU Select +#define GPIO_GPECSEL3_GPIO147_S 12U +#define GPIO_GPECSEL3_GPIO147_M 0xF000U // GPIO147 Master CPU Select +#define GPIO_GPECSEL3_GPIO148_S 16U +#define GPIO_GPECSEL3_GPIO148_M 0xF0000U // GPIO148 Master CPU Select +#define GPIO_GPECSEL3_GPIO149_S 20U +#define GPIO_GPECSEL3_GPIO149_M 0xF00000U // GPIO149 Master CPU Select +#define GPIO_GPECSEL3_GPIO150_S 24U +#define GPIO_GPECSEL3_GPIO150_M 0xF000000U // GPIO150 Master CPU Select +#define GPIO_GPECSEL3_GPIO151_S 28U +#define GPIO_GPECSEL3_GPIO151_M 0xF0000000U // GPIO151 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECSEL4 register +// +//************************************************************************************************* +#define GPIO_GPECSEL4_GPIO152_S 0U +#define GPIO_GPECSEL4_GPIO152_M 0xFU // GPIO152 Master CPU Select +#define GPIO_GPECSEL4_GPIO153_S 4U +#define GPIO_GPECSEL4_GPIO153_M 0xF0U // GPIO153 Master CPU Select +#define GPIO_GPECSEL4_GPIO154_S 8U +#define GPIO_GPECSEL4_GPIO154_M 0xF00U // GPIO154 Master CPU Select +#define GPIO_GPECSEL4_GPIO155_S 12U +#define GPIO_GPECSEL4_GPIO155_M 0xF000U // GPIO155 Master CPU Select +#define GPIO_GPECSEL4_GPIO156_S 16U +#define GPIO_GPECSEL4_GPIO156_M 0xF0000U // GPIO156 Master CPU Select +#define GPIO_GPECSEL4_GPIO157_S 20U +#define GPIO_GPECSEL4_GPIO157_M 0xF00000U // GPIO157 Master CPU Select +#define GPIO_GPECSEL4_GPIO158_S 24U +#define GPIO_GPECSEL4_GPIO158_M 0xF000000U // GPIO158 Master CPU Select +#define GPIO_GPECSEL4_GPIO159_S 28U +#define GPIO_GPECSEL4_GPIO159_M 0xF0000000U // GPIO159 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPELOCK register +// +//************************************************************************************************* +#define GPIO_GPELOCK_GPIO128 0x1U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO129 0x2U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO130 0x4U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO131 0x8U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO132 0x10U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO133 0x20U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO134 0x40U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO135 0x80U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO136 0x100U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO137 0x200U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO138 0x400U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO139 0x800U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO140 0x1000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO141 0x2000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO142 0x4000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO143 0x8000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO144 0x10000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO145 0x20000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO146 0x40000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO147 0x80000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO148 0x100000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO149 0x200000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO150 0x400000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO151 0x800000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO152 0x1000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO153 0x2000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO154 0x4000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO155 0x8000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO156 0x10000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO157 0x20000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO158 0x40000000U // Configuration Lock bit for this pin +#define GPIO_GPELOCK_GPIO159 0x80000000U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECR register +// +//************************************************************************************************* +#define GPIO_GPECR_GPIO128 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO129 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO130 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO131 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO132 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO133 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO134 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO135 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO136 0x100U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO137 0x200U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO138 0x400U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO139 0x800U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO140 0x1000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO141 0x2000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO142 0x4000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO143 0x8000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO144 0x10000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO145 0x20000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO146 0x40000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO147 0x80000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO148 0x100000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO149 0x200000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO150 0x400000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO151 0x800000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO152 0x1000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO153 0x2000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO154 0x4000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO155 0x8000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO156 0x10000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO157 0x20000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO158 0x40000000U // Configuration lock commit bit for this pin +#define GPIO_GPECR_GPIO159 0x80000000U // Configuration lock commit bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCTRL register +// +//************************************************************************************************* +#define GPIO_GPFCTRL_QUALPRD0_S 0U +#define GPIO_GPFCTRL_QUALPRD0_M 0xFFU // Qualification sampling period for GPIO160 to GPIO167 +#define GPIO_GPFCTRL_QUALPRD1_S 8U +#define GPIO_GPFCTRL_QUALPRD1_M 0xFF00U // Qualification sampling period for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFQSEL1 register +// +//************************************************************************************************* +#define GPIO_GPFQSEL1_GPIO160_S 0U +#define GPIO_GPFQSEL1_GPIO160_M 0x3U // Select input qualification type for GPIO160 +#define GPIO_GPFQSEL1_GPIO161_S 2U +#define GPIO_GPFQSEL1_GPIO161_M 0xCU // Select input qualification type for GPIO161 +#define GPIO_GPFQSEL1_GPIO162_S 4U +#define GPIO_GPFQSEL1_GPIO162_M 0x30U // Select input qualification type for GPIO162 +#define GPIO_GPFQSEL1_GPIO163_S 6U +#define GPIO_GPFQSEL1_GPIO163_M 0xC0U // Select input qualification type for GPIO163 +#define GPIO_GPFQSEL1_GPIO164_S 8U +#define GPIO_GPFQSEL1_GPIO164_M 0x300U // Select input qualification type for GPIO164 +#define GPIO_GPFQSEL1_GPIO165_S 10U +#define GPIO_GPFQSEL1_GPIO165_M 0xC00U // Select input qualification type for GPIO165 +#define GPIO_GPFQSEL1_GPIO166_S 12U +#define GPIO_GPFQSEL1_GPIO166_M 0x3000U // Select input qualification type for GPIO166 +#define GPIO_GPFQSEL1_GPIO167_S 14U +#define GPIO_GPFQSEL1_GPIO167_M 0xC000U // Select input qualification type for GPIO167 +#define GPIO_GPFQSEL1_GPIO168_S 16U +#define GPIO_GPFQSEL1_GPIO168_M 0x30000U // Select input qualification type for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFMUX1 register +// +//************************************************************************************************* +#define GPIO_GPFMUX1_GPIO160_S 0U +#define GPIO_GPFMUX1_GPIO160_M 0x3U // Defines pin-muxing selection for GPIO160 +#define GPIO_GPFMUX1_GPIO161_S 2U +#define GPIO_GPFMUX1_GPIO161_M 0xCU // Defines pin-muxing selection for GPIO161 +#define GPIO_GPFMUX1_GPIO162_S 4U +#define GPIO_GPFMUX1_GPIO162_M 0x30U // Defines pin-muxing selection for GPIO162 +#define GPIO_GPFMUX1_GPIO163_S 6U +#define GPIO_GPFMUX1_GPIO163_M 0xC0U // Defines pin-muxing selection for GPIO163 +#define GPIO_GPFMUX1_GPIO164_S 8U +#define GPIO_GPFMUX1_GPIO164_M 0x300U // Defines pin-muxing selection for GPIO164 +#define GPIO_GPFMUX1_GPIO165_S 10U +#define GPIO_GPFMUX1_GPIO165_M 0xC00U // Defines pin-muxing selection for GPIO165 +#define GPIO_GPFMUX1_GPIO166_S 12U +#define GPIO_GPFMUX1_GPIO166_M 0x3000U // Defines pin-muxing selection for GPIO166 +#define GPIO_GPFMUX1_GPIO167_S 14U +#define GPIO_GPFMUX1_GPIO167_M 0xC000U // Defines pin-muxing selection for GPIO167 +#define GPIO_GPFMUX1_GPIO168_S 16U +#define GPIO_GPFMUX1_GPIO168_M 0x30000U // Defines pin-muxing selection for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFDIR register +// +//************************************************************************************************* +#define GPIO_GPFDIR_GPIO160 0x1U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO161 0x2U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO162 0x4U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO163 0x8U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO164 0x10U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO165 0x20U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO166 0x40U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO167 0x80U // Defines direction for this pin in GPIO mode +#define GPIO_GPFDIR_GPIO168 0x100U // Defines direction for this pin in GPIO mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFPUD register +// +//************************************************************************************************* +#define GPIO_GPFPUD_GPIO160 0x1U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO161 0x2U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO162 0x4U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO163 0x8U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO164 0x10U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO165 0x20U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO166 0x40U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO167 0x80U // Pull-Up Disable control for this pin +#define GPIO_GPFPUD_GPIO168 0x100U // Pull-Up Disable control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFINV register +// +//************************************************************************************************* +#define GPIO_GPFINV_GPIO160 0x1U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO161 0x2U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO162 0x4U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO163 0x8U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO164 0x10U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO165 0x20U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO166 0x40U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO167 0x80U // Input inversion control for this pin +#define GPIO_GPFINV_GPIO168 0x100U // Input inversion control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFODR register +// +//************************************************************************************************* +#define GPIO_GPFODR_GPIO160 0x1U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO161 0x2U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO162 0x4U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO163 0x8U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO164 0x10U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO165 0x20U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO166 0x40U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO167 0x80U // Outpout Open-Drain control for this pin +#define GPIO_GPFODR_GPIO168 0x100U // Outpout Open-Drain control for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFGMUX1 register +// +//************************************************************************************************* +#define GPIO_GPFGMUX1_GPIO160_S 0U +#define GPIO_GPFGMUX1_GPIO160_M 0x3U // Defines pin-muxing selection for GPIO160 +#define GPIO_GPFGMUX1_GPIO161_S 2U +#define GPIO_GPFGMUX1_GPIO161_M 0xCU // Defines pin-muxing selection for GPIO161 +#define GPIO_GPFGMUX1_GPIO162_S 4U +#define GPIO_GPFGMUX1_GPIO162_M 0x30U // Defines pin-muxing selection for GPIO162 +#define GPIO_GPFGMUX1_GPIO163_S 6U +#define GPIO_GPFGMUX1_GPIO163_M 0xC0U // Defines pin-muxing selection for GPIO163 +#define GPIO_GPFGMUX1_GPIO164_S 8U +#define GPIO_GPFGMUX1_GPIO164_M 0x300U // Defines pin-muxing selection for GPIO164 +#define GPIO_GPFGMUX1_GPIO165_S 10U +#define GPIO_GPFGMUX1_GPIO165_M 0xC00U // Defines pin-muxing selection for GPIO165 +#define GPIO_GPFGMUX1_GPIO166_S 12U +#define GPIO_GPFGMUX1_GPIO166_M 0x3000U // Defines pin-muxing selection for GPIO166 +#define GPIO_GPFGMUX1_GPIO167_S 14U +#define GPIO_GPFGMUX1_GPIO167_M 0xC000U // Defines pin-muxing selection for GPIO167 +#define GPIO_GPFGMUX1_GPIO168_S 16U +#define GPIO_GPFGMUX1_GPIO168_M 0x30000U // Defines pin-muxing selection for GPIO168 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCSEL1 register +// +//************************************************************************************************* +#define GPIO_GPFCSEL1_GPIO160_S 0U +#define GPIO_GPFCSEL1_GPIO160_M 0xFU // GPIO160 Master CPU Select +#define GPIO_GPFCSEL1_GPIO161_S 4U +#define GPIO_GPFCSEL1_GPIO161_M 0xF0U // GPIO161 Master CPU Select +#define GPIO_GPFCSEL1_GPIO162_S 8U +#define GPIO_GPFCSEL1_GPIO162_M 0xF00U // GPIO162 Master CPU Select +#define GPIO_GPFCSEL1_GPIO163_S 12U +#define GPIO_GPFCSEL1_GPIO163_M 0xF000U // GPIO163 Master CPU Select +#define GPIO_GPFCSEL1_GPIO164_S 16U +#define GPIO_GPFCSEL1_GPIO164_M 0xF0000U // GPIO164 Master CPU Select +#define GPIO_GPFCSEL1_GPIO165_S 20U +#define GPIO_GPFCSEL1_GPIO165_M 0xF00000U // GPIO165 Master CPU Select +#define GPIO_GPFCSEL1_GPIO166_S 24U +#define GPIO_GPFCSEL1_GPIO166_M 0xF000000U // GPIO166 Master CPU Select +#define GPIO_GPFCSEL1_GPIO167_S 28U +#define GPIO_GPFCSEL1_GPIO167_M 0xF0000000U // GPIO167 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCSEL2 register +// +//************************************************************************************************* +#define GPIO_GPFCSEL2_GPIO168_S 0U +#define GPIO_GPFCSEL2_GPIO168_M 0xFU // GPIO168 Master CPU Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFLOCK register +// +//************************************************************************************************* +#define GPIO_GPFLOCK_GPIO160 0x1U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO161 0x2U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO162 0x4U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO163 0x8U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO164 0x10U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO165 0x20U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO166 0x40U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO167 0x80U // Configuration Lock bit for this pin +#define GPIO_GPFLOCK_GPIO168 0x100U // Configuration Lock bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCR register +// +//************************************************************************************************* +#define GPIO_GPFCR_GPIO160 0x1U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO161 0x2U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO162 0x4U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO163 0x8U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO164 0x10U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO165 0x20U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO166 0x40U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO167 0x80U // Configuration lock commit bit for this pin +#define GPIO_GPFCR_GPIO168 0x100U // Configuration lock commit bit for this pin + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPADAT register +// +//************************************************************************************************* +#define GPIO_GPADAT_GPIO0 0x1U // Data Register for this pin +#define GPIO_GPADAT_GPIO1 0x2U // Data Register for this pin +#define GPIO_GPADAT_GPIO2 0x4U // Data Register for this pin +#define GPIO_GPADAT_GPIO3 0x8U // Data Register for this pin +#define GPIO_GPADAT_GPIO4 0x10U // Data Register for this pin +#define GPIO_GPADAT_GPIO5 0x20U // Data Register for this pin +#define GPIO_GPADAT_GPIO6 0x40U // Data Register for this pin +#define GPIO_GPADAT_GPIO7 0x80U // Data Register for this pin +#define GPIO_GPADAT_GPIO8 0x100U // Data Register for this pin +#define GPIO_GPADAT_GPIO9 0x200U // Data Register for this pin +#define GPIO_GPADAT_GPIO10 0x400U // Data Register for this pin +#define GPIO_GPADAT_GPIO11 0x800U // Data Register for this pin +#define GPIO_GPADAT_GPIO12 0x1000U // Data Register for this pin +#define GPIO_GPADAT_GPIO13 0x2000U // Data Register for this pin +#define GPIO_GPADAT_GPIO14 0x4000U // Data Register for this pin +#define GPIO_GPADAT_GPIO15 0x8000U // Data Register for this pin +#define GPIO_GPADAT_GPIO16 0x10000U // Data Register for this pin +#define GPIO_GPADAT_GPIO17 0x20000U // Data Register for this pin +#define GPIO_GPADAT_GPIO18 0x40000U // Data Register for this pin +#define GPIO_GPADAT_GPIO19 0x80000U // Data Register for this pin +#define GPIO_GPADAT_GPIO20 0x100000U // Data Register for this pin +#define GPIO_GPADAT_GPIO21 0x200000U // Data Register for this pin +#define GPIO_GPADAT_GPIO22 0x400000U // Data Register for this pin +#define GPIO_GPADAT_GPIO23 0x800000U // Data Register for this pin +#define GPIO_GPADAT_GPIO24 0x1000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO25 0x2000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO26 0x4000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO27 0x8000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO28 0x10000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO29 0x20000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO30 0x40000000U // Data Register for this pin +#define GPIO_GPADAT_GPIO31 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPASET register +// +//************************************************************************************************* +#define GPIO_GPASET_GPIO0 0x1U // Output Set bit for this pin +#define GPIO_GPASET_GPIO1 0x2U // Output Set bit for this pin +#define GPIO_GPASET_GPIO2 0x4U // Output Set bit for this pin +#define GPIO_GPASET_GPIO3 0x8U // Output Set bit for this pin +#define GPIO_GPASET_GPIO4 0x10U // Output Set bit for this pin +#define GPIO_GPASET_GPIO5 0x20U // Output Set bit for this pin +#define GPIO_GPASET_GPIO6 0x40U // Output Set bit for this pin +#define GPIO_GPASET_GPIO7 0x80U // Output Set bit for this pin +#define GPIO_GPASET_GPIO8 0x100U // Output Set bit for this pin +#define GPIO_GPASET_GPIO9 0x200U // Output Set bit for this pin +#define GPIO_GPASET_GPIO10 0x400U // Output Set bit for this pin +#define GPIO_GPASET_GPIO11 0x800U // Output Set bit for this pin +#define GPIO_GPASET_GPIO12 0x1000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO13 0x2000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO14 0x4000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO15 0x8000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO16 0x10000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO17 0x20000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO18 0x40000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO19 0x80000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO20 0x100000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO21 0x200000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO22 0x400000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO23 0x800000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO24 0x1000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO25 0x2000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO26 0x4000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO27 0x8000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO28 0x10000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO29 0x20000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO30 0x40000000U // Output Set bit for this pin +#define GPIO_GPASET_GPIO31 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPACLEAR register +// +//************************************************************************************************* +#define GPIO_GPACLEAR_GPIO0 0x1U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO1 0x2U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO2 0x4U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO3 0x8U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO4 0x10U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO5 0x20U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO6 0x40U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO7 0x80U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO8 0x100U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO9 0x200U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO10 0x400U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO11 0x800U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO12 0x1000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO13 0x2000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO14 0x4000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO15 0x8000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO16 0x10000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO17 0x20000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO18 0x40000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO19 0x80000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO20 0x100000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO21 0x200000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO22 0x400000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO23 0x800000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO24 0x1000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO25 0x2000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO26 0x4000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO27 0x8000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO28 0x10000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO29 0x20000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO30 0x40000000U // Output Clear bit for this pin +#define GPIO_GPACLEAR_GPIO31 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPATOGGLE register +// +//************************************************************************************************* +#define GPIO_GPATOGGLE_GPIO0 0x1U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO1 0x2U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO2 0x4U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO3 0x8U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO4 0x10U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO5 0x20U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO6 0x40U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO7 0x80U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO8 0x100U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO9 0x200U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO10 0x400U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO11 0x800U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO12 0x1000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO13 0x2000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO14 0x4000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO15 0x8000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO16 0x10000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO17 0x20000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO18 0x40000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO19 0x80000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO20 0x100000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO21 0x200000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO22 0x400000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO23 0x800000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO24 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO25 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO26 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO27 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO28 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO29 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO30 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPATOGGLE_GPIO31 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBDAT register +// +//************************************************************************************************* +#define GPIO_GPBDAT_GPIO32 0x1U // Data Register for this pin +#define GPIO_GPBDAT_GPIO33 0x2U // Data Register for this pin +#define GPIO_GPBDAT_GPIO34 0x4U // Data Register for this pin +#define GPIO_GPBDAT_GPIO35 0x8U // Data Register for this pin +#define GPIO_GPBDAT_GPIO36 0x10U // Data Register for this pin +#define GPIO_GPBDAT_GPIO37 0x20U // Data Register for this pin +#define GPIO_GPBDAT_GPIO38 0x40U // Data Register for this pin +#define GPIO_GPBDAT_GPIO39 0x80U // Data Register for this pin +#define GPIO_GPBDAT_GPIO40 0x100U // Data Register for this pin +#define GPIO_GPBDAT_GPIO41 0x200U // Data Register for this pin +#define GPIO_GPBDAT_GPIO42 0x400U // Data Register for this pin +#define GPIO_GPBDAT_GPIO43 0x800U // Data Register for this pin +#define GPIO_GPBDAT_GPIO44 0x1000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO45 0x2000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO46 0x4000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO47 0x8000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO48 0x10000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO49 0x20000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO50 0x40000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO51 0x80000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO52 0x100000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO53 0x200000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO54 0x400000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO55 0x800000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO56 0x1000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO57 0x2000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO58 0x4000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO59 0x8000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO60 0x10000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO61 0x20000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO62 0x40000000U // Data Register for this pin +#define GPIO_GPBDAT_GPIO63 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBSET register +// +//************************************************************************************************* +#define GPIO_GPBSET_GPIO32 0x1U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO33 0x2U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO34 0x4U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO35 0x8U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO36 0x10U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO37 0x20U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO38 0x40U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO39 0x80U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO40 0x100U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO41 0x200U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO42 0x400U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO43 0x800U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO44 0x1000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO45 0x2000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO46 0x4000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO47 0x8000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO48 0x10000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO49 0x20000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO50 0x40000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO51 0x80000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO52 0x100000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO53 0x200000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO54 0x400000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO55 0x800000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO56 0x1000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO57 0x2000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO58 0x4000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO59 0x8000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO60 0x10000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO61 0x20000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO62 0x40000000U // Output Set bit for this pin +#define GPIO_GPBSET_GPIO63 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBCLEAR register +// +//************************************************************************************************* +#define GPIO_GPBCLEAR_GPIO32 0x1U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO33 0x2U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO34 0x4U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO35 0x8U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO36 0x10U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO37 0x20U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO38 0x40U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO39 0x80U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO40 0x100U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO41 0x200U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO42 0x400U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO43 0x800U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO44 0x1000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO45 0x2000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO46 0x4000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO47 0x8000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO48 0x10000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO49 0x20000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO50 0x40000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO51 0x80000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO52 0x100000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO53 0x200000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO54 0x400000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO55 0x800000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO56 0x1000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO57 0x2000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO58 0x4000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO59 0x8000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO60 0x10000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO61 0x20000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO62 0x40000000U // Output Clear bit for this pin +#define GPIO_GPBCLEAR_GPIO63 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPBTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPBTOGGLE_GPIO32 0x1U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO33 0x2U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO34 0x4U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO35 0x8U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO36 0x10U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO37 0x20U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO38 0x40U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO39 0x80U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO40 0x100U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO41 0x200U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO42 0x400U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO43 0x800U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO44 0x1000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO45 0x2000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO46 0x4000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO47 0x8000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO48 0x10000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO49 0x20000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO50 0x40000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO51 0x80000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO52 0x100000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO53 0x200000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO54 0x400000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO55 0x800000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO56 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO57 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO58 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO59 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO60 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO61 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO62 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPBTOGGLE_GPIO63 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCDAT register +// +//************************************************************************************************* +#define GPIO_GPCDAT_GPIO64 0x1U // Data Register for this pin +#define GPIO_GPCDAT_GPIO65 0x2U // Data Register for this pin +#define GPIO_GPCDAT_GPIO66 0x4U // Data Register for this pin +#define GPIO_GPCDAT_GPIO67 0x8U // Data Register for this pin +#define GPIO_GPCDAT_GPIO68 0x10U // Data Register for this pin +#define GPIO_GPCDAT_GPIO69 0x20U // Data Register for this pin +#define GPIO_GPCDAT_GPIO70 0x40U // Data Register for this pin +#define GPIO_GPCDAT_GPIO71 0x80U // Data Register for this pin +#define GPIO_GPCDAT_GPIO72 0x100U // Data Register for this pin +#define GPIO_GPCDAT_GPIO73 0x200U // Data Register for this pin +#define GPIO_GPCDAT_GPIO74 0x400U // Data Register for this pin +#define GPIO_GPCDAT_GPIO75 0x800U // Data Register for this pin +#define GPIO_GPCDAT_GPIO76 0x1000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO77 0x2000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO78 0x4000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO79 0x8000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO80 0x10000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO81 0x20000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO82 0x40000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO83 0x80000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO84 0x100000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO85 0x200000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO86 0x400000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO87 0x800000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO88 0x1000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO89 0x2000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO90 0x4000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO91 0x8000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO92 0x10000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO93 0x20000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO94 0x40000000U // Data Register for this pin +#define GPIO_GPCDAT_GPIO95 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCSET register +// +//************************************************************************************************* +#define GPIO_GPCSET_GPIO64 0x1U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO65 0x2U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO66 0x4U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO67 0x8U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO68 0x10U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO69 0x20U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO70 0x40U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO71 0x80U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO72 0x100U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO73 0x200U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO74 0x400U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO75 0x800U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO76 0x1000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO77 0x2000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO78 0x4000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO79 0x8000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO80 0x10000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO81 0x20000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO82 0x40000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO83 0x80000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO84 0x100000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO85 0x200000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO86 0x400000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO87 0x800000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO88 0x1000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO89 0x2000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO90 0x4000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO91 0x8000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO92 0x10000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO93 0x20000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO94 0x40000000U // Output Set bit for this pin +#define GPIO_GPCSET_GPIO95 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCCLEAR register +// +//************************************************************************************************* +#define GPIO_GPCCLEAR_GPIO64 0x1U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO65 0x2U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO66 0x4U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO67 0x8U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO68 0x10U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO69 0x20U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO70 0x40U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO71 0x80U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO72 0x100U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO73 0x200U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO74 0x400U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO75 0x800U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO76 0x1000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO77 0x2000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO78 0x4000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO79 0x8000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO80 0x10000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO81 0x20000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO82 0x40000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO83 0x80000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO84 0x100000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO85 0x200000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO86 0x400000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO87 0x800000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO88 0x1000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO89 0x2000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO90 0x4000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO91 0x8000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO92 0x10000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO93 0x20000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO94 0x40000000U // Output Clear bit for this pin +#define GPIO_GPCCLEAR_GPIO95 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPCTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPCTOGGLE_GPIO64 0x1U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO65 0x2U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO66 0x4U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO67 0x8U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO68 0x10U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO69 0x20U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO70 0x40U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO71 0x80U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO72 0x100U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO73 0x200U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO74 0x400U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO75 0x800U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO76 0x1000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO77 0x2000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO78 0x4000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO79 0x8000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO80 0x10000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO81 0x20000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO82 0x40000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO83 0x80000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO84 0x100000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO85 0x200000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO86 0x400000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO87 0x800000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO88 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO89 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO90 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO91 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO92 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO93 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO94 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPCTOGGLE_GPIO95 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDDAT register +// +//************************************************************************************************* +#define GPIO_GPDDAT_GPIO96 0x1U // Data Register for this pin +#define GPIO_GPDDAT_GPIO97 0x2U // Data Register for this pin +#define GPIO_GPDDAT_GPIO98 0x4U // Data Register for this pin +#define GPIO_GPDDAT_GPIO99 0x8U // Data Register for this pin +#define GPIO_GPDDAT_GPIO100 0x10U // Data Register for this pin +#define GPIO_GPDDAT_GPIO101 0x20U // Data Register for this pin +#define GPIO_GPDDAT_GPIO102 0x40U // Data Register for this pin +#define GPIO_GPDDAT_GPIO103 0x80U // Data Register for this pin +#define GPIO_GPDDAT_GPIO104 0x100U // Data Register for this pin +#define GPIO_GPDDAT_GPIO105 0x200U // Data Register for this pin +#define GPIO_GPDDAT_GPIO106 0x400U // Data Register for this pin +#define GPIO_GPDDAT_GPIO107 0x800U // Data Register for this pin +#define GPIO_GPDDAT_GPIO108 0x1000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO109 0x2000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO110 0x4000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO111 0x8000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO112 0x10000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO113 0x20000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO114 0x40000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO115 0x80000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO116 0x100000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO117 0x200000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO118 0x400000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO119 0x800000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO120 0x1000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO121 0x2000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO122 0x4000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO123 0x8000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO124 0x10000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO125 0x20000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO126 0x40000000U // Data Register for this pin +#define GPIO_GPDDAT_GPIO127 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDSET register +// +//************************************************************************************************* +#define GPIO_GPDSET_GPIO96 0x1U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO97 0x2U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO98 0x4U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO99 0x8U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO100 0x10U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO101 0x20U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO102 0x40U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO103 0x80U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO104 0x100U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO105 0x200U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO106 0x400U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO107 0x800U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO108 0x1000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO109 0x2000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO110 0x4000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO111 0x8000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO112 0x10000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO113 0x20000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO114 0x40000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO115 0x80000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO116 0x100000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO117 0x200000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO118 0x400000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO119 0x800000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO120 0x1000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO121 0x2000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO122 0x4000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO123 0x8000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO124 0x10000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO125 0x20000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO126 0x40000000U // Output Set bit for this pin +#define GPIO_GPDSET_GPIO127 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDCLEAR register +// +//************************************************************************************************* +#define GPIO_GPDCLEAR_GPIO96 0x1U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO97 0x2U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO98 0x4U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO99 0x8U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO100 0x10U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO101 0x20U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO102 0x40U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO103 0x80U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO104 0x100U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO105 0x200U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO106 0x400U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO107 0x800U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO108 0x1000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO109 0x2000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO110 0x4000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO111 0x8000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO112 0x10000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO113 0x20000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO114 0x40000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO115 0x80000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO116 0x100000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO117 0x200000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO118 0x400000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO119 0x800000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO120 0x1000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO121 0x2000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO122 0x4000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO123 0x8000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO124 0x10000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO125 0x20000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO126 0x40000000U // Output Clear bit for this pin +#define GPIO_GPDCLEAR_GPIO127 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPDTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPDTOGGLE_GPIO96 0x1U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO97 0x2U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO98 0x4U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO99 0x8U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO100 0x10U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO101 0x20U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO102 0x40U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO103 0x80U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO104 0x100U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO105 0x200U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO106 0x400U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO107 0x800U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO108 0x1000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO109 0x2000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO110 0x4000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO111 0x8000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO112 0x10000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO113 0x20000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO114 0x40000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO115 0x80000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO116 0x100000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO117 0x200000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO118 0x400000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO119 0x800000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO120 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO121 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO122 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO123 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO124 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO125 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO126 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPDTOGGLE_GPIO127 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPEDAT register +// +//************************************************************************************************* +#define GPIO_GPEDAT_GPIO128 0x1U // Data Register for this pin +#define GPIO_GPEDAT_GPIO129 0x2U // Data Register for this pin +#define GPIO_GPEDAT_GPIO130 0x4U // Data Register for this pin +#define GPIO_GPEDAT_GPIO131 0x8U // Data Register for this pin +#define GPIO_GPEDAT_GPIO132 0x10U // Data Register for this pin +#define GPIO_GPEDAT_GPIO133 0x20U // Data Register for this pin +#define GPIO_GPEDAT_GPIO134 0x40U // Data Register for this pin +#define GPIO_GPEDAT_GPIO135 0x80U // Data Register for this pin +#define GPIO_GPEDAT_GPIO136 0x100U // Data Register for this pin +#define GPIO_GPEDAT_GPIO137 0x200U // Data Register for this pin +#define GPIO_GPEDAT_GPIO138 0x400U // Data Register for this pin +#define GPIO_GPEDAT_GPIO139 0x800U // Data Register for this pin +#define GPIO_GPEDAT_GPIO140 0x1000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO141 0x2000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO142 0x4000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO143 0x8000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO144 0x10000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO145 0x20000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO146 0x40000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO147 0x80000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO148 0x100000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO149 0x200000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO150 0x400000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO151 0x800000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO152 0x1000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO153 0x2000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO154 0x4000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO155 0x8000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO156 0x10000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO157 0x20000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO158 0x40000000U // Data Register for this pin +#define GPIO_GPEDAT_GPIO159 0x80000000U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPESET register +// +//************************************************************************************************* +#define GPIO_GPESET_GPIO128 0x1U // Output Set bit for this pin +#define GPIO_GPESET_GPIO129 0x2U // Output Set bit for this pin +#define GPIO_GPESET_GPIO130 0x4U // Output Set bit for this pin +#define GPIO_GPESET_GPIO131 0x8U // Output Set bit for this pin +#define GPIO_GPESET_GPIO132 0x10U // Output Set bit for this pin +#define GPIO_GPESET_GPIO133 0x20U // Output Set bit for this pin +#define GPIO_GPESET_GPIO134 0x40U // Output Set bit for this pin +#define GPIO_GPESET_GPIO135 0x80U // Output Set bit for this pin +#define GPIO_GPESET_GPIO136 0x100U // Output Set bit for this pin +#define GPIO_GPESET_GPIO137 0x200U // Output Set bit for this pin +#define GPIO_GPESET_GPIO138 0x400U // Output Set bit for this pin +#define GPIO_GPESET_GPIO139 0x800U // Output Set bit for this pin +#define GPIO_GPESET_GPIO140 0x1000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO141 0x2000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO142 0x4000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO143 0x8000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO144 0x10000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO145 0x20000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO146 0x40000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO147 0x80000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO148 0x100000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO149 0x200000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO150 0x400000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO151 0x800000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO152 0x1000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO153 0x2000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO154 0x4000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO155 0x8000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO156 0x10000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO157 0x20000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO158 0x40000000U // Output Set bit for this pin +#define GPIO_GPESET_GPIO159 0x80000000U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPECLEAR register +// +//************************************************************************************************* +#define GPIO_GPECLEAR_GPIO128 0x1U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO129 0x2U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO130 0x4U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO131 0x8U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO132 0x10U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO133 0x20U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO134 0x40U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO135 0x80U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO136 0x100U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO137 0x200U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO138 0x400U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO139 0x800U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO140 0x1000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO141 0x2000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO142 0x4000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO143 0x8000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO144 0x10000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO145 0x20000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO146 0x40000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO147 0x80000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO148 0x100000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO149 0x200000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO150 0x400000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO151 0x800000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO152 0x1000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO153 0x2000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO154 0x4000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO155 0x8000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO156 0x10000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO157 0x20000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO158 0x40000000U // Output Clear bit for this pin +#define GPIO_GPECLEAR_GPIO159 0x80000000U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPETOGGLE register +// +//************************************************************************************************* +#define GPIO_GPETOGGLE_GPIO128 0x1U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO129 0x2U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO130 0x4U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO131 0x8U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO132 0x10U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO133 0x20U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO134 0x40U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO135 0x80U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO136 0x100U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO137 0x200U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO138 0x400U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO139 0x800U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO140 0x1000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO141 0x2000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO142 0x4000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO143 0x8000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO144 0x10000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO145 0x20000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO146 0x40000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO147 0x80000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO148 0x100000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO149 0x200000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO150 0x400000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO151 0x800000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO152 0x1000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO153 0x2000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO154 0x4000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO155 0x8000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO156 0x10000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO157 0x20000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO158 0x40000000U // Output Toggle bit for this pin +#define GPIO_GPETOGGLE_GPIO159 0x80000000U // Output Toggle bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFDAT register +// +//************************************************************************************************* +#define GPIO_GPFDAT_GPIO160 0x1U // Data Register for this pin +#define GPIO_GPFDAT_GPIO161 0x2U // Data Register for this pin +#define GPIO_GPFDAT_GPIO162 0x4U // Data Register for this pin +#define GPIO_GPFDAT_GPIO163 0x8U // Data Register for this pin +#define GPIO_GPFDAT_GPIO164 0x10U // Data Register for this pin +#define GPIO_GPFDAT_GPIO165 0x20U // Data Register for this pin +#define GPIO_GPFDAT_GPIO166 0x40U // Data Register for this pin +#define GPIO_GPFDAT_GPIO167 0x80U // Data Register for this pin +#define GPIO_GPFDAT_GPIO168 0x100U // Data Register for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFSET register +// +//************************************************************************************************* +#define GPIO_GPFSET_GPIO160 0x1U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO161 0x2U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO162 0x4U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO163 0x8U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO164 0x10U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO165 0x20U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO166 0x40U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO167 0x80U // Output Set bit for this pin +#define GPIO_GPFSET_GPIO168 0x100U // Output Set bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFCLEAR register +// +//************************************************************************************************* +#define GPIO_GPFCLEAR_GPIO160 0x1U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO161 0x2U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO162 0x4U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO163 0x8U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO164 0x10U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO165 0x20U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO166 0x40U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO167 0x80U // Output Clear bit for this pin +#define GPIO_GPFCLEAR_GPIO168 0x100U // Output Clear bit for this pin + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPFTOGGLE register +// +//************************************************************************************************* +#define GPIO_GPFTOGGLE_GPIO160 0x1U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO161 0x2U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO162 0x4U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO163 0x8U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO164 0x10U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO165 0x20U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO166 0x40U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO167 0x80U // Output Toggle bit for this pin +#define GPIO_GPFTOGGLE_GPIO168 0x100U // Output Toggle bit for this pin + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_hic.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_hic.h new file mode 100644 index 0000000..07d544f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_hic.h @@ -0,0 +1,344 @@ +//########################################################################### +// +// FILE: hw_hic.h +// +// TITLE: Definitions for the HIC registers. +// +//########################################################################### +// $TI Release: $ +// $Release Date: $ +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_HIC_H +#define HW_HIC_H + +//************************************************************************************************* +// +// The following are defines for the HIC register offsets +// +//************************************************************************************************* +#define HIC_O_REV 0x0U // Module Revision Register +#define HIC_O_GCR 0x2U // Global Control Register +#define HIC_O_LOCK 0x4U // Lock Register +#define HIC_O_MODECR 0x6U // Mode Control Register +#define HIC_O_PINPOLCR 0x8U // Pin Polarity Control Register +#define HIC_O_BASESEL 0xAU // Base Select Register +#define HIC_O_HOSTCR 0xCU // Host Control Register +#define HIC_O_ERRADDR 0xEU // Host Error Address register +#define HIC_O_H2DTOKEN 0x10U // Host to Device Token Register +#define HIC_O_D2HTOKEN 0x12U // Devie to Host Token Register +#define HIC_O_DBADDR0 0x14U // Device Base Address Register 0 +#define HIC_O_DBADDR1 0x16U // Device Base Address Register 1 +#define HIC_O_DBADDR2 0x18U // Device Base Address Register 2 +#define HIC_O_DBADDR3 0x1AU // Device Base Address Register 3 +#define HIC_O_DBADDR4 0x1CU // Device Base Address Register 4 +#define HIC_O_DBADDR5 0x1EU // Device Base Address Register 5 +#define HIC_O_DBADDR6 0x20U // Device Base Address Register 6 +#define HIC_O_DBADDR7 0x22U // Device Base Address Register 7 +#define HIC_O_H2DINTEN 0x28U // H2D Interrupt Enable +#define HIC_O_H2DINTFLG 0x2AU // H2D Interrupt status Flag +#define HIC_O_H2DINTCLR 0x2CU // H2D Interrupt status Clear +#define HIC_O_H2DINTFRC 0x2EU // H2D Interrupt Set Force +#define HIC_O_D2HINTEN 0x30U // D2H Interrupt Enable +#define HIC_O_D2HINTFLG 0x32U // D2H Interrupt status Flag +#define HIC_O_D2HINTCLR 0x34U // D2H Interrupt status Clear +#define HIC_O_D2HINTFRC 0x36U // D2H Interrupt Set Force +#define HIC_O_ACCVIOADDR 0x38U // Access Violation Address +#define HIC_O_H2D_BUF0 0x40U // Host to Device Buffer 0 +#define HIC_O_H2D_BUF1 0x42U // Host to Device Buffer 1 +#define HIC_O_H2D_BUF2 0x44U // Host to Device Buffer 2 +#define HIC_O_H2D_BUF3 0x46U // Host to Device Buffer 3 +#define HIC_O_H2D_BUF4 0x48U // Host to Device Buffer 4 +#define HIC_O_H2D_BUF5 0x4AU // Host to Device Buffer 5 +#define HIC_O_H2D_BUF6 0x4CU // Host to Device Buffer 6 +#define HIC_O_H2D_BUF7 0x4EU // Host to Device Buffer 7 +#define HIC_O_H2D_BUF8 0x50U // Host to Device Buffer 8 +#define HIC_O_H2D_BUF9 0x52U // Host to Device Buffer 9 +#define HIC_O_H2D_BUF10 0x54U // Host to Device Buffer 10 +#define HIC_O_H2D_BUF11 0x56U // Host to Device Buffer 11 +#define HIC_O_H2D_BUF12 0x58U // Host to Device Buffer 12 +#define HIC_O_H2D_BUF13 0x5AU // Host to Device Buffer 13 +#define HIC_O_H2D_BUF14 0x5CU // Host to Device Buffer 14 +#define HIC_O_H2D_BUF15 0x5EU // Host to Device Buffer 15 +#define HIC_O_D2H_BUF0 0x60U // Device to Host Buffer 0 +#define HIC_O_D2H_BUF1 0x62U // Device to Host Buffer 1 +#define HIC_O_D2H_BUF2 0x64U // Device to Host Buffer 2 +#define HIC_O_D2H_BUF3 0x66U // Device to Host Buffer 3 +#define HIC_O_D2H_BUF4 0x68U // Device to Host Buffer 4 +#define HIC_O_D2H_BUF5 0x6AU // Device to Host Buffer 5 +#define HIC_O_D2H_BUF6 0x6CU // Device to Host Buffer 6 +#define HIC_O_D2H_BUF7 0x6EU // Device to Host Buffer 7 +#define HIC_O_D2H_BUF8 0x70U // Device to Host Buffer 8 +#define HIC_O_D2H_BUF9 0x72U // Device to Host Buffer 9 +#define HIC_O_D2H_BUF10 0x74U // Device to Host Buffer 10 +#define HIC_O_D2H_BUF11 0x76U // Device to Host Buffer 11 +#define HIC_O_D2H_BUF12 0x78U // Device to Host Buffer 12 +#define HIC_O_D2H_BUF13 0x7AU // Device to Host Buffer 13 +#define HIC_O_D2H_BUF14 0x7CU // Device to Host Buffer 14 +#define HIC_O_D2H_BUF15 0x7EU // Device to Host Buffer 15 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICREV register +// +//************************************************************************************************* +#define HIC_REV_MINOR_S 0U +#define HIC_REV_MINOR_M 0x3FU // Minor Revision Number +#define HIC_REV_CUSTOM_S 6U +#define HIC_REV_CUSTOM_M 0xC0U // Custom Module Number +#define HIC_REV_MAJOR_S 8U +#define HIC_REV_MAJOR_M 0x700U // Major Revision Number +#define HIC_REV_RTL_S 11U +#define HIC_REV_RTL_M 0xF800U // Design Release Number +#define HIC_REV_FUNC_S 16U +#define HIC_REV_FUNC_M 0xFFF0000U // Functional Release Number +#define HIC_REV_SCHEME_S 30U +#define HIC_REV_SCHEME_M 0xC0000000U // Defines Scheme for Module +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICGCR register +// +//************************************************************************************************* +#define HIC_GCR_HICEN_S 0U +#define HIC_GCR_HICEN_M 0xFU // Host Interface Enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICLOCK register +// +//************************************************************************************************* +#define HIC_LOCK_LOCK 0x1U // LOCK enable +#define HIC_LOCK_WRITE_ENABLE_KEY_S 16U +#define HIC_LOCK_WRITE_ENABLE_KEY_M 0xFFFF0000U // Key for enabling write +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICMODECR register +// +//************************************************************************************************* +#define HIC_MODECR_DW_MODE_S 0U +#define HIC_MODECR_DW_MODE_M 0x3U // Data Width Mode +#define HIC_MODECR_RW_MODE 0x10U // Read-Write Mode +#define HIC_MODECR_BEN_PRESENT 0x20U // Byte Enable Pins are present +#define HIC_MODECR_RDY_PRESENT 0x40U // Ready pin present +#define HIC_MODECR_H2DBUF_DEVWREN 0x100U // Write Enable for Device to H2D Buffer +#define HIC_MODECR_D2HBUF_HOSTWREN 0x200U // Write Enable for Host to D2H Buffer +#define HIC_MODECR_EN_DEVACC 0x400U // Enable Host access to Device region +#define HIC_MODECR_EN_HOSTWREALLOW 0x800U // Enable Host Write to EALLOWCTL register +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICPINPOLCR register +// +//************************************************************************************************* +#define HIC_PINPOLCR_CS_POL 0x1U // Chip Select Polarity +#define HIC_PINPOLCR_BEN_POL 0x2U // Byte Enable Polarity +#define HIC_PINPOLCR_OE_POL 0x4U // Output Enable Polarity +#define HIC_PINPOLCR_WE_POL 0x8U // Write Enable Polarity +#define HIC_PINPOLCR_RDY_POL 0x10U // Ready Polarity +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICBASESEL register +// +//************************************************************************************************* +#define HIC_BASESEL_BASE_SELECT_S 0U +#define HIC_BASESEL_BASE_SELECT_M 0x7U // Base Select +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICHOSTCR register +// +//************************************************************************************************* +#define HIC_HOSTCR_EALLOW_EN 0x1U // EALLOW Enable +#define HIC_HOSTCR_ACCSIZE 0x2U // Access Size +#define HIC_HOSTCR_PAGESEL 0x4U // Page Select +#define HIC_HOSTCR_HKEY_S 8U +#define HIC_HOSTCR_HKEY_M 0xFF00U // Host Key +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICERRADDR register +// +//************************************************************************************************* +#define HIC_ERRADDR_H2D_ERR_ADDR_S 0U +#define HIC_ERRADDR_H2D_ERR_ADDR_M 0xFFU // Address of the Host bus captured upon an + // error for Device +#define HIC_ERRADDR_H2D_BASE_SEL_S 12U +#define HIC_ERRADDR_H2D_BASE_SEL_M 0x7000U // Base Select corresponding to H2D error event +#define HIC_ERRADDR_D2H_ERR_ADDR_S 16U +#define HIC_ERRADDR_D2H_ERR_ADDR_M 0xFF0000U // Address of the Host bus captured upon an + // error for Host +#define HIC_ERRADDR_D2H_BASE_SEL_S 28U +#define HIC_ERRADDR_D2H_BASE_SEL_M 0x70000000U // Base Select corresponding to D2H error event +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR0 register +// +//************************************************************************************************* +#define HIC_DBADDR0_BASE_ADDR_S 7U +#define HIC_DBADDR0_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR1 register +// +//************************************************************************************************* +#define HIC_DBADDR1_BASE_ADDR_S 7U +#define HIC_DBADDR1_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR2 register +// +//************************************************************************************************* +#define HIC_DBADDR2_BASE_ADDR_S 7U +#define HIC_DBADDR2_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR3 register +// +//************************************************************************************************* +#define HIC_DBADDR3_BASE_ADDR_S 7U +#define HIC_DBADDR3_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR4 register +// +//************************************************************************************************* +#define HIC_DBADDR4_BASE_ADDR_S 7U +#define HIC_DBADDR4_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR5 register +// +//************************************************************************************************* +#define HIC_DBADDR5_BASE_ADDR_S 7U +#define HIC_DBADDR5_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR6 register +// +//************************************************************************************************* +#define HIC_DBADDR6_BASE_ADDR_S 7U +#define HIC_DBADDR6_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICDBADDR7 register +// +//************************************************************************************************* +#define HIC_DBADDR7_BASE_ADDR_S 7U +#define HIC_DBADDR7_BASE_ADDR_M 0xFFFFFF80U // Base address of device region +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTEN register +// +//************************************************************************************************* +#define HIC_H2DINTEN_H2D_INTEN 0x1U // Host To Device Interrupt Enable +#define HIC_H2DINTEN_BUSERR_INTEN 0x2U // BusError Interrupt Enable +#define HIC_H2DINTEN_ILLWR_INTEN 0x4U // Illegal Write event interrupt enable +#define HIC_H2DINTEN_ILLRD_INTEN 0x8U // Illegal Read event interrupt enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTFLG register +// +//************************************************************************************************* +#define HIC_H2DINTFLG_H2D_FLG 0x1U // Host To Device Interrupt Flag +#define HIC_H2DINTFLG_BUSERR_FLG 0x2U // BusError Interrupt Flag +#define HIC_H2DINTFLG_ILLWR_FLG 0x4U // Illegal write event interrupt flag +#define HIC_H2DINTFLG_ILLRD_FLG 0x8U // Illegal read event interrupt flag +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTCLR register +// +//************************************************************************************************* +#define HIC_H2DINTCLR_H2D_CLR 0x1U // Host To Device Interrupt Clear +#define HIC_H2DINTCLR_BUSERR_CLR 0x2U // BusError Interrupt Clear +#define HIC_H2DINTCLR_ILLWR_CLR 0x4U // Illegal Write Interrupt Clear +#define HIC_H2DINTCLR_ILLRD_CLR 0x8U // Illegal Read Interrupt Clear +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICH2DINTFRC register +// +//************************************************************************************************* +#define HIC_H2DINTFRC_H2D_INTFRC 0x1U // Host To Device Force Set +#define HIC_H2DINTFRC_BUSERR_INTFRC 0x2U // BusError Interrupt Force Set +#define HIC_H2DINTFRC_ILLWR_INTFRC 0x4U // Illegal Write Interrupt Force Set +#define HIC_H2DINTFRC_ILLRD_INTFRC 0x8U // Illegal Read Interrupt Force Set +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTEN register +// +//************************************************************************************************* +#define HIC_D2HINTEN_D2H_INTEN 0x1U // Device to Host Data Ready Interrupt Enable +#define HIC_D2HINTEN_BUSERR_INTEN 0x2U // BusError Interrupt Enable +#define HIC_D2HINTEN_ILLWR_INTEN 0x4U // Illegal Write event Interrupt Enable +#define HIC_D2HINTEN_ILLRD_INTEN 0x8U // Illegal Read event Interrupt Enable +#define HIC_D2HINTEN_ACCVIO_INTEN 0x10U // Access Violation Interrupt Enable +#define HIC_D2HINTEN_EVTRIG_INTEN_S 16U +#define HIC_D2HINTEN_EVTRIG_INTEN_M 0xFFFF0000U // Event Trigger Interrupt Enable +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTFLG register +// +//************************************************************************************************* +#define HIC_D2HINTFLG_D2H_FLG 0x1U // Device to Host Data Ready Flag +#define HIC_D2HINTFLG_BUSERR_FLG 0x2U // BusError Flag +#define HIC_D2HINTFLG_ILLWR_FLG 0x4U // Illegal Write event Flag +#define HIC_D2HINTFLG_ILLRD_FLG 0x8U // Illegal Read event Flag +#define HIC_D2HINTFLG_ACCVIO_FLG 0x10U // Access Violation Flag +#define HIC_D2HINTFLG_EVTRIG_FLG_S 16U +#define HIC_D2HINTFLG_EVTRIG_FLG_M 0xFFFF0000U // Event Trigger Flag +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTCLR register +// +//************************************************************************************************* +#define HIC_D2HINTCLR_D2H_CLR 0x1U // Device to Host Interrupt Clear +#define HIC_D2HINTCLR_BUSERR_CLR 0x2U // BusError Interrupt Clear +#define HIC_D2HINTCLR_ILLWR_CLR 0x4U // Illegal Write Interrupt Clear +#define HIC_D2HINTCLR_ILLRD_CLR 0x8U // Illegal Read Interrupt Clear +#define HIC_D2HINTCLR_ACCVIO_CLR 0x10U // Access Violation Interrupt Clear +#define HIC_D2HINTCLR_EVTRIG_CLR_S 16U +#define HIC_D2HINTCLR_EVTRIG_CLR_M 0xFFFF0000U // Event Trigger Interrupt Clear +//************************************************************************************************* +// +// The following are defines for the bit fields in the HICD2HINTFRC register +// +//************************************************************************************************* +#define HIC_D2HINTFRC_D2H_INTFRC 0x1U // Device to Host Force Set +#define HIC_D2HINTFRC_BUSERR_INTFRC 0x2U // BusError Interrupt Force Set +#define HIC_D2HINTFRC_ILLWR_INTFRC 0x4U // Illegal Write Interrupt Force Set +#define HIC_D2HINTFRC_ILLRD_INTFRC 0x8U // Illegal Read Interrupt Force Set +#define HIC_D2HINTFRC_ACCVIO_INTFRC 0x10U // Access Violation Interrupt Force Set +#define HIC_D2HINTFRC_EVTRIG_INTFRC_S 16U +#define HIC_D2HINTFRC_EVTRIG_INTFRC_M 0xFFFF0000U // Event Trigger Interrupt Force Set + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_hrpwm.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_hrpwm.h new file mode 100644 index 0000000..a6c899f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_hrpwm.h @@ -0,0 +1,1058 @@ +//########################################################################### +// +// FILE: hw_hrpwm.h +// +// TITLE: Definitions for the HRPWM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_HRPWM_H +#define HW_HRPWM_H + +//************************************************************************************************* +// +// The following are defines for the HRPWM register offsets +// +//************************************************************************************************* +#define HRPWM_O_TBCTL 0x0U // Time Base Control Register +#define HRPWM_O_TBCTL2 0x1U // Time Base Control Register 2 +#define HRPWM_O_TBCTR 0x4U // Time Base Counter Register +#define HRPWM_O_TBSTS 0x5U // Time Base Status Register +#define HRPWM_O_CMPCTL 0x8U // Counter Compare Control Register +#define HRPWM_O_CMPCTL2 0x9U // Counter Compare Control Register 2 +#define HRPWM_O_DBCTL 0xCU // Dead-Band Generator Control Register +#define HRPWM_O_DBCTL2 0xDU // Dead-Band Generator Control Register 2 +#define HRPWM_O_AQCTL 0x10U // Action Qualifier Control Register +#define HRPWM_O_AQTSRCSEL 0x11U // Action Qualifier Trigger Event Source Select Register +#define HRPWM_O_PCCTL 0x14U // PWM Chopper Control Register +#define HRPWM_O_VCAPCTL 0x18U // Valley Capture Control Register +#define HRPWM_O_VCNTCFG 0x19U // Valley Counter Config Register +#define HRPWM_O_HRCNFG 0x20U // HRPWM Configuration Register +#define HRPWM_O_HRPWR 0x21U // HRPWM Power Register +#define HRPWM_O_HRMSTEP 0x26U // HRPWM MEP Step Register +#define HRPWM_O_HRCNFG2 0x27U // HRPWM Configuration 2 Register +#define HRPWM_O_HRPCTL 0x2DU // High Resolution Period Control Register +#define HRPWM_O_TRREM 0x2EU // HRPWM High Resolution Remainder Register +#define HRPWM_O_GLDCTL 0x34U // Global PWM Load Control Register +#define HRPWM_O_GLDCFG 0x35U // Global PWM Load Config Register +#define HRPWM_O_EPWMXLINK 0x38U // EPWMx Link Register +#define HRPWM_O_AQCTLA 0x40U // Action Qualifier Control Register For Output A +#define HRPWM_O_AQCTLA2 0x41U // Additional Action Qualifier Control Register For Output A +#define HRPWM_O_AQCTLB 0x42U // Action Qualifier Control Register For Output B +#define HRPWM_O_AQCTLB2 0x43U // Additional Action Qualifier Control Register For Output B +#define HRPWM_O_AQSFRC 0x47U // Action Qualifier Software Force Register +#define HRPWM_O_AQCSFRC 0x49U // Action Qualifier Continuous S/W Force Register +#define HRPWM_O_DBREDHR 0x50U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define HRPWM_O_DBRED 0x51U // Dead-Band Generator Rising Edge Delay High Resolution + // Mirror Register +#define HRPWM_O_DBFEDHR 0x52U // Dead-Band Generator Falling Edge Delay High Resolution + // Register +#define HRPWM_O_DBFED 0x53U // Dead-Band Generator Falling Edge Delay Count Register +#define HRPWM_O_TBPHS 0x60U // Time Base Phase High +#define HRPWM_O_TBPRDHR 0x62U // Time Base Period High Resolution Register +#define HRPWM_O_TBPRD 0x63U // Time Base Period Register +#define HRPWM_O_CMPA 0x6AU // Counter Compare A Register +#define HRPWM_O_CMPB 0x6CU // Compare B Register +#define HRPWM_O_CMPC 0x6FU // Counter Compare C Register +#define HRPWM_O_CMPD 0x71U // Counter Compare D Register +#define HRPWM_O_GLDCTL2 0x74U // Global PWM Load Control Register 2 +#define HRPWM_O_SWVDELVAL 0x77U // Software Valley Mode Delay Register +#define HRPWM_O_TZSEL 0x80U // Trip Zone Select Register +#define HRPWM_O_TZDCSEL 0x82U // Trip Zone Digital Comparator Select Register +#define HRPWM_O_TZCTL 0x84U // Trip Zone Control Register +#define HRPWM_O_TZCTL2 0x85U // Additional Trip Zone Control Register +#define HRPWM_O_TZCTLDCA 0x86U // Trip Zone Control Register Digital Compare A +#define HRPWM_O_TZCTLDCB 0x87U // Trip Zone Control Register Digital Compare B +#define HRPWM_O_TZEINT 0x8DU // Trip Zone Enable Interrupt Register +#define HRPWM_O_TZFLG 0x93U // Trip Zone Flag Register +#define HRPWM_O_TZCBCFLG 0x94U // Trip Zone CBC Flag Register +#define HRPWM_O_TZOSTFLG 0x95U // Trip Zone OST Flag Register +#define HRPWM_O_TZCLR 0x97U // Trip Zone Clear Register +#define HRPWM_O_TZCBCCLR 0x98U // Trip Zone CBC Clear Register +#define HRPWM_O_TZOSTCLR 0x99U // Trip Zone OST Clear Register +#define HRPWM_O_TZFRC 0x9BU // Trip Zone Force Register +#define HRPWM_O_ETSEL 0xA4U // Event Trigger Selection Register +#define HRPWM_O_ETPS 0xA6U // Event Trigger Pre-Scale Register +#define HRPWM_O_ETFLG 0xA8U // Event Trigger Flag Register +#define HRPWM_O_ETCLR 0xAAU // Event Trigger Clear Register +#define HRPWM_O_ETFRC 0xACU // Event Trigger Force Register +#define HRPWM_O_ETINTPS 0xAEU // Event-Trigger Interrupt Pre-Scale Register +#define HRPWM_O_ETSOCPS 0xB0U // Event-Trigger SOC Pre-Scale Register +#define HRPWM_O_ETCNTINITCTL 0xB2U // Event-Trigger Counter Initialization Control Register +#define HRPWM_O_ETCNTINIT 0xB4U // Event-Trigger Counter Initialization Register +#define HRPWM_O_DCTRIPSEL 0xC0U // Digital Compare Trip Select Register +#define HRPWM_O_DCACTL 0xC3U // Digital Compare A Control Register +#define HRPWM_O_DCBCTL 0xC4U // Digital Compare B Control Register +#define HRPWM_O_DCFCTL 0xC7U // Digital Compare Filter Control Register +#define HRPWM_O_DCCAPCTL 0xC8U // Digital Compare Capture Control Register +#define HRPWM_O_DCFOFFSET 0xC9U // Digital Compare Filter Offset Register +#define HRPWM_O_DCFOFFSETCNT 0xCAU // Digital Compare Filter Offset Counter Register +#define HRPWM_O_DCFWINDOW 0xCBU // Digital Compare Filter Window Register +#define HRPWM_O_DCFWINDOWCNT 0xCCU // Digital Compare Filter Window Counter Register +#define HRPWM_O_DCCAP 0xCFU // Digital Compare Counter Capture Register +#define HRPWM_O_DCAHTRIPSEL 0xD2U // Digital Compare AH Trip Select +#define HRPWM_O_DCALTRIPSEL 0xD3U // Digital Compare AL Trip Select +#define HRPWM_O_DCBHTRIPSEL 0xD4U // Digital Compare BH Trip Select +#define HRPWM_O_DCBLTRIPSEL 0xD5U // Digital Compare BL Trip Select +#define HRPWM_O_HWVDELVAL 0xFDU // Hardware Valley Mode Delay Register +#define HRPWM_O_VCNTVAL 0xFEU // Hardware Valley Counter Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL register +// +//************************************************************************************************* +#define HRPWM_TBCTL_CTRMODE_S 0U +#define HRPWM_TBCTL_CTRMODE_M 0x3U // Counter Mode +#define HRPWM_TBCTL_PHSEN 0x4U // Phase Load Enable +#define HRPWM_TBCTL_PRDLD 0x8U // Active Period Load +#define HRPWM_TBCTL_SYNCOSEL_S 4U +#define HRPWM_TBCTL_SYNCOSEL_M 0x30U // Sync Output Select +#define HRPWM_TBCTL_SWFSYNC 0x40U // Software Force Sync Pulse +#define HRPWM_TBCTL_HSPCLKDIV_S 7U +#define HRPWM_TBCTL_HSPCLKDIV_M 0x380U // High Speed TBCLK Pre-scaler +#define HRPWM_TBCTL_CLKDIV_S 10U +#define HRPWM_TBCTL_CLKDIV_M 0x1C00U // Time Base Clock Pre-scaler +#define HRPWM_TBCTL_PHSDIR 0x2000U // Phase Direction Bit +#define HRPWM_TBCTL_FREE_SOFT_S 14U +#define HRPWM_TBCTL_FREE_SOFT_M 0xC000U // Emulation Mode Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBCTL2 register +// +//************************************************************************************************* +#define HRPWM_TBCTL2_OSHTSYNCMODE 0x40U // One shot sync mode +#define HRPWM_TBCTL2_OSHTSYNC 0x80U // One shot sync +#define HRPWM_TBCTL2_SYNCOSELX_S 12U +#define HRPWM_TBCTL2_SYNCOSELX_M 0x3000U // Syncout selection +#define HRPWM_TBCTL2_PRDLDSYNC_S 14U +#define HRPWM_TBCTL2_PRDLDSYNC_M 0xC000U // PRD Shadow to Active Load on SYNC Event + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBSTS register +// +//************************************************************************************************* +#define HRPWM_TBSTS_CTRDIR 0x1U // Counter Direction Status +#define HRPWM_TBSTS_SYNCI 0x2U // External Input Sync Status +#define HRPWM_TBSTS_CTRMAX 0x4U // Counter Max Latched Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL register +// +//************************************************************************************************* +#define HRPWM_CMPCTL_LOADAMODE_S 0U +#define HRPWM_CMPCTL_LOADAMODE_M 0x3U // Active Compare A Load +#define HRPWM_CMPCTL_LOADBMODE_S 2U +#define HRPWM_CMPCTL_LOADBMODE_M 0xCU // Active Compare B Load +#define HRPWM_CMPCTL_SHDWAMODE 0x10U // Compare A Register Block Operating Mode +#define HRPWM_CMPCTL_SHDWBMODE 0x40U // Compare B Register Block Operating Mode +#define HRPWM_CMPCTL_SHDWAFULL 0x100U // Compare A Shadow Register Full Status +#define HRPWM_CMPCTL_SHDWBFULL 0x200U // Compare B Shadow Register Full Status +#define HRPWM_CMPCTL_LOADASYNC_S 10U +#define HRPWM_CMPCTL_LOADASYNC_M 0xC00U // Active Compare A Load on SYNC +#define HRPWM_CMPCTL_LOADBSYNC_S 12U +#define HRPWM_CMPCTL_LOADBSYNC_M 0x3000U // Active Compare B Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPCTL2 register +// +//************************************************************************************************* +#define HRPWM_CMPCTL2_LOADCMODE_S 0U +#define HRPWM_CMPCTL2_LOADCMODE_M 0x3U // Active Compare C Load +#define HRPWM_CMPCTL2_LOADDMODE_S 2U +#define HRPWM_CMPCTL2_LOADDMODE_M 0xCU // Active Compare D load +#define HRPWM_CMPCTL2_SHDWCMODE 0x10U // Compare C Block Operating Mode +#define HRPWM_CMPCTL2_SHDWDMODE 0x40U // Compare D Block Operating Mode +#define HRPWM_CMPCTL2_LOADCSYNC_S 10U +#define HRPWM_CMPCTL2_LOADCSYNC_M 0xC00U // Active Compare C Load on SYNC +#define HRPWM_CMPCTL2_LOADDSYNC_S 12U +#define HRPWM_CMPCTL2_LOADDSYNC_M 0x3000U // Active Compare D Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL register +// +//************************************************************************************************* +#define HRPWM_DBCTL_OUT_MODE_S 0U +#define HRPWM_DBCTL_OUT_MODE_M 0x3U // Dead Band Output Mode Control +#define HRPWM_DBCTL_POLSEL_S 2U +#define HRPWM_DBCTL_POLSEL_M 0xCU // Polarity Select Control +#define HRPWM_DBCTL_IN_MODE_S 4U +#define HRPWM_DBCTL_IN_MODE_M 0x30U // Dead Band Input Select Mode Control +#define HRPWM_DBCTL_LOADREDMODE_S 6U +#define HRPWM_DBCTL_LOADREDMODE_M 0xC0U // Active DBRED Load Mode +#define HRPWM_DBCTL_LOADFEDMODE_S 8U +#define HRPWM_DBCTL_LOADFEDMODE_M 0x300U // Active DBFED Load Mode +#define HRPWM_DBCTL_SHDWDBREDMODE 0x400U // DBRED Block Operating Mode +#define HRPWM_DBCTL_SHDWDBFEDMODE 0x800U // DBFED Block Operating Mode +#define HRPWM_DBCTL_OUTSWAP_S 12U +#define HRPWM_DBCTL_OUTSWAP_M 0x3000U // Dead Band Output Swap Control +#define HRPWM_DBCTL_DEDB_MODE 0x4000U // Dead Band Dual-Edge B Mode Control +#define HRPWM_DBCTL_HALFCYCLE 0x8000U // Half Cycle Clocking Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBCTL2 register +// +//************************************************************************************************* +#define HRPWM_DBCTL2_LOADDBCTLMODE_S 0U +#define HRPWM_DBCTL2_LOADDBCTLMODE_M 0x3U // DBCTL Load from Shadow Mode Select +#define HRPWM_DBCTL2_SHDWDBCTLMODE 0x4U // DBCTL Load mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTL register +// +//************************************************************************************************* +#define HRPWM_AQCTL_LDAQAMODE_S 0U +#define HRPWM_AQCTL_LDAQAMODE_M 0x3U // Action Qualifier A Load Select +#define HRPWM_AQCTL_LDAQBMODE_S 2U +#define HRPWM_AQCTL_LDAQBMODE_M 0xCU // Action Qualifier B Load Select +#define HRPWM_AQCTL_SHDWAQAMODE 0x10U // Action Qualifer A Operating Mode +#define HRPWM_AQCTL_SHDWAQBMODE 0x40U // Action Qualifier B Operating Mode +#define HRPWM_AQCTL_LDAQASYNC_S 8U +#define HRPWM_AQCTL_LDAQASYNC_M 0x300U // AQCTLA Register Load on SYNC +#define HRPWM_AQCTL_LDAQBSYNC_S 10U +#define HRPWM_AQCTL_LDAQBSYNC_M 0xC00U // AQCTLB Register Load on SYNC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQTSRCSEL register +// +//************************************************************************************************* +#define HRPWM_AQTSRCSEL_T1SEL_S 0U +#define HRPWM_AQTSRCSEL_T1SEL_M 0xFU // T1 Event Source Select Bits +#define HRPWM_AQTSRCSEL_T2SEL_S 4U +#define HRPWM_AQTSRCSEL_T2SEL_M 0xF0U // T2 Event Source Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCCTL register +// +//************************************************************************************************* +#define HRPWM_PCCTL_CHPEN 0x1U // PWM chopping enable +#define HRPWM_PCCTL_OSHTWTH_S 1U +#define HRPWM_PCCTL_OSHTWTH_M 0x1EU // One-shot pulse width +#define HRPWM_PCCTL_CHPFREQ_S 5U +#define HRPWM_PCCTL_CHPFREQ_M 0xE0U // Chopping clock frequency +#define HRPWM_PCCTL_CHPDUTY_S 8U +#define HRPWM_PCCTL_CHPDUTY_M 0x700U // Chopping clock Duty cycle + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCAPCTL register +// +//************************************************************************************************* +#define HRPWM_VCAPCTL_VCAPE 0x1U // Valley Capture mode +#define HRPWM_VCAPCTL_VCAPSTART 0x2U // Valley Capture Start +#define HRPWM_VCAPCTL_TRIGSEL_S 2U +#define HRPWM_VCAPCTL_TRIGSEL_M 0x1CU // Capture Trigger Select +#define HRPWM_VCAPCTL_VDELAYDIV_S 7U +#define HRPWM_VCAPCTL_VDELAYDIV_M 0x380U // Valley Delay Mode Divide Enable +#define HRPWM_VCAPCTL_EDGEFILTDLYSEL 0x400U // Valley Switching Mode Delay Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the VCNTCFG register +// +//************************************************************************************************* +#define HRPWM_VCNTCFG_STARTEDGE_S 0U +#define HRPWM_VCNTCFG_STARTEDGE_M 0xFU // Counter Start Edge Selection +#define HRPWM_VCNTCFG_STARTEDGESTS 0x80U // Start Edge Status Bit +#define HRPWM_VCNTCFG_STOPEDGE_S 8U +#define HRPWM_VCNTCFG_STOPEDGE_M 0xF00U // Counter Start Edge Selection +#define HRPWM_VCNTCFG_STOPEDGESTS 0x8000U // Stop Edge Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG register +// +//************************************************************************************************* +#define HRPWM_HRCNFG_EDGMODE_S 0U +#define HRPWM_HRCNFG_EDGMODE_M 0x3U // ePWMxA Edge Mode Select Bits +#define HRPWM_HRCNFG_CTLMODE 0x4U // ePWMxA Control Mode Select Bits +#define HRPWM_HRCNFG_HRLOAD_S 3U +#define HRPWM_HRCNFG_HRLOAD_M 0x18U // ePWMxA Shadow Mode Select Bits +#define HRPWM_HRCNFG_SELOUTB 0x20U // EPWMB Output Selection Bit +#define HRPWM_HRCNFG_AUTOCONV 0x40U // Autoconversion Bit +#define HRPWM_HRCNFG_SWAPAB 0x80U // Swap EPWMA and EPWMB Outputs Bit +#define HRPWM_HRCNFG_EDGMODEB_S 8U +#define HRPWM_HRCNFG_EDGMODEB_M 0x300U // ePWMxB Edge Mode Select Bits +#define HRPWM_HRCNFG_CTLMODEB 0x400U // ePWMxB Control Mode Select Bits +#define HRPWM_HRCNFG_HRLOADB_S 11U +#define HRPWM_HRCNFG_HRLOADB_M 0x1800U // ePWMxB Shadow Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPWR register +// +//************************************************************************************************* +#define HRPWM_HRPWR_CALPWRON 0x8000U // Calibration Power On + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRMSTEP register +// +//************************************************************************************************* +#define HRPWM_HRMSTEP_HRMSTEP_S 0U +#define HRPWM_HRMSTEP_HRMSTEP_M 0xFFU // High Resolution Micro Step Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRCNFG2 register +// +//************************************************************************************************* +#define HRPWM_HRCNFG2_EDGMODEDB_S 0U +#define HRPWM_HRCNFG2_EDGMODEDB_M 0x3U // Dead-Band Edge-Mode Select Bits +#define HRPWM_HRCNFG2_CTLMODEDBRED_S 2U +#define HRPWM_HRCNFG2_CTLMODEDBRED_M 0xCU // DBRED Control Mode Select Bits +#define HRPWM_HRCNFG2_CTLMODEDBFED_S 4U +#define HRPWM_HRCNFG2_CTLMODEDBFED_M 0x30U // DBFED Control Mode Select Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the HRPCTL register +// +//************************************************************************************************* +#define HRPWM_HRPCTL_HRPE 0x1U // High Resolution Period Enable +#define HRPWM_HRPCTL_PWMSYNCSEL 0x2U // EPWMSYNCPER Source Select +#define HRPWM_HRPCTL_TBPHSHRLOADE 0x4U // TBPHSHR Load Enable +#define HRPWM_HRPCTL_PWMSYNCSELX_S 4U +#define HRPWM_HRPCTL_PWMSYNCSELX_M 0x70U // EPWMSYNCPER Extended Source Select Bit: + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TRREM register +// +//************************************************************************************************* +#define HRPWM_TRREM_TRREM_S 0U +#define HRPWM_TRREM_TRREM_M 0x7FFU // HRPWM Remainder Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL register +// +//************************************************************************************************* +#define HRPWM_GLDCTL_GLD 0x1U // Global Shadow to Active load event control +#define HRPWM_GLDCTL_GLDMODE_S 1U +#define HRPWM_GLDCTL_GLDMODE_M 0x1EU // Shadow to Active Global Load Pulse Selection +#define HRPWM_GLDCTL_OSHTMODE 0x20U // One Shot Load mode control bit +#define HRPWM_GLDCTL_GLDPRD_S 7U +#define HRPWM_GLDCTL_GLDPRD_M 0x380U // Global Load Strobe Period Select Register +#define HRPWM_GLDCTL_GLDCNT_S 10U +#define HRPWM_GLDCTL_GLDCNT_M 0x1C00U // Global Load Strobe Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCFG register +// +//************************************************************************************************* +#define HRPWM_GLDCFG_TBPRD_TBPRDHR 0x1U // Global load event configuration for TBPRD:TBPRDHR +#define HRPWM_GLDCFG_CMPA_CMPAHR 0x2U // Global load event configuration for CMPA:CMPAHR +#define HRPWM_GLDCFG_CMPB_CMPBHR 0x4U // Global load event configuration for CMPB:CMPBHR +#define HRPWM_GLDCFG_CMPC 0x8U // Global load event configuration for CMPC +#define HRPWM_GLDCFG_CMPD 0x10U // Global load event configuration for CMPD +#define HRPWM_GLDCFG_DBRED_DBREDHR 0x20U // Global load event configuration for DBRED:DBREDHR +#define HRPWM_GLDCFG_DBFED_DBFEDHR 0x40U // Global load event configuration for DBFED:DBFEDHR +#define HRPWM_GLDCFG_DBCTL 0x80U // Global load event configuration for DBCTL +#define HRPWM_GLDCFG_AQCTLA_AQCTLA2 0x100U // Global load event configuration for AQCTLA/A2 +#define HRPWM_GLDCFG_AQCTLB_AQCTLB2 0x200U // Global load event configuration for AQCTLB/B2 +#define HRPWM_GLDCFG_AQCSFRC 0x400U // Global load event configuration for AQCSFRC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EPWMXLINK register +// +//************************************************************************************************* +#define HRPWM_EPWMXLINK_TBPRDLINK_S 0U +#define HRPWM_EPWMXLINK_TBPRDLINK_M 0xFU // TBPRD:TBPRDHR Link +#define HRPWM_EPWMXLINK_CMPALINK_S 4U +#define HRPWM_EPWMXLINK_CMPALINK_M 0xF0U // CMPA:CMPAHR Link +#define HRPWM_EPWMXLINK_CMPBLINK_S 8U +#define HRPWM_EPWMXLINK_CMPBLINK_M 0xF00U // CMPB:CMPBHR Link +#define HRPWM_EPWMXLINK_CMPCLINK_S 12U +#define HRPWM_EPWMXLINK_CMPCLINK_M 0xF000U // CMPC Link +#define HRPWM_EPWMXLINK_CMPDLINK_S 16U +#define HRPWM_EPWMXLINK_CMPDLINK_M 0xF0000U // CMPD Link +#define HRPWM_EPWMXLINK_GLDCTL2LINK_S 28U +#define HRPWM_EPWMXLINK_GLDCTL2LINK_M 0xF0000000U // GLDCTL2 Link + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA register +// +//************************************************************************************************* +#define HRPWM_AQCTLA_ZRO_S 0U +#define HRPWM_AQCTLA_ZRO_M 0x3U // Action Counter = Zero +#define HRPWM_AQCTLA_PRD_S 2U +#define HRPWM_AQCTLA_PRD_M 0xCU // Action Counter = Period +#define HRPWM_AQCTLA_CAU_S 4U +#define HRPWM_AQCTLA_CAU_M 0x30U // Action Counter = Compare A Up +#define HRPWM_AQCTLA_CAD_S 6U +#define HRPWM_AQCTLA_CAD_M 0xC0U // Action Counter = Compare A Down +#define HRPWM_AQCTLA_CBU_S 8U +#define HRPWM_AQCTLA_CBU_M 0x300U // Action Counter = Compare B Up +#define HRPWM_AQCTLA_CBD_S 10U +#define HRPWM_AQCTLA_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLA2 register +// +//************************************************************************************************* +#define HRPWM_AQCTLA2_T1U_S 0U +#define HRPWM_AQCTLA2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define HRPWM_AQCTLA2_T1D_S 2U +#define HRPWM_AQCTLA2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define HRPWM_AQCTLA2_T2U_S 4U +#define HRPWM_AQCTLA2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define HRPWM_AQCTLA2_T2D_S 6U +#define HRPWM_AQCTLA2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB register +// +//************************************************************************************************* +#define HRPWM_AQCTLB_ZRO_S 0U +#define HRPWM_AQCTLB_ZRO_M 0x3U // Action Counter = Zero +#define HRPWM_AQCTLB_PRD_S 2U +#define HRPWM_AQCTLB_PRD_M 0xCU // Action Counter = Period +#define HRPWM_AQCTLB_CAU_S 4U +#define HRPWM_AQCTLB_CAU_M 0x30U // Action Counter = Compare A Up +#define HRPWM_AQCTLB_CAD_S 6U +#define HRPWM_AQCTLB_CAD_M 0xC0U // Action Counter = Compare A Down +#define HRPWM_AQCTLB_CBU_S 8U +#define HRPWM_AQCTLB_CBU_M 0x300U // Action Counter = Compare B Up +#define HRPWM_AQCTLB_CBD_S 10U +#define HRPWM_AQCTLB_CBD_M 0xC00U // Action Counter = Compare B Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCTLB2 register +// +//************************************************************************************************* +#define HRPWM_AQCTLB2_T1U_S 0U +#define HRPWM_AQCTLB2_T1U_M 0x3U // Action when event occurs on T1 in UP-Count +#define HRPWM_AQCTLB2_T1D_S 2U +#define HRPWM_AQCTLB2_T1D_M 0xCU // Action when event occurs on T1 in DOWN-Count +#define HRPWM_AQCTLB2_T2U_S 4U +#define HRPWM_AQCTLB2_T2U_M 0x30U // Action when event occurs on T2 in UP-Count +#define HRPWM_AQCTLB2_T2D_S 6U +#define HRPWM_AQCTLB2_T2D_M 0xC0U // Action when event occurs on T2 in DOWN-Count + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQSFRC register +// +//************************************************************************************************* +#define HRPWM_AQSFRC_ACTSFA_S 0U +#define HRPWM_AQSFRC_ACTSFA_M 0x3U // Action when One-time SW Force A Invoked +#define HRPWM_AQSFRC_OTSFA 0x4U // One-time SW Force A Output +#define HRPWM_AQSFRC_ACTSFB_S 3U +#define HRPWM_AQSFRC_ACTSFB_M 0x18U // Action when One-time SW Force B Invoked +#define HRPWM_AQSFRC_OTSFB 0x20U // One-time SW Force A Output +#define HRPWM_AQSFRC_RLDCSF_S 6U +#define HRPWM_AQSFRC_RLDCSF_M 0xC0U // Reload from Shadow Options + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AQCSFRC register +// +//************************************************************************************************* +#define HRPWM_AQCSFRC_CSFA_S 0U +#define HRPWM_AQCSFRC_CSFA_M 0x3U // Continuous Software Force on output A +#define HRPWM_AQCSFRC_CSFB_S 2U +#define HRPWM_AQCSFRC_CSFB_M 0xCU // Continuous Software Force on output B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBREDHR register +// +//************************************************************************************************* +#define HRPWM_DBREDHR_DBREDHR_S 9U +#define HRPWM_DBREDHR_DBREDHR_M 0xFE00U // DBREDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBRED register +// +//************************************************************************************************* +#define HRPWM_DBRED_DBRED_S 0U +#define HRPWM_DBRED_DBRED_M 0x3FFFU // Rising edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFEDHR register +// +//************************************************************************************************* +#define HRPWM_DBFEDHR_DBFEDHR_S 9U +#define HRPWM_DBFEDHR_DBFEDHR_M 0xFE00U // DBFEDHR High Resolution Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DBFED register +// +//************************************************************************************************* +#define HRPWM_DBFED_DBFED_S 0U +#define HRPWM_DBFED_DBFED_M 0x3FFFU // Falling edge delay value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TBPHS register +// +//************************************************************************************************* +#define HRPWM_TBPHS_TBPHSHR_S 0U +#define HRPWM_TBPHS_TBPHSHR_M 0xFFFFU // Extension Register for HRPWM Phase (8-bits) +#define HRPWM_TBPHS_TBPHS_S 16U +#define HRPWM_TBPHS_TBPHS_M 0xFFFF0000U // Phase Offset Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPA register +// +//************************************************************************************************* +#define HRPWM_CMPA_CMPAHR_S 0U +#define HRPWM_CMPA_CMPAHR_M 0xFFFFU // Compare A HRPWM Extension Register +#define HRPWM_CMPA_CMPA_S 16U +#define HRPWM_CMPA_CMPA_M 0xFFFF0000U // Compare A Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CMPB register +// +//************************************************************************************************* +#define HRPWM_CMPB_CMPBHR_S 0U +#define HRPWM_CMPB_CMPBHR_M 0xFFFFU // Compare B High Resolution Bits +#define HRPWM_CMPB_CMPB_S 16U +#define HRPWM_CMPB_CMPB_M 0xFFFF0000U // Compare B Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GLDCTL2 register +// +//************************************************************************************************* +#define HRPWM_GLDCTL2_OSHTLD 0x1U // Enable reload event in one shot mode +#define HRPWM_GLDCTL2_GFRCLD 0x2U // Force reload event in one shot mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZSEL register +// +//************************************************************************************************* +#define HRPWM_TZSEL_CBC1 0x1U // TZ1 CBC select +#define HRPWM_TZSEL_CBC2 0x2U // TZ2 CBC select +#define HRPWM_TZSEL_CBC3 0x4U // TZ3 CBC select +#define HRPWM_TZSEL_CBC4 0x8U // TZ4 CBC select +#define HRPWM_TZSEL_CBC5 0x10U // TZ5 CBC select +#define HRPWM_TZSEL_CBC6 0x20U // TZ6 CBC select +#define HRPWM_TZSEL_DCAEVT2 0x40U // DCAEVT2 CBC select +#define HRPWM_TZSEL_DCBEVT2 0x80U // DCBEVT2 CBC select +#define HRPWM_TZSEL_OSHT1 0x100U // One-shot TZ1 select +#define HRPWM_TZSEL_OSHT2 0x200U // One-shot TZ2 select +#define HRPWM_TZSEL_OSHT3 0x400U // One-shot TZ3 select +#define HRPWM_TZSEL_OSHT4 0x800U // One-shot TZ4 select +#define HRPWM_TZSEL_OSHT5 0x1000U // One-shot TZ5 select +#define HRPWM_TZSEL_OSHT6 0x2000U // One-shot TZ6 select +#define HRPWM_TZSEL_DCAEVT1 0x4000U // One-shot DCAEVT1 select +#define HRPWM_TZSEL_DCBEVT1 0x8000U // One-shot DCBEVT1 select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZDCSEL register +// +//************************************************************************************************* +#define HRPWM_TZDCSEL_DCAEVT1_S 0U +#define HRPWM_TZDCSEL_DCAEVT1_M 0x7U // Digital Compare Output A Event 1 +#define HRPWM_TZDCSEL_DCAEVT2_S 3U +#define HRPWM_TZDCSEL_DCAEVT2_M 0x38U // Digital Compare Output A Event 2 +#define HRPWM_TZDCSEL_DCBEVT1_S 6U +#define HRPWM_TZDCSEL_DCBEVT1_M 0x1C0U // Digital Compare Output B Event 1 +#define HRPWM_TZDCSEL_DCBEVT2_S 9U +#define HRPWM_TZDCSEL_DCBEVT2_M 0xE00U // Digital Compare Output B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL register +// +//************************************************************************************************* +#define HRPWM_TZCTL_TZA_S 0U +#define HRPWM_TZCTL_TZA_M 0x3U // TZ1 to TZ6 Trip Action On EPWMxA +#define HRPWM_TZCTL_TZB_S 2U +#define HRPWM_TZCTL_TZB_M 0xCU // TZ1 to TZ6 Trip Action On EPWMxB +#define HRPWM_TZCTL_DCAEVT1_S 4U +#define HRPWM_TZCTL_DCAEVT1_M 0x30U // EPWMxA action on DCAEVT1 +#define HRPWM_TZCTL_DCAEVT2_S 6U +#define HRPWM_TZCTL_DCAEVT2_M 0xC0U // EPWMxA action on DCAEVT2 +#define HRPWM_TZCTL_DCBEVT1_S 8U +#define HRPWM_TZCTL_DCBEVT1_M 0x300U // EPWMxB action on DCBEVT1 +#define HRPWM_TZCTL_DCBEVT2_S 10U +#define HRPWM_TZCTL_DCBEVT2_M 0xC00U // EPWMxB action on DCBEVT2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTL2 register +// +//************************************************************************************************* +#define HRPWM_TZCTL2_TZAU_S 0U +#define HRPWM_TZCTL2_TZAU_M 0x7U // Trip Action On EPWMxA while Count direction is UP +#define HRPWM_TZCTL2_TZAD_S 3U +#define HRPWM_TZCTL2_TZAD_M 0x38U // Trip Action On EPWMxA while Count direction is DOWN +#define HRPWM_TZCTL2_TZBU_S 6U +#define HRPWM_TZCTL2_TZBU_M 0x1C0U // Trip Action On EPWMxB while Count direction is UP +#define HRPWM_TZCTL2_TZBD_S 9U +#define HRPWM_TZCTL2_TZBD_M 0xE00U // Trip Action On EPWMxB while Count direction is DOWN +#define HRPWM_TZCTL2_ETZE 0x8000U // TZCTL2 Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCA register +// +//************************************************************************************************* +#define HRPWM_TZCTLDCA_DCAEVT1U_S 0U +#define HRPWM_TZCTLDCA_DCAEVT1U_M 0x7U // DCAEVT1 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCA_DCAEVT1D_S 3U +#define HRPWM_TZCTLDCA_DCAEVT1D_M 0x38U // DCAEVT1 Action On EPWMxA while Count direction is + // DOWN +#define HRPWM_TZCTLDCA_DCAEVT2U_S 6U +#define HRPWM_TZCTLDCA_DCAEVT2U_M 0x1C0U // DCAEVT2 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCA_DCAEVT2D_S 9U +#define HRPWM_TZCTLDCA_DCAEVT2D_M 0xE00U // DCAEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCTLDCB register +// +//************************************************************************************************* +#define HRPWM_TZCTLDCB_DCBEVT1U_S 0U +#define HRPWM_TZCTLDCB_DCBEVT1U_M 0x7U // DCBEVT1 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCB_DCBEVT1D_S 3U +#define HRPWM_TZCTLDCB_DCBEVT1D_M 0x38U // DCBEVT1 Action On EPWMxA while Count direction is + // DOWN +#define HRPWM_TZCTLDCB_DCBEVT2U_S 6U +#define HRPWM_TZCTLDCB_DCBEVT2U_M 0x1C0U // DCBEVT2 Action On EPWMxA while Count direction is + // UP +#define HRPWM_TZCTLDCB_DCBEVT2D_S 9U +#define HRPWM_TZCTLDCB_DCBEVT2D_M 0xE00U // DCBEVT2 Action On EPWMxA while Count direction is + // DOWN + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZEINT register +// +//************************************************************************************************* +#define HRPWM_TZEINT_CBC 0x2U // Trip Zones Cycle By Cycle Int Enable +#define HRPWM_TZEINT_OST 0x4U // Trip Zones One Shot Int Enable +#define HRPWM_TZEINT_DCAEVT1 0x8U // Digital Compare A Event 1 Int Enable +#define HRPWM_TZEINT_DCAEVT2 0x10U // Digital Compare A Event 2 Int Enable +#define HRPWM_TZEINT_DCBEVT1 0x20U // Digital Compare B Event 1 Int Enable +#define HRPWM_TZEINT_DCBEVT2 0x40U // Digital Compare B Event 2 Int Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFLG register +// +//************************************************************************************************* +#define HRPWM_TZFLG_INT 0x1U // Global Int Status Flag +#define HRPWM_TZFLG_CBC 0x2U // Trip Zones Cycle By Cycle Flag +#define HRPWM_TZFLG_OST 0x4U // Trip Zones One Shot Flag +#define HRPWM_TZFLG_DCAEVT1 0x8U // Digital Compare A Event 1 Flag +#define HRPWM_TZFLG_DCAEVT2 0x10U // Digital Compare A Event 2 Flag +#define HRPWM_TZFLG_DCBEVT1 0x20U // Digital Compare B Event 1 Flag +#define HRPWM_TZFLG_DCBEVT2 0x40U // Digital Compare B Event 2 Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCFLG register +// +//************************************************************************************************* +#define HRPWM_TZCBCFLG_CBC1 0x1U // Latched Status Flag for CBC1 Trip Latch +#define HRPWM_TZCBCFLG_CBC2 0x2U // Latched Status Flag for CBC2 Trip Latch +#define HRPWM_TZCBCFLG_CBC3 0x4U // Latched Status Flag for CBC3 Trip Latch +#define HRPWM_TZCBCFLG_CBC4 0x8U // Latched Status Flag for CBC4 Trip Latch +#define HRPWM_TZCBCFLG_CBC5 0x10U // Latched Status Flag for CBC5 Trip Latch +#define HRPWM_TZCBCFLG_CBC6 0x20U // Latched Status Flag for CBC6 Trip Latch +#define HRPWM_TZCBCFLG_DCAEVT2 0x40U // Latched Status Flag for Digital Compare Output A Event + // 2 +#define HRPWM_TZCBCFLG_DCBEVT2 0x80U // Latched Status Flag for Digital Compare Output B Event + // 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTFLG register +// +//************************************************************************************************* +#define HRPWM_TZOSTFLG_OST1 0x1U // Latched Status Flag for OST1 Trip Latch +#define HRPWM_TZOSTFLG_OST2 0x2U // Latched Status Flag for OST2 Trip Latch +#define HRPWM_TZOSTFLG_OST3 0x4U // Latched Status Flag for OST3 Trip Latch +#define HRPWM_TZOSTFLG_OST4 0x8U // Latched Status Flag for OST4 Trip Latch +#define HRPWM_TZOSTFLG_OST5 0x10U // Latched Status Flag for OST5 Trip Latch +#define HRPWM_TZOSTFLG_OST6 0x20U // Latched Status Flag for OST6 Trip Latch +#define HRPWM_TZOSTFLG_DCAEVT1 0x40U // Latched Status Flag for Digital Compare Output A Event + // 1 +#define HRPWM_TZOSTFLG_DCBEVT1 0x80U // Latched Status Flag for Digital Compare Output B Event + // 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCLR register +// +//************************************************************************************************* +#define HRPWM_TZCLR_INT 0x1U // Global Interrupt Clear Flag +#define HRPWM_TZCLR_CBC 0x2U // Cycle-By-Cycle Flag Clear +#define HRPWM_TZCLR_OST 0x4U // One-Shot Flag Clear +#define HRPWM_TZCLR_DCAEVT1 0x8U // DCAVET1 Flag Clear +#define HRPWM_TZCLR_DCAEVT2 0x10U // DCAEVT2 Flag Clear +#define HRPWM_TZCLR_DCBEVT1 0x20U // DCBEVT1 Flag Clear +#define HRPWM_TZCLR_DCBEVT2 0x40U // DCBEVT2 Flag Clear +#define HRPWM_TZCLR_CBCPULSE_S 14U +#define HRPWM_TZCLR_CBCPULSE_M 0xC000U // Clear Pulse for CBC Trip Latch + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZCBCCLR register +// +//************************************************************************************************* +#define HRPWM_TZCBCCLR_CBC1 0x1U // Clear Flag for Cycle-By-Cycle (CBC1) Trip Latch +#define HRPWM_TZCBCCLR_CBC2 0x2U // Clear Flag for Cycle-By-Cycle (CBC2) Trip Latch +#define HRPWM_TZCBCCLR_CBC3 0x4U // Clear Flag for Cycle-By-Cycle (CBC3) Trip Latch +#define HRPWM_TZCBCCLR_CBC4 0x8U // Clear Flag for Cycle-By-Cycle (CBC4) Trip Latch +#define HRPWM_TZCBCCLR_CBC5 0x10U // Clear Flag for Cycle-By-Cycle (CBC5) Trip Latch +#define HRPWM_TZCBCCLR_CBC6 0x20U // Clear Flag for Cycle-By-Cycle (CBC6) Trip Latch +#define HRPWM_TZCBCCLR_DCAEVT2 0x40U // Clear Flag forDCAEVT2 selected for CBC +#define HRPWM_TZCBCCLR_DCBEVT2 0x80U // Clear Flag for DCBEVT2 selected for CBC + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZOSTCLR register +// +//************************************************************************************************* +#define HRPWM_TZOSTCLR_OST1 0x1U // Clear Flag for Oneshot (OST1) Trip Latch +#define HRPWM_TZOSTCLR_OST2 0x2U // Clear Flag for Oneshot (OST2) Trip Latch +#define HRPWM_TZOSTCLR_OST3 0x4U // Clear Flag for Oneshot (OST3) Trip Latch +#define HRPWM_TZOSTCLR_OST4 0x8U // Clear Flag for Oneshot (OST4) Trip Latch +#define HRPWM_TZOSTCLR_OST5 0x10U // Clear Flag for Oneshot (OST5) Trip Latch +#define HRPWM_TZOSTCLR_OST6 0x20U // Clear Flag for Oneshot (OST6) Trip Latch +#define HRPWM_TZOSTCLR_DCAEVT1 0x40U // Clear Flag for DCAEVT1 selected for OST +#define HRPWM_TZOSTCLR_DCBEVT1 0x80U // Clear Flag for DCBEVT1 selected for OST + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TZFRC register +// +//************************************************************************************************* +#define HRPWM_TZFRC_CBC 0x2U // Force Trip Zones Cycle By Cycle Event +#define HRPWM_TZFRC_OST 0x4U // Force Trip Zones One Shot Event +#define HRPWM_TZFRC_DCAEVT1 0x8U // Force Digital Compare A Event 1 +#define HRPWM_TZFRC_DCAEVT2 0x10U // Force Digital Compare A Event 2 +#define HRPWM_TZFRC_DCBEVT1 0x20U // Force Digital Compare B Event 1 +#define HRPWM_TZFRC_DCBEVT2 0x40U // Force Digital Compare B Event 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSEL register +// +//************************************************************************************************* +#define HRPWM_ETSEL_INTSEL_S 0U +#define HRPWM_ETSEL_INTSEL_M 0x7U // EPWMxINTn Select +#define HRPWM_ETSEL_INTEN 0x8U // EPWMxINTn Enable +#define HRPWM_ETSEL_SOCASELCMP 0x10U // EPWMxSOCA Compare Select +#define HRPWM_ETSEL_SOCBSELCMP 0x20U // EPWMxSOCB Compare Select +#define HRPWM_ETSEL_INTSELCMP 0x40U // EPWMxINT Compare Select +#define HRPWM_ETSEL_SOCASEL_S 8U +#define HRPWM_ETSEL_SOCASEL_M 0x700U // Start of Conversion A Select +#define HRPWM_ETSEL_SOCAEN 0x800U // Start of Conversion A Enable +#define HRPWM_ETSEL_SOCBSEL_S 12U +#define HRPWM_ETSEL_SOCBSEL_M 0x7000U // Start of Conversion B Select +#define HRPWM_ETSEL_SOCBEN 0x8000U // Start of Conversion B Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETPS register +// +//************************************************************************************************* +#define HRPWM_ETPS_INTPRD_S 0U +#define HRPWM_ETPS_INTPRD_M 0x3U // EPWMxINTn Period Select +#define HRPWM_ETPS_INTCNT_S 2U +#define HRPWM_ETPS_INTCNT_M 0xCU // EPWMxINTn Counter Register +#define HRPWM_ETPS_INTPSSEL 0x10U // EPWMxINTn Pre-Scale Selection Bits +#define HRPWM_ETPS_SOCPSSEL 0x20U // EPWMxSOC A/B Pre-Scale Selection Bits +#define HRPWM_ETPS_SOCAPRD_S 8U +#define HRPWM_ETPS_SOCAPRD_M 0x300U // EPWMxSOCA Period Select +#define HRPWM_ETPS_SOCACNT_S 10U +#define HRPWM_ETPS_SOCACNT_M 0xC00U // EPWMxSOCA Counter Register +#define HRPWM_ETPS_SOCBPRD_S 12U +#define HRPWM_ETPS_SOCBPRD_M 0x3000U // EPWMxSOCB Period Select +#define HRPWM_ETPS_SOCBCNT_S 14U +#define HRPWM_ETPS_SOCBCNT_M 0xC000U // EPWMxSOCB Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFLG register +// +//************************************************************************************************* +#define HRPWM_ETFLG_INT 0x1U // EPWMxINTn Flag +#define HRPWM_ETFLG_SOCA 0x4U // EPWMxSOCA Flag +#define HRPWM_ETFLG_SOCB 0x8U // EPWMxSOCB Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCLR register +// +//************************************************************************************************* +#define HRPWM_ETCLR_INT 0x1U // EPWMxINTn Clear +#define HRPWM_ETCLR_SOCA 0x4U // EPWMxSOCA Clear +#define HRPWM_ETCLR_SOCB 0x8U // EPWMxSOCB Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETFRC register +// +//************************************************************************************************* +#define HRPWM_ETFRC_INT 0x1U // EPWMxINTn Force +#define HRPWM_ETFRC_SOCA 0x4U // EPWMxSOCA Force +#define HRPWM_ETFRC_SOCB 0x8U // EPWMxSOCB Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETINTPS register +// +//************************************************************************************************* +#define HRPWM_ETINTPS_INTPRD2_S 0U +#define HRPWM_ETINTPS_INTPRD2_M 0xFU // EPWMxINTn Period Select +#define HRPWM_ETINTPS_INTCNT2_S 4U +#define HRPWM_ETINTPS_INTCNT2_M 0xF0U // EPWMxINTn Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETSOCPS register +// +//************************************************************************************************* +#define HRPWM_ETSOCPS_SOCAPRD2_S 0U +#define HRPWM_ETSOCPS_SOCAPRD2_M 0xFU // EPWMxSOCA Period Select +#define HRPWM_ETSOCPS_SOCACNT2_S 4U +#define HRPWM_ETSOCPS_SOCACNT2_M 0xF0U // EPWMxSOCA Counter Register +#define HRPWM_ETSOCPS_SOCBPRD2_S 8U +#define HRPWM_ETSOCPS_SOCBPRD2_M 0xF00U // EPWMxSOCB Period Select +#define HRPWM_ETSOCPS_SOCBCNT2_S 12U +#define HRPWM_ETSOCPS_SOCBCNT2_M 0xF000U // EPWMxSOCB Counter Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINITCTL register +// +//************************************************************************************************* +#define HRPWM_ETCNTINITCTL_INTINITFRC 0x400U // EPWMxINT Counter Initialization Force +#define HRPWM_ETCNTINITCTL_SOCAINITFRC 0x800U // EPWMxSOCA Counter Initialization Force +#define HRPWM_ETCNTINITCTL_SOCBINITFRC 0x1000U // EPWMxSOCB Counter Initialization Force +#define HRPWM_ETCNTINITCTL_INTINITEN 0x2000U // EPWMxINT Counter Initialization Enable +#define HRPWM_ETCNTINITCTL_SOCAINITEN 0x4000U // EPWMxSOCA Counter Initialization Enable +#define HRPWM_ETCNTINITCTL_SOCBINITEN 0x8000U // EPWMxSOCB Counter Initialization Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ETCNTINIT register +// +//************************************************************************************************* +#define HRPWM_ETCNTINIT_INTINIT_S 0U +#define HRPWM_ETCNTINIT_INTINIT_M 0xFU // EPWMxINT Counter Initialization Bits +#define HRPWM_ETCNTINIT_SOCAINIT_S 4U +#define HRPWM_ETCNTINIT_SOCAINIT_M 0xF0U // EPWMxSOCA Counter Initialization Bits +#define HRPWM_ETCNTINIT_SOCBINIT_S 8U +#define HRPWM_ETCNTINIT_SOCBINIT_M 0xF00U // EPWMxSOCB Counter Initialization Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCTRIPSEL_DCAHCOMPSEL_S 0U +#define HRPWM_DCTRIPSEL_DCAHCOMPSEL_M 0xFU // Digital Compare A High COMP Input Select +#define HRPWM_DCTRIPSEL_DCALCOMPSEL_S 4U +#define HRPWM_DCTRIPSEL_DCALCOMPSEL_M 0xF0U // Digital Compare A Low COMP Input Select +#define HRPWM_DCTRIPSEL_DCBHCOMPSEL_S 8U +#define HRPWM_DCTRIPSEL_DCBHCOMPSEL_M 0xF00U // Digital Compare B High COMP Input Select +#define HRPWM_DCTRIPSEL_DCBLCOMPSEL_S 12U +#define HRPWM_DCTRIPSEL_DCBLCOMPSEL_M 0xF000U // Digital Compare B Low COMP Input Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCACTL register +// +//************************************************************************************************* +#define HRPWM_DCACTL_EVT1SRCSEL 0x1U // DCAEVT1 Source Signal +#define HRPWM_DCACTL_EVT1FRCSYNCSEL 0x2U // DCAEVT1 Force Sync Signal +#define HRPWM_DCACTL_EVT1SOCE 0x4U // DCAEVT1 SOC Enable +#define HRPWM_DCACTL_EVT1SYNCE 0x8U // DCAEVT1 SYNC Enable +#define HRPWM_DCACTL_EVT2SRCSEL 0x100U // DCAEVT2 Source Signal +#define HRPWM_DCACTL_EVT2FRCSYNCSEL 0x200U // DCAEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBCTL register +// +//************************************************************************************************* +#define HRPWM_DCBCTL_EVT1SRCSEL 0x1U // DCBEVT1 Source Signal +#define HRPWM_DCBCTL_EVT1FRCSYNCSEL 0x2U // DCBEVT1 Force Sync Signal +#define HRPWM_DCBCTL_EVT1SOCE 0x4U // DCBEVT1 SOC Enable +#define HRPWM_DCBCTL_EVT1SYNCE 0x8U // DCBEVT1 SYNC Enable +#define HRPWM_DCBCTL_EVT2SRCSEL 0x100U // DCBEVT2 Source Signal +#define HRPWM_DCBCTL_EVT2FRCSYNCSEL 0x200U // DCBEVT2 Force Sync Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCFCTL register +// +//************************************************************************************************* +#define HRPWM_DCFCTL_SRCSEL_S 0U +#define HRPWM_DCFCTL_SRCSEL_M 0x3U // Filter Block Signal Source Select +#define HRPWM_DCFCTL_BLANKE 0x4U // Blanking Enable/Disable +#define HRPWM_DCFCTL_BLANKINV 0x8U // Blanking Window Inversion +#define HRPWM_DCFCTL_PULSESEL_S 4U +#define HRPWM_DCFCTL_PULSESEL_M 0x30U // Pulse Select for Blanking & Capture Alignment +#define HRPWM_DCFCTL_EDGEFILTSEL 0x40U // Edge Filter Select +#define HRPWM_DCFCTL_EDGEMODE_S 8U +#define HRPWM_DCFCTL_EDGEMODE_M 0x300U // Edge Mode +#define HRPWM_DCFCTL_EDGECOUNT_S 10U +#define HRPWM_DCFCTL_EDGECOUNT_M 0x1C00U // Edge Count +#define HRPWM_DCFCTL_EDGESTATUS_S 13U +#define HRPWM_DCFCTL_EDGESTATUS_M 0xE000U // Edge Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCCAPCTL register +// +//************************************************************************************************* +#define HRPWM_DCCAPCTL_CAPE 0x1U // Counter Capture Enable +#define HRPWM_DCCAPCTL_SHDWMODE 0x2U // Counter Capture Mode +#define HRPWM_DCCAPCTL_CAPSTS 0x2000U // Latched Status Flag for Capture Event +#define HRPWM_DCCAPCTL_CAPCLR 0x4000U // DC Capture Latched Status Clear Flag +#define HRPWM_DCCAPCTL_CAPMODE 0x8000U // Counter Capture Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCAHTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCAHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAH Mux +#define HRPWM_DCAHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCALTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCALTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCAL Mux +#define HRPWM_DCALTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCAL Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBHTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCBHTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBH Mux +#define HRPWM_DCBHTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBH Mux + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DCBLTRIPSEL register +// +//************************************************************************************************* +#define HRPWM_DCBLTRIPSEL_TRIPINPUT1 0x1U // Trip Input 1 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT2 0x2U // Trip Input 2 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT3 0x4U // Trip Input 3 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT4 0x8U // Trip Input 4 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT5 0x10U // Trip Input 5 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT6 0x20U // Trip Input 6 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT7 0x40U // Trip Input 7 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT8 0x80U // Trip Input 8 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT9 0x100U // Trip Input 9 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT10 0x200U // Trip Input 10 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT11 0x400U // Trip Input 11 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT12 0x800U // Trip Input 12 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT14 0x2000U // Trip Input 14 Select to DCBL Mux +#define HRPWM_DCBLTRIPSEL_TRIPINPUT15 0x4000U // Trip Input 15 Select to DCBL Mux + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_i2c.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_i2c.h new file mode 100644 index 0000000..e37ef50 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_i2c.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_i2c.h +// +// TITLE: Definitions for the I2C registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_I2C_H +#define HW_I2C_H + +//************************************************************************************************* +// +// The following are defines for the I2C register offsets +// +//************************************************************************************************* +#define I2C_O_OAR 0x0U // I2C Own address +#define I2C_O_IER 0x1U // I2C Interrupt Enable +#define I2C_O_STR 0x2U // I2C Status +#define I2C_O_CLKL 0x3U // I2C Clock low-time divider +#define I2C_O_CLKH 0x4U // I2C Clock high-time divider +#define I2C_O_CNT 0x5U // I2C Data count +#define I2C_O_DRR 0x6U // I2C Data receive +#define I2C_O_SAR 0x7U // I2C Slave address +#define I2C_O_DXR 0x8U // I2C Data Transmit +#define I2C_O_MDR 0x9U // I2C Mode +#define I2C_O_ISRC 0xAU // I2C Interrupt Source +#define I2C_O_EMDR 0xBU // I2C Extended Mode +#define I2C_O_PSC 0xCU // I2C Prescaler +#define I2C_O_FFTX 0x20U // I2C FIFO Transmit +#define I2C_O_FFRX 0x21U // I2C FIFO Receive + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2COAR register +// +//************************************************************************************************* +#define I2C_OAR_OAR_S 0U +#define I2C_OAR_OAR_M 0x3FFU // I2C Own address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CIER register +// +//************************************************************************************************* +#define I2C_IER_ARBL 0x1U // Arbitration-lost interrupt enable +#define I2C_IER_NACK 0x2U // No-acknowledgment interrupt enable +#define I2C_IER_ARDY 0x4U // Register-access-ready interrupt enable +#define I2C_IER_RRDY 0x8U // Receive-data-ready interrupt enable +#define I2C_IER_XRDY 0x10U // Transmit-data-ready interrupt enable +#define I2C_IER_SCD 0x20U // Stop condition detected interrupt enable +#define I2C_IER_AAS 0x40U // Addressed as slave interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CSTR register +// +//************************************************************************************************* +#define I2C_STR_ARBL 0x1U // Arbitration-lost interrupt flag bit +#define I2C_STR_NACK 0x2U // No-acknowledgment interrupt flag bit. +#define I2C_STR_ARDY 0x4U // Register-access-ready interrupt flag bit +#define I2C_STR_RRDY 0x8U // Receive-data-ready interrupt flag bit. +#define I2C_STR_XRDY 0x10U // Transmit-data-ready interrupt flag bit. +#define I2C_STR_SCD 0x20U // Stop condition detected bit. +#define I2C_STR_AD0 0x100U // Address 0 bits +#define I2C_STR_AAS 0x200U // Addressed-as-slave bit +#define I2C_STR_XSMT 0x400U // Transmit shift register empty bit. +#define I2C_STR_RSFULL 0x800U // Receive shift register full bit. +#define I2C_STR_BB 0x1000U // Bus busy bit. +#define I2C_STR_NACKSNT 0x2000U // NACK sent bit. +#define I2C_STR_SDIR 0x4000U // Slave direction bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CDRR register +// +//************************************************************************************************* +#define I2C_DRR_DATA_S 0U +#define I2C_DRR_DATA_M 0xFFU // Receive data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CSAR register +// +//************************************************************************************************* +#define I2C_SAR_SAR_S 0U +#define I2C_SAR_SAR_M 0x3FFU // Slave Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CDXR register +// +//************************************************************************************************* +#define I2C_DXR_DATA_S 0U +#define I2C_DXR_DATA_M 0xFFU // Transmit data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CMDR register +// +//************************************************************************************************* +#define I2C_MDR_BC_S 0U +#define I2C_MDR_BC_M 0x7U // Bit count bits. +#define I2C_MDR_FDF 0x8U // Free Data Format +#define I2C_MDR_STB 0x10U // START Byte Mode +#define I2C_MDR_IRS 0x20U // I2C Module Reset +#define I2C_MDR_DLB 0x40U // Digital Loopback Mode +#define I2C_MDR_RM 0x80U // Repeat Mode +#define I2C_MDR_XA 0x100U // Expanded Address Mode +#define I2C_MDR_TRX 0x200U // Transmitter Mode +#define I2C_MDR_MST 0x400U // Master Mode +#define I2C_MDR_STP 0x800U // STOP Condition +#define I2C_MDR_STT 0x2000U // START condition bit +#define I2C_MDR_FREE 0x4000U // Debug Action +#define I2C_MDR_NACKMOD 0x8000U // NACK mode bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CISRC register +// +//************************************************************************************************* +#define I2C_ISRC_INTCODE_S 0U +#define I2C_ISRC_INTCODE_M 0x7U // Interrupt code bits. +#define I2C_ISRC_WRITE_ZEROS_S 8U +#define I2C_ISRC_WRITE_ZEROS_M 0xF00U // Always write all 0s to this field + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CEMDR register +// +//************************************************************************************************* +#define I2C_EMDR_BC 0x1U // Backwards compatibility mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CPSC register +// +//************************************************************************************************* +#define I2C_PSC_IPSC_S 0U +#define I2C_PSC_IPSC_M 0xFFU // I2C Prescaler Divide Down + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CFFTX register +// +//************************************************************************************************* +#define I2C_FFTX_TXFFIL_S 0U +#define I2C_FFTX_TXFFIL_M 0x1FU // Transmit FIFO Interrupt Level +#define I2C_FFTX_TXFFIENA 0x20U // Transmit FIFO Interrupt Enable +#define I2C_FFTX_TXFFINTCLR 0x40U // Transmit FIFO Interrupt Flag Clear +#define I2C_FFTX_TXFFINT 0x80U // Transmit FIFO Interrupt Flag +#define I2C_FFTX_TXFFST_S 8U +#define I2C_FFTX_TXFFST_M 0x1F00U // Transmit FIFO Status +#define I2C_FFTX_TXFFRST 0x2000U // Transmit FIFO Reset +#define I2C_FFTX_I2CFFEN 0x4000U // Transmit FIFO Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the I2CFFRX register +// +//************************************************************************************************* +#define I2C_FFRX_RXFFIL_S 0U +#define I2C_FFRX_RXFFIL_M 0x1FU // Receive FIFO Interrupt Level +#define I2C_FFRX_RXFFIENA 0x20U // Receive FIFO Interrupt Enable +#define I2C_FFRX_RXFFINTCLR 0x40U // Receive FIFO Interrupt Flag Clear +#define I2C_FFRX_RXFFINT 0x80U // Receive FIFO Interrupt Flag +#define I2C_FFRX_RXFFST_S 8U +#define I2C_FFRX_RXFFST_M 0x1F00U // Receive FIFO Status +#define I2C_FFRX_RXFFRST 0x2000U // Receive FIFO Reset + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_inputxbar.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_inputxbar.h new file mode 100644 index 0000000..a2567f2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_inputxbar.h @@ -0,0 +1,92 @@ +//########################################################################### +// +// FILE: hw_inputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_INPUTXBAR_H +#define HW_INPUTXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_INPUT1SELECT 0x0U // INPUT1 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT2SELECT 0x1U // INPUT2 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT3SELECT 0x2U // INPUT3 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT4SELECT 0x3U // INPUT4 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT5SELECT 0x4U // INPUT5 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT6SELECT 0x5U // INPUT6 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT7SELECT 0x6U // INPUT7 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT8SELECT 0x7U // INPUT8 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT9SELECT 0x8U // INPUT9 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT10SELECT 0x9U // INPUT10 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT11SELECT 0xAU // INPUT11 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT12SELECT 0xBU // INPUT12 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT13SELECT 0xCU // INPUT13 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUT14SELECT 0xDU // INPUT14 Input Select Register (GPIO0 to x) +#define XBAR_O_INPUTSELECTLOCK 0x1EU // Input Select Lock Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INPUTSELECTLOCK register +// +//************************************************************************************************* +#define XBAR_INPUTSELECTLOCK_INPUT1SELECT 0x1U // Lock bit for INPUT1SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT2SELECT 0x2U // Lock bit for INPUT2SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT3SELECT 0x4U // Lock bit for INPUT3SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT4SELECT 0x8U // Lock bit for INPUT4SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT5SELECT 0x10U // Lock bit for INPUT5SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT6SELECT 0x20U // Lock bit for INPUT6SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT7SELECT 0x40U // Lock bit for INPUT7SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT8SELECT 0x80U // Lock bit for INPUT8SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT9SELECT 0x100U // Lock bit for INPUT9SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT10SELECT 0x200U // Lock bit for INPUT10SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT11SELECT 0x400U // Lock bit for INPUT11SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT12SELECT 0x800U // Lock bit for INPUT12SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT13SELECT 0x1000U // Lock bit for INPUT13SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT14SELECT 0x2000U // Lock bit for INPUT14SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT15SELECT 0x4000U // Lock bit for INPUT15SELECT Register +#define XBAR_INPUTSELECTLOCK_INPUT16SELECT 0x8000U // Lock bit for INPUT16SELECT Register + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_ints.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ints.h new file mode 100644 index 0000000..d49c58d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ints.h @@ -0,0 +1,212 @@ +//########################################################################### +// +// FILE: hw_ints.h +// +// TITLE: Definitions of interrupt numbers for use with interrupt.c. +// +//########################################################################### +// +// +//########################################################################### + +#ifndef HW_INTS_H +#define HW_INTS_H + +//***************************************************************************** +// +// PIE Interrupt Numbers +// +// 0x00FF = PIE Table Row # +// 0xFF00 = PIE Table Column # +// 0xFFFF0000 = PIE Vector ID +// +//***************************************************************************** + +// Lower PIE Group 1 +#define INT_ADCA1 0x00200101U // 1.1 - ADCA Interrupt 1 +#define INT_ADCB1 0x00210102U // 1.2 - ADCB Interrupt 1 +#define INT_ADCC1 0x00220103U // 1.3 - ADCC Interrupt 1 +#define INT_XINT1 0x00230104U // 1.4 - XINT1 Interrupt +#define INT_XINT2 0x00240105U // 1.5 - XINT2 Interrupt +#define INT_ADCD1 0x00250106U // 1.6 - ADCD Interrupt 1 +#define INT_TIMER0 0x00260107U // 1.7 - Timer 0 Interrupt +#define INT_WAKE 0x00270108U // 1.8 - Standby and Halt Wakeup Interrupt + +// Lower PIE Group 2 +#define INT_EPWM1_TZ 0x00280201U // 2.1 - ePWM1 Trip Zone Interrupt +#define INT_EPWM2_TZ 0x00290202U // 2.2 - ePWM2 Trip Zone Interrupt +#define INT_EPWM3_TZ 0x002A0203U // 2.3 - ePWM3 Trip Zone Interrupt +#define INT_EPWM4_TZ 0x002B0204U // 2.4 - ePWM4 Trip Zone Interrupt +#define INT_EPWM5_TZ 0x002C0205U // 2.5 - ePWM5 Trip Zone Interrupt +#define INT_EPWM6_TZ 0x002D0206U // 2.6 - ePWM6 Trip Zone Interrupt +#define INT_EPWM7_TZ 0x002E0207U // 2.7 - ePWM7 Trip Zone Interrupt +#define INT_EPWM8_TZ 0x002F0208U // 2.8 - ePWM8 Trip Zone Interrupt + +// Lower PIE Group 3 +#define INT_EPWM1 0x00300301U // 3.1 - ePWM1 Interrupt +#define INT_EPWM2 0x00310302U // 3.2 - ePWM2 Interrupt +#define INT_EPWM3 0x00320303U // 3.3 - ePWM3 Interrupt +#define INT_EPWM4 0x00330304U // 3.4 - ePWM4 Interrupt +#define INT_EPWM5 0x00340305U // 3.5 - ePWM5 Interrupt +#define INT_EPWM6 0x00350306U // 3.6 - ePWM6 Interrupt +#define INT_EPWM7 0x00360307U // 3.7 - ePWM7 Interrupt +#define INT_EPWM8 0x00370308U // 3.8 - ePWM8 Interrupt + +// Lower PIE Group 4 +#define INT_ECAP1 0x00380401U // 4.1 - eCAP1 Interrupt +#define INT_ECAP2 0x00390402U // 4.2 - eCAP2 Interrupt +#define INT_ECAP3 0x003A0403U // 4.3 - eCAP3 Interrupt +#define INT_ECAP4 0x003B0404U // 4.4 - eCAP4 Interrupt +#define INT_ECAP5 0x003C0405U // 4.5 - eCAP5 Interrupt +#define INT_ECAP6 0x003D0406U // 4.6 - eCAP6 Interrupt +// Lower PIE Group 5 +#define INT_EQEP1 0x00400501U // 5.1 - eQEP1 Interrupt +#define INT_EQEP2 0x00410502U // 5.2 - eQEP2 Interrupt +#define INT_EQEP3 0x00420503U // 5.3 - eQEP3 Interrupt +#define INT_CLB1 0x00440505U // 5.5 - CLB1 (Reconfigurable Logic) Interrupt +#define INT_CLB2 0x00450506U // 5.6 - CLB2 (Reconfigurable Logic) Interrupt +#define INT_CLB3 0x00460507U // 5.7 - CLB3 (Reconfigurable Logic) Interrupt +#define INT_CLB4 0x00470508U // 5.8 - CLB4 (Reconfigurable Logic) Interrupt + +// Lower PIE Group 6 +#define INT_SPIA_RX 0x00480601U // 6.1 - SPIA Receive Interrupt +#define INT_SPIA_TX 0x00490602U // 6.2 - SPIA Transmit Interrupt +#define INT_SPIB_RX 0x004A0603U // 6.3 - SPIB Receive Interrupt +#define INT_SPIB_TX 0x004B0604U // 6.4 - SPIB Transmit Interrupt +#define INT_MCBSPA_RX 0x004C0605U // 6.5 - McBSPA Receive Interrupt +#define INT_MCBSPA_TX 0x004D0606U // 6.6 - McBSPA Transmit Interrupt +#define INT_MCBSPB_RX 0x004E0607U // 6.7 - McBSPB Receive Interrupt +#define INT_MCBSPB_TX 0x004F0608U // 6.8 - McBSPB Transmit Interrupt + +// Lower PIE Group 7 +#define INT_DMA_CH1 0x00500701U // 7.1 - DMA Channel 1 Interrupt +#define INT_DMA_CH2 0x00510702U // 7.2 - DMA Channel 2 Interrupt +#define INT_DMA_CH3 0x00520703U // 7.3 - DMA Channel 3 Interrupt +#define INT_DMA_CH4 0x00530704U // 7.4 - DMA Channel 4 Interrupt +#define INT_DMA_CH5 0x00540705U // 7.5 - DMA Channel 5 Interrupt +#define INT_DMA_CH6 0x00550706U // 7.6 - DMA Channel 6 Interrupt + +// Lower PIE Group 8 +#define INT_I2CA 0x00580801U // 8.1 - I2CA Interrupt 1 +#define INT_I2CA_FIFO 0x00590802U // 8.2 - I2CA Interrupt 2 +#define INT_I2CB 0x005A0803U // 8.3 - I2CB Interrupt 1 +#define INT_I2CB_FIFO 0x005B0804U // 8.4 - I2CB Interrupt 2 +#define INT_SCIC_RX 0x005C0805U // 8.5 - SCIC Receive Interrupt +#define INT_SCIC_TX 0x005D0806U // 8.6 - SCIC Transmit Interrupt +#define INT_SCID_RX 0x005E0807U // 8.7 - SCID Receive Interrupt +#define INT_SCID_TX 0x005F0808U // 8.8 - SCID Transmit Interrupt + +// Lower PIE Group 9 +#define INT_SCIA_RX 0x00600901U // 9.1 - SCIA Receive Interrupt +#define INT_SCIA_TX 0x00610902U // 9.2 - SCIA Transmit Interrupt +#define INT_SCIB_RX 0x00620903U // 9.3 - SCIB Receive Interrupt +#define INT_SCIB_TX 0x00630904U // 9.4 - SCIB Transmit Interrupt +#define INT_CANA0 0x00640905U // 9.5 - CANA Interrupt 0 +#define INT_CANA1 0x00650906U // 9.6 - CANA Interrupt 1 +#define INT_CANB0 0x00660907U // 9.7 - CANB Interrupt 0 +#define INT_CANB1 0x00670908U // 9.8 - CANB Interrupt 1 + +// Lower PIE Group 10 +#define INT_ADCA_EVT 0x00680A01U // 10.1 - ADCA Event Interrupt +#define INT_ADCA2 0x00690A02U // 10.2 - ADCA Interrupt 2 +#define INT_ADCA3 0x006A0A03U // 10.3 - ADCA Interrupt 3 +#define INT_ADCA4 0x006B0A04U // 10.4 - ADCA Interrupt 4 +#define INT_ADCB_EVT 0x006C0A05U // 10.5 - ADCB Event Interrupt +#define INT_ADCB2 0x006D0A06U // 10.6 - ADCB Interrupt 2 +#define INT_ADCB3 0x006E0A07U // 10.7 - ADCB Interrupt 3 +#define INT_ADCB4 0x006F0A08U // 10.8 - ADCB Interrupt 4 + +// Lower PIE Group 11 +#define INT_CLA1_1 0x00700B01U // 11.1 - CLA1 Interrupt 1 +#define INT_CLA1_2 0x00710B02U // 11.2 - CLA1 Interrupt 2 +#define INT_CLA1_3 0x00720B03U // 11.3 - CLA1 Interrupt 3 +#define INT_CLA1_4 0x00730B04U // 11.4 - CLA1 Interrupt 4 +#define INT_CLA1_5 0x00740B05U // 11.5 - CLA1 Interrupt 5 +#define INT_CLA1_6 0x00750B06U // 11.6 - CLA1 Interrupt 6 +#define INT_CLA1_7 0x00760B07U // 11.7 - CLA1 Interrupt 7 +#define INT_CLA1_8 0x00770B08U // 11.8 - CLA1 Interrupt 8 + +// Lower PIE Group 12 +#define INT_XINT3 0x00780C01U // 12.1 - XINT3 Interrupt +#define INT_XINT4 0x00790C02U // 12.2 - XINT4 Interrupt +#define INT_XINT5 0x007A0C03U // 12.3 - XINT5 Interrupt +#define INT_PBIST 0x007B0C04U // 12.4 - PBIST Interrupt +#define INT_FMC 0x007C0C05U // 12.5 - Flash Wrapper Operation Done Interrupt +#define INT_VCU 0x007D0C06U // 12.6 - VCU Interrupt +#define INT_FPU_OVERFLOW 0x007E0C07U // 12.7 - FPU Overflow Interrupt +#define INT_FPU_UNDERFLOW 0x007F0C08U // 12.8 - FPU Underflow Interrupt + +// Upper PIE Group 1 +#define INT_IPC_0 0x0084010DU // 1.13 - IPC Interrupt 1 +#define INT_IPC_1 0x0085010EU // 1.14 - IPC Interrupt 2 +#define INT_IPC_2 0x0086010FU // 1.15 - IPC Interrupt 3 +#define INT_IPC_3 0x00870110U // 1.16 - IPC Interrupt 4 + +// Upper PIE Group 2 +#define INT_EPWM9_TZ 0x00880209U // 2.9 - ePWM9 Trip Zone Interrupt +#define INT_EPWM10_TZ 0x0089020AU // 2.10 - ePWM10 Trip Zone Interrupt +#define INT_EPWM11_TZ 0x008A020BU // 2.11 - ePWM11 Trip Zone Interrupt +#define INT_EPWM12_TZ 0x008B020CU // 2.12 - ePWM12 Trip Zone Interrupt + +// Upper PIE Group 3 +#define INT_EPWM9 0x00900309U // 3.9 - ePWM9 Interrupt +#define INT_EPWM10 0x0091030AU // 3.10 - ePWM10 Interrupt +#define INT_EPWM11 0x0092030BU // 3.11 - ePWM11 Interrupt +#define INT_EPWM12 0x0093030CU // 3.12 - ePWM12 Interrupt + +// Upper PIE Group 5 +#define INT_SD1 0x00A00509U // 5.9 - SD1 Interrupt +#define INT_SD2 0x00A1050AU // 5.10 - SD2 Interrupt + +// Upper PIE Group 6 +#define INT_SPIC_RX 0x00A80609U // 6.9 - SPIC Receive Interrupt +#define INT_SPIC_TX 0x00A9060AU // 6.10 - SPIC Transmit Interrupt + +// Upper PIE Group 8 +#define INT_UPPA 0x00BE080FU // 8.15 - uPPA Interrupt + +// Upper PIE Group 9 +#define INT_USBA 0x00C6090FU // 9.15 - USBA Interrupt + +// Upper PIE Group 10 +#define INT_ADCC_EVT 0x00C80A09U // 10.9 - ADCC Event Interrupt +#define INT_ADCC2 0x00C90A0AU // 10.10 - ADCC Interrupt 2 +#define INT_ADCC3 0x00CA0A0BU // 10.11 - ADCC Interrupt 3 +#define INT_ADCC4 0x00CB0A0CU // 10.12 - ADCC Interrupt 4 +#define INT_ADCD_EVT 0x00CC0A0DU // 10.13 - ADCD Event Interrupt +#define INT_ADCD2 0x00CD0A0EU // 10.14 - ADCD Interrupt 2 +#define INT_ADCD3 0x00CE0A0FU // 10.15 - ADCD Interrupt 3 +#define INT_ADCD4 0x00CF0A10U // 10.16 - ADCD Interrupt 4 + +// Upper PIE Group 12 +#define INT_EMIF_ERROR 0x00D80C09U // 12.9 - EMIF Error Interrupt +#define INT_RAM_CORR_ERR 0x00D90C0AU // 12.10 - RAM Correctable Error Interrupt +#define INT_FLASH_CORR_ERR 0x00DA0C0BU // 12.11 - Flash Correctable Error Interrupt +#define INT_RAM_ACC_VIOL 0x00DB0C0CU // 12.12 - RAM Access Violation Interrupt +#define INT_SYS_PLL_SLIP 0x00DC0C0DU // 12.13 - System PLL Slip Interrupt +#define INT_AUX_PLL_SLIP 0x00DD0C0EU // 12.14 - Auxiliary PLL Slip Interrupt +#define INT_CLA_OVERFLOW 0x00DE0C0FU // 12.15 - CLA Overflow Interrupt +#define INT_CLA_UNDERFLOW 0x00DF0C10U // 12.16 - CLA Underflow Interrupt + +// Other interrupts +#define INT_TIMER1 0x000D0000U // CPU Timer 1 Interrupt +#define INT_TIMER2 0x000E0000U // CPU Timer 2 Interrupt +#define INT_DATALOG 0x000F0000U // Datalogging Interrupt +#define INT_RTOS 0x00100000U // RTOS Interrupt +#define INT_EMU 0x00110000U // Emulation Interrupt +#define INT_NMI 0x00120000U // Non-Maskable Interrupt +#define INT_ILLEGAL 0x00130000U // Illegal Operation Trap +#define INT_USER1 0x00140000U // User Defined Trap 1 +#define INT_USER2 0x00150000U // User Defined Trap 2 +#define INT_USER3 0x00160000U // User Defined Trap 3 +#define INT_USER4 0x00170000U // User Defined Trap 4 +#define INT_USER5 0x00180000U // User Defined Trap 5 +#define INT_USER6 0x00190000U // User Defined Trap 6 +#define INT_USER7 0x001A0000U // User Defined Trap 7 +#define INT_USER8 0x001B0000U // User Defined Trap 8 +#define INT_USER9 0x001C0000U // User Defined Trap 9 +#define INT_USER10 0x001D0000U // User Defined Trap 10 +#define INT_USER11 0x001E0000U // User Defined Trap 11 +#define INT_USER12 0x001F0000U // User Defined Trap 12 + +#endif // HW_INTS_H diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_ipc.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ipc.h new file mode 100644 index 0000000..e99715f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_ipc.h @@ -0,0 +1,323 @@ +//########################################################################### +// +// FILE: hw_ipc.h +// +// TITLE: Definitions for the IPC registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_IPC_H +#define HW_IPC_H + +//***************************************************************************** +// +// The following are defines for the IPC register offsets +// +//***************************************************************************** +#define IPC_O_ACK 0x0U // IPC incoming flag clear + // (acknowledge) register +#define IPC_O_STS 0x2U // IPC incoming flag status + // register +#define IPC_O_SET 0x4U // IPC remote flag set register +#define IPC_O_CLR 0x6U // IPC remote flag clear + // register +#define IPC_O_FLG 0x8U // IPC remote flag status + // register +#define IPC_O_COUNTERL 0xCU // IPC Counter Low Register +#define IPC_O_COUNTERH 0xEU // IPC Counter High Register +#ifndef CPU2 +#define IPC_O_SENDCOM 0x10U // Local to Remote IPC Command + // Register +#define IPC_O_SENDADDR 0x12U // Local to Remote IPC Address + // Register +#define IPC_O_SENDDATA 0x14U // Local to Remote IPC Data + // Register +#define IPC_O_REMOTEREPLY 0x16U // Remote to Local IPC Reply + // Data Register +#define IPC_O_RECVCOM 0x18U // Remote to Local IPC Command + // Register +#define IPC_O_RECVADDR 0x1AU // Remote to Local IPC Address + // Register +#define IPC_O_RECVDATA 0x1CU // Remote to Local IPC Data + // Register +#define IPC_O_LOCALREPLY 0x1EU // Local to Remote IPC Reply + // Data Register +#else +#define IPC_O_RECVCOM 0x10U // Remote to Local IPC Command + // Register +#define IPC_O_RECVADDR 0x12U // Remote to Local IPC Address + // Register +#define IPC_O_RECVDATA 0x14U // Remote to Local IPC Data + // Register +#define IPC_O_LOCALREPLY 0x16U // Local to Remote IPC Reply + // Data Register +#define IPC_O_SENDCOM 0x18U // Local to Remote IPC Command + // Register +#define IPC_O_SENDADDR 0x1AU // Local to Remote IPC Address + // Register +#define IPC_O_SENDDATA 0x1CU // Local to Remote IPC Data + // Register +#define IPC_O_REMOTEREPLY 0x1EU // Remote to Local IPC Reply + // Data Register +#endif +#define IPC_O_BOOTSTS 0x20U // CPU2 to CPU1 IPC Boot Status + // Register +#define IPC_O_BOOTMODE 0x22U // CPU1 to CPU2 IPC Boot Mode + // Register + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCACK register +// +//***************************************************************************** +#define IPC_ACK_IPC0 0x1U // Local IPC Flag 0 + // Acknowledgement +#define IPC_ACK_IPC1 0x2U // Local IPC Flag 1 + // Acknowledgement +#define IPC_ACK_IPC2 0x4U // Local IPC Flag 2 + // Acknowledgement +#define IPC_ACK_IPC3 0x8U // Local IPC Flag 3 + // Acknowledgement +#define IPC_ACK_IPC4 0x10U // Local IPC Flag 4 + // Acknowledgement +#define IPC_ACK_IPC5 0x20U // Local IPC Flag 5 + // Acknowledgement +#define IPC_ACK_IPC6 0x40U // Local IPC Flag 6 + // Acknowledgement +#define IPC_ACK_IPC7 0x80U // Local IPC Flag 7 + // Acknowledgement +#define IPC_ACK_IPC8 0x100U // Local IPC Flag 8 + // Acknowledgement +#define IPC_ACK_IPC9 0x200U // Local IPC Flag 9 + // Acknowledgement +#define IPC_ACK_IPC10 0x400U // Local IPC Flag 10 + // Acknowledgement +#define IPC_ACK_IPC11 0x800U // Local IPC Flag 11 + // Acknowledgement +#define IPC_ACK_IPC12 0x1000U // Local IPC Flag 12 + // Acknowledgement +#define IPC_ACK_IPC13 0x2000U // Local IPC Flag 13 + // Acknowledgement +#define IPC_ACK_IPC14 0x4000U // Local IPC Flag 14 + // Acknowledgement +#define IPC_ACK_IPC15 0x8000U // Local IPC Flag 15 + // Acknowledgement +#define IPC_ACK_IPC16 0x10000U // Local IPC Flag 16 + // Acknowledgement +#define IPC_ACK_IPC17 0x20000U // Local IPC Flag 17 + // Acknowledgement +#define IPC_ACK_IPC18 0x40000U // Local IPC Flag 18 + // Acknowledgement +#define IPC_ACK_IPC19 0x80000U // Local IPC Flag 19 + // Acknowledgement +#define IPC_ACK_IPC20 0x100000U // Local IPC Flag 20 + // Acknowledgement +#define IPC_ACK_IPC21 0x200000U // Local IPC Flag 21 + // Acknowledgement +#define IPC_ACK_IPC22 0x400000U // Local IPC Flag 22 + // Acknowledgement +#define IPC_ACK_IPC23 0x800000U // Local IPC Flag 23 + // Acknowledgement +#define IPC_ACK_IPC24 0x1000000U // Local IPC Flag 24 + // Acknowledgement +#define IPC_ACK_IPC25 0x2000000U // Local IPC Flag 25 + // Acknowledgement +#define IPC_ACK_IPC26 0x4000000U // Local IPC Flag 26 + // Acknowledgement +#define IPC_ACK_IPC27 0x8000000U // Local IPC Flag 27 + // Acknowledgement +#define IPC_ACK_IPC28 0x10000000U // Local IPC Flag 28 + // Acknowledgement +#define IPC_ACK_IPC29 0x20000000U // Local IPC Flag 29 + // Acknowledgement +#define IPC_ACK_IPC30 0x40000000U // Local IPC Flag 30 + // Acknowledgement +#define IPC_ACK_IPC31 0x80000000U // Local IPC Flag 31 + // Acknowledgement + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCSTS register +// +//***************************************************************************** +#define IPC_STS_IPC0 0x1U // Local IPC Flag 0 Status +#define IPC_STS_IPC1 0x2U // Local IPC Flag 1 Status +#define IPC_STS_IPC2 0x4U // Local IPC Flag 2 Status +#define IPC_STS_IPC3 0x8U // Local IPC Flag 3 Status +#define IPC_STS_IPC4 0x10U // Local IPC Flag 4 Status +#define IPC_STS_IPC5 0x20U // Local IPC Flag 5 Status +#define IPC_STS_IPC6 0x40U // Local IPC Flag 6 Status +#define IPC_STS_IPC7 0x80U // Local IPC Flag 7 Status +#define IPC_STS_IPC8 0x100U // Local IPC Flag 8 Status +#define IPC_STS_IPC9 0x200U // Local IPC Flag 9 Status +#define IPC_STS_IPC10 0x400U // Local IPC Flag 10 Status +#define IPC_STS_IPC11 0x800U // Local IPC Flag 11 Status +#define IPC_STS_IPC12 0x1000U // Local IPC Flag 12 Status +#define IPC_STS_IPC13 0x2000U // Local IPC Flag 13 Status +#define IPC_STS_IPC14 0x4000U // Local IPC Flag 14 Status +#define IPC_STS_IPC15 0x8000U // Local IPC Flag 15 Status +#define IPC_STS_IPC16 0x10000U // Local IPC Flag 16 Status +#define IPC_STS_IPC17 0x20000U // Local IPC Flag 17 Status +#define IPC_STS_IPC18 0x40000U // Local IPC Flag 18 Status +#define IPC_STS_IPC19 0x80000U // Local IPC Flag 19 Status +#define IPC_STS_IPC20 0x100000U // Local IPC Flag 20 Status +#define IPC_STS_IPC21 0x200000U // Local IPC Flag 21 Status +#define IPC_STS_IPC22 0x400000U // Local IPC Flag 22 Status +#define IPC_STS_IPC23 0x800000U // Local IPC Flag 23 Status +#define IPC_STS_IPC24 0x1000000U // Local IPC Flag 24 Status +#define IPC_STS_IPC25 0x2000000U // Local IPC Flag 25 Status +#define IPC_STS_IPC26 0x4000000U // Local IPC Flag 26 Status +#define IPC_STS_IPC27 0x8000000U // Local IPC Flag 27 Status +#define IPC_STS_IPC28 0x10000000U // Local IPC Flag 28 Status +#define IPC_STS_IPC29 0x20000000U // Local IPC Flag 29 Status +#define IPC_STS_IPC30 0x40000000U // Local IPC Flag 30 Status +#define IPC_STS_IPC31 0x80000000U // Local IPC Flag 31 Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCSET register +// +//***************************************************************************** +#define IPC_SET_IPC0 0x1U // Set Remote IPC0 Flag +#define IPC_SET_IPC1 0x2U // Set Remote IPC1 Flag +#define IPC_SET_IPC2 0x4U // Set Remote IPC2 Flag +#define IPC_SET_IPC3 0x8U // Set Remote IPC3 Flag +#define IPC_SET_IPC4 0x10U // Set Remote IPC4 Flag +#define IPC_SET_IPC5 0x20U // Set Remote IPC5 Flag +#define IPC_SET_IPC6 0x40U // Set Remote IPC6 Flag +#define IPC_SET_IPC7 0x80U // Set Remote IPC7 Flag +#define IPC_SET_IPC8 0x100U // Set Remote IPC8 Flag +#define IPC_SET_IPC9 0x200U // Set Remote IPC9 Flag +#define IPC_SET_IPC10 0x400U // Set Remote IPC10 Flag +#define IPC_SET_IPC11 0x800U // Set Remote IPC11 Flag +#define IPC_SET_IPC12 0x1000U // Set Remote IPC12 Flag +#define IPC_SET_IPC13 0x2000U // Set Remote IPC13 Flag +#define IPC_SET_IPC14 0x4000U // Set Remote IPC14 Flag +#define IPC_SET_IPC15 0x8000U // Set Remote IPC15 Flag +#define IPC_SET_IPC16 0x10000U // Set Remote IPC16 Flag +#define IPC_SET_IPC17 0x20000U // Set Remote IPC17 Flag +#define IPC_SET_IPC18 0x40000U // Set Remote IPC18 Flag +#define IPC_SET_IPC19 0x80000U // Set Remote IPC19 Flag +#define IPC_SET_IPC20 0x100000U // Set Remote IPC20 Flag +#define IPC_SET_IPC21 0x200000U // Set Remote IPC21 Flag +#define IPC_SET_IPC22 0x400000U // Set Remote IPC22 Flag +#define IPC_SET_IPC23 0x800000U // Set Remote IPC23 Flag +#define IPC_SET_IPC24 0x1000000U // Set Remote IPC24 Flag +#define IPC_SET_IPC25 0x2000000U // Set Remote IPC25 Flag +#define IPC_SET_IPC26 0x4000000U // Set Remote IPC26 Flag +#define IPC_SET_IPC27 0x8000000U // Set Remote IPC27 Flag +#define IPC_SET_IPC28 0x10000000U // Set Remote IPC28 Flag +#define IPC_SET_IPC29 0x20000000U // Set Remote IPC29 Flag +#define IPC_SET_IPC30 0x40000000U // Set Remote IPC30 Flag +#define IPC_SET_IPC31 0x80000000U // Set Remote IPC31 Flag + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCCLR register +// +//***************************************************************************** +#define IPC_CLR_IPC0 0x1U // Clear Remote IPC0 Flag +#define IPC_CLR_IPC1 0x2U // Clear Remote IPC1 Flag +#define IPC_CLR_IPC2 0x4U // Clear Remote IPC2 Flag +#define IPC_CLR_IPC3 0x8U // Clear Remote IPC3 Flag +#define IPC_CLR_IPC4 0x10U // Clear Remote IPC4 Flag +#define IPC_CLR_IPC5 0x20U // Clear Remote IPC5 Flag +#define IPC_CLR_IPC6 0x40U // Clear Remote IPC6 Flag +#define IPC_CLR_IPC7 0x80U // Clear Remote IPC7 Flag +#define IPC_CLR_IPC8 0x100U // Clear Remote IPC8 Flag +#define IPC_CLR_IPC9 0x200U // Clear Remote IPC9 Flag +#define IPC_CLR_IPC10 0x400U // Clear Remote IPC10 Flag +#define IPC_CLR_IPC11 0x800U // Clear Remote IPC11 Flag +#define IPC_CLR_IPC12 0x1000U // Clear Remote IPC12 Flag +#define IPC_CLR_IPC13 0x2000U // Clear Remote IPC13 Flag +#define IPC_CLR_IPC14 0x4000U // Clear Remote IPC14 Flag +#define IPC_CLR_IPC15 0x8000U // Clear Remote IPC15 Flag +#define IPC_CLR_IPC16 0x10000U // Clear Remote IPC16 Flag +#define IPC_CLR_IPC17 0x20000U // Clear Remote IPC17 Flag +#define IPC_CLR_IPC18 0x40000U // Clear Remote IPC18 Flag +#define IPC_CLR_IPC19 0x80000U // Clear Remote IPC19 Flag +#define IPC_CLR_IPC20 0x100000U // Clear Remote IPC20 Flag +#define IPC_CLR_IPC21 0x200000U // Clear Remote IPC21 Flag +#define IPC_CLR_IPC22 0x400000U // Clear Remote IPC22 Flag +#define IPC_CLR_IPC23 0x800000U // Clear Remote IPC23 Flag +#define IPC_CLR_IPC24 0x1000000U // Clear Remote IPC24 Flag +#define IPC_CLR_IPC25 0x2000000U // Clear Remote IPC25 Flag +#define IPC_CLR_IPC26 0x4000000U // Clear Remote IPC26 Flag +#define IPC_CLR_IPC27 0x8000000U // Clear Remote IPC27 Flag +#define IPC_CLR_IPC28 0x10000000U // Clear Remote IPC28 Flag +#define IPC_CLR_IPC29 0x20000000U // Clear Remote IPC29 Flag +#define IPC_CLR_IPC30 0x40000000U // Clear Remote IPC30 Flag +#define IPC_CLR_IPC31 0x80000000U // Clear Remote IPC31 Flag + +//***************************************************************************** +// +// The following are defines for the bit fields in the IPCFLG register +// +//***************************************************************************** +#define IPC_FLG_IPC0 0x1U // Remote IPC0 Flag Status +#define IPC_FLG_IPC1 0x2U // Remote IPC1 Flag Status +#define IPC_FLG_IPC2 0x4U // Remote IPC2 Flag Status +#define IPC_FLG_IPC3 0x8U // Remote IPC3 Flag Status +#define IPC_FLG_IPC4 0x10U // Remote IPC4 Flag Status +#define IPC_FLG_IPC5 0x20U // Remote IPC5 Flag Status +#define IPC_FLG_IPC6 0x40U // Remote IPC6 Flag Status +#define IPC_FLG_IPC7 0x80U // Remote IPC7 Flag Status +#define IPC_FLG_IPC8 0x100U // Remote IPC8 Flag Status +#define IPC_FLG_IPC9 0x200U // Remote IPC9 Flag Status +#define IPC_FLG_IPC10 0x400U // Remote IPC10 Flag Status +#define IPC_FLG_IPC11 0x800U // Remote IPC11 Flag Status +#define IPC_FLG_IPC12 0x1000U // Remote IPC12 Flag Status +#define IPC_FLG_IPC13 0x2000U // Remote IPC13 Flag Status +#define IPC_FLG_IPC14 0x4000U // Remote IPC14 Flag Status +#define IPC_FLG_IPC15 0x8000U // Remote IPC15 Flag Status +#define IPC_FLG_IPC16 0x10000U // Remote IPC16 Flag Status +#define IPC_FLG_IPC17 0x20000U // Remote IPC17 Flag Status +#define IPC_FLG_IPC18 0x40000U // Remote IPC18 Flag Status +#define IPC_FLG_IPC19 0x80000U // Remote IPC19 Flag Status +#define IPC_FLG_IPC20 0x100000U // Remote IPC20 Flag Status +#define IPC_FLG_IPC21 0x200000U // Remote IPC21 Flag Status +#define IPC_FLG_IPC22 0x400000U // Remote IPC22 Flag Status +#define IPC_FLG_IPC23 0x800000U // Remote IPC23 Flag Status +#define IPC_FLG_IPC24 0x1000000U // Remote IPC24 Flag Status +#define IPC_FLG_IPC25 0x2000000U // Remote IPC25 Flag Status +#define IPC_FLG_IPC26 0x4000000U // Remote IPC26 Flag Status +#define IPC_FLG_IPC27 0x8000000U // Remote IPC27 Flag Status +#define IPC_FLG_IPC28 0x10000000U // Remote IPC28 Flag Status +#define IPC_FLG_IPC29 0x20000000U // Remote IPC29 Flag Status +#define IPC_FLG_IPC30 0x40000000U // Remote IPC30 Flag Status +#define IPC_FLG_IPC31 0x80000000U // Remote IPC31 Flag Status +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_mcbsp.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_mcbsp.h new file mode 100644 index 0000000..814055f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_mcbsp.h @@ -0,0 +1,286 @@ +//########################################################################### +// +// FILE: hw_mcbsp.h +// +// TITLE: Definitions for the MCBSP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MCBSP_H +#define HW_MCBSP_H + +//************************************************************************************************* +// +// The following are defines for the MCBSP register offsets +// +//************************************************************************************************* +#define MCBSP_O_DRR2 0x0U // Data receive register bits 31-16 +#define MCBSP_O_DRR1 0x1U // Data receive register bits 15-0 +#define MCBSP_O_DXR2 0x2U // Data transmit register bits 31-16 +#define MCBSP_O_DXR1 0x3U // Data transmit register bits 15-0 +#define MCBSP_O_SPCR2 0x4U // Serial port control register 2 +#define MCBSP_O_SPCR1 0x5U // Serial port control register 1 +#define MCBSP_O_RCR2 0x6U // Receive Control register 2 +#define MCBSP_O_RCR1 0x7U // Receive Control register 1 +#define MCBSP_O_XCR2 0x8U // Transmit Control register 2 +#define MCBSP_O_XCR1 0x9U // Transmit Control register 1 +#define MCBSP_O_SRGR2 0xAU // Sample rate generator register 2 +#define MCBSP_O_SRGR1 0xBU // Sample rate generator register 1 +#define MCBSP_O_MCR2 0xCU // Multi-channel control register 2 +#define MCBSP_O_MCR1 0xDU // Multi-channel control register 1 +#define MCBSP_O_RCERA 0xEU // Receive channel enable partition A +#define MCBSP_O_RCERB 0xFU // Receive channel enable partition B +#define MCBSP_O_XCERA 0x10U // Transmit channel enable partition A +#define MCBSP_O_XCERB 0x11U // Transmit channel enable partition B +#define MCBSP_O_PCR 0x12U // Pin Control register +#define MCBSP_O_RCERC 0x13U // Receive channel enable partition C +#define MCBSP_O_RCERD 0x14U // Receive channel enable partition D +#define MCBSP_O_XCERC 0x15U // Transmit channel enable partition C +#define MCBSP_O_XCERD 0x16U // Transmit channel enable partition D +#define MCBSP_O_RCERE 0x17U // Receive channel enable partition E +#define MCBSP_O_RCERF 0x18U // Receive channel enable partition F +#define MCBSP_O_XCERE 0x19U // Transmit channel enable partition E +#define MCBSP_O_XCERF 0x1AU // Transmit channel enable partition F +#define MCBSP_O_RCERG 0x1BU // Receive channel enable partition G +#define MCBSP_O_RCERH 0x1CU // Receive channel enable partition H +#define MCBSP_O_XCERG 0x1DU // Transmit channel enable partition G +#define MCBSP_O_XCERH 0x1EU // Transmit channel enable partition H +#define MCBSP_O_MFFINT 0x23U // Interrupt enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DRR2 register +// +//************************************************************************************************* +#define MCBSP_DRR2_HWLB_S 0U +#define MCBSP_DRR2_HWLB_M 0xFFU // High word low byte +#define MCBSP_DRR2_HWHB_S 8U +#define MCBSP_DRR2_HWHB_M 0xFF00U // High word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DRR1 register +// +//************************************************************************************************* +#define MCBSP_DRR1_LWLB_S 0U +#define MCBSP_DRR1_LWLB_M 0xFFU // Low word low byte +#define MCBSP_DRR1_LWHB_S 8U +#define MCBSP_DRR1_LWHB_M 0xFF00U // Low word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DXR2 register +// +//************************************************************************************************* +#define MCBSP_DXR2_HWLB_S 0U +#define MCBSP_DXR2_HWLB_M 0xFFU // High word low byte +#define MCBSP_DXR2_HWHB_S 8U +#define MCBSP_DXR2_HWHB_M 0xFF00U // High word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DXR1 register +// +//************************************************************************************************* +#define MCBSP_DXR1_LWLB_S 0U +#define MCBSP_DXR1_LWLB_M 0xFFU // Low word low byte +#define MCBSP_DXR1_LWHB_S 8U +#define MCBSP_DXR1_LWHB_M 0xFF00U // Low word high byte + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPCR2 register +// +//************************************************************************************************* +#define MCBSP_SPCR2_XRST 0x1U // Transmitter reset +#define MCBSP_SPCR2_XRDY 0x2U // Transmitter ready +#define MCBSP_SPCR2_XEMPTY 0x4U // Transmitter empty +#define MCBSP_SPCR2_XSYNCERR 0x8U // Transmit sync error INT flag +#define MCBSP_SPCR2_XINTM_S 4U +#define MCBSP_SPCR2_XINTM_M 0x30U // Transmit Interupt mode bits +#define MCBSP_SPCR2_GRST 0x40U // Sample rate generator reset +#define MCBSP_SPCR2_FRST 0x80U // Frame sync logic reset +#define MCBSP_SPCR2_SOFT 0x100U // SOFT bit +#define MCBSP_SPCR2_FREE 0x200U // FREE bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPCR1 register +// +//************************************************************************************************* +#define MCBSP_SPCR1_RRST 0x1U // Receiver reset +#define MCBSP_SPCR1_RRDY 0x2U // Receiver ready +#define MCBSP_SPCR1_RFULL 0x4U // Receiver full +#define MCBSP_SPCR1_RSYNCERR 0x8U // Receive sync error INT flag +#define MCBSP_SPCR1_RINTM_S 4U +#define MCBSP_SPCR1_RINTM_M 0x30U // Receive Interupt mode bits +#define MCBSP_SPCR1_DXENA 0x80U // DX delay enable +#define MCBSP_SPCR1_CLKSTP_S 11U +#define MCBSP_SPCR1_CLKSTP_M 0x1800U // Clock stop mode +#define MCBSP_SPCR1_RJUST_S 13U +#define MCBSP_SPCR1_RJUST_M 0x6000U // Rx sign extension and justification mode +#define MCBSP_SPCR1_DLB 0x8000U // Digital loopback + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCR2 register +// +//************************************************************************************************* +#define MCBSP_RCR2_RDATDLY_S 0U +#define MCBSP_RCR2_RDATDLY_M 0x3U // Receive data delay +#define MCBSP_RCR2_RFIG 0x4U // Receive frame sync ignore +#define MCBSP_RCR2_RCOMPAND_S 3U +#define MCBSP_RCR2_RCOMPAND_M 0x18U // Receive Companding Mode selects +#define MCBSP_RCR2_RWDLEN2_S 5U +#define MCBSP_RCR2_RWDLEN2_M 0xE0U // Receive word length 2 +#define MCBSP_RCR2_RFRLEN2_S 8U +#define MCBSP_RCR2_RFRLEN2_M 0x7F00U // Receive Frame length 2 +#define MCBSP_RCR2_RPHASE 0x8000U // Receive Phase + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RCR1 register +// +//************************************************************************************************* +#define MCBSP_RCR1_RWDLEN1_S 5U +#define MCBSP_RCR1_RWDLEN1_M 0xE0U // Receive word length 1 +#define MCBSP_RCR1_RFRLEN1_S 8U +#define MCBSP_RCR1_RFRLEN1_M 0x7F00U // Receive Frame length 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCR2 register +// +//************************************************************************************************* +#define MCBSP_XCR2_XDATDLY_S 0U +#define MCBSP_XCR2_XDATDLY_M 0x3U // Transmit data delay +#define MCBSP_XCR2_XFIG 0x4U // Transmit frame sync ignore +#define MCBSP_XCR2_XCOMPAND_S 3U +#define MCBSP_XCR2_XCOMPAND_M 0x18U // Transmit Companding Mode selects +#define MCBSP_XCR2_XWDLEN2_S 5U +#define MCBSP_XCR2_XWDLEN2_M 0xE0U // Transmit word length 2 +#define MCBSP_XCR2_XFRLEN2_S 8U +#define MCBSP_XCR2_XFRLEN2_M 0x7F00U // Transmit Frame length 2 +#define MCBSP_XCR2_XPHASE 0x8000U // Transmit Phase + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCR1 register +// +//************************************************************************************************* +#define MCBSP_XCR1_XWDLEN1_S 5U +#define MCBSP_XCR1_XWDLEN1_M 0xE0U // Transmit word length 1 +#define MCBSP_XCR1_XFRLEN1_S 8U +#define MCBSP_XCR1_XFRLEN1_M 0x7F00U // Transmit Frame length 1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SRGR2 register +// +//************************************************************************************************* +#define MCBSP_SRGR2_FPER_S 0U +#define MCBSP_SRGR2_FPER_M 0xFFFU // Frame-sync period +#define MCBSP_SRGR2_FSGM 0x1000U // Frame sync generator mode +#define MCBSP_SRGR2_CLKSM 0x2000U // Sample rate generator mode +#define MCBSP_SRGR2_GSYNC 0x8000U // CLKG sync + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SRGR1 register +// +//************************************************************************************************* +#define MCBSP_SRGR1_CLKGDV_S 0U +#define MCBSP_SRGR1_CLKGDV_M 0xFFU // CLKG divider +#define MCBSP_SRGR1_FWID_S 8U +#define MCBSP_SRGR1_FWID_M 0xFF00U // Frame width + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCR2 register +// +//************************************************************************************************* +#define MCBSP_MCR2_XMCM_S 0U +#define MCBSP_MCR2_XMCM_M 0x3U // Transmit data delay +#define MCBSP_MCR2_XCBLK_S 2U +#define MCBSP_MCR2_XCBLK_M 0x1CU // Transmit frame sync ignore +#define MCBSP_MCR2_XPABLK_S 5U +#define MCBSP_MCR2_XPABLK_M 0x60U // Transmit Companding Mode selects +#define MCBSP_MCR2_XPBBLK_S 7U +#define MCBSP_MCR2_XPBBLK_M 0x180U // Transmit word length 2 +#define MCBSP_MCR2_XMCME 0x200U // Transmit Frame length 2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCR1 register +// +//************************************************************************************************* +#define MCBSP_MCR1_RMCM 0x1U // Receive multichannel mode +#define MCBSP_MCR1_RCBLK_S 2U +#define MCBSP_MCR1_RCBLK_M 0x1CU // eceive current block +#define MCBSP_MCR1_RPABLK_S 5U +#define MCBSP_MCR1_RPABLK_M 0x60U // Receive partition A Block +#define MCBSP_MCR1_RPBBLK_S 7U +#define MCBSP_MCR1_RPBBLK_M 0x180U // Receive partition B Block +#define MCBSP_MCR1_RMCME 0x200U // Receive multi-channel enhance mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCR register +// +//************************************************************************************************* +#define MCBSP_PCR_CLKRP 0x1U // Receive Clock polarity +#define MCBSP_PCR_CLKXP 0x2U // Transmit clock polarity +#define MCBSP_PCR_FSRP 0x4U // Receive Frame synchronization polarity +#define MCBSP_PCR_FSXP 0x8U // Transmit Frame synchronization polarity +#define MCBSP_PCR_SCLKME 0x80U // Sample clock mode selection +#define MCBSP_PCR_CLKRM 0x100U // Receiver Clock Mode +#define MCBSP_PCR_CLKXM 0x200U // Transmit Clock Mode. +#define MCBSP_PCR_FSRM 0x400U // Receive Frame Synchronization Mode +#define MCBSP_PCR_FSXM 0x800U // Transmit Frame Synchronization Mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MFFINT register +// +//************************************************************************************************* +#define MCBSP_MFFINT_XINT 0x1U // Enable for Receive Interrupt +#define MCBSP_MFFINT_RINT 0x4U // Enable for transmit Interrupt + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_memcfg.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_memcfg.h new file mode 100644 index 0000000..d5d7e8c --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_memcfg.h @@ -0,0 +1,870 @@ +//########################################################################### +// +// FILE: hw_memcfg.h +// +// TITLE: Definitions for the MEMCFG registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MEMCFG_H +#define HW_MEMCFG_H + +//************************************************************************************************* +// +// The following are defines for the MEMCFG register offsets +// +//************************************************************************************************* +#define MEMCFG_O_DXLOCK 0x0U // Dedicated RAM Config Lock Register +#define MEMCFG_O_DXCOMMIT 0x2U // Dedicated RAM Config Lock Commit Register +#define MEMCFG_O_DXACCPROT0 0x8U // Dedicated RAM Config Register +#define MEMCFG_O_DXTEST 0x10U // Dedicated RAM TEST Register +#define MEMCFG_O_DXINIT 0x12U // Dedicated RAM Init Register +#define MEMCFG_O_DXINITDONE 0x14U // Dedicated RAM InitDone Status Register +#define MEMCFG_O_LSXLOCK 0x20U // Local Shared RAM Config Lock Register +#define MEMCFG_O_LSXCOMMIT 0x22U // Local Shared RAM Config Lock Commit Register +#define MEMCFG_O_LSXMSEL 0x24U // Local Shared RAM Master Sel Register +#define MEMCFG_O_LSXCLAPGM 0x26U // Local Shared RAM Prog/Exe control Register +#define MEMCFG_O_LSXACCPROT0 0x28U // Local Shared RAM Config Register 0 +#define MEMCFG_O_LSXACCPROT1 0x2AU // Local Shared RAM Config Register 1 +#define MEMCFG_O_LSXTEST 0x30U // Local Shared RAM TEST Register +#define MEMCFG_O_LSXINIT 0x32U // Local Shared RAM Init Register +#define MEMCFG_O_LSXINITDONE 0x34U // Local Shared RAM InitDone Status Register +#define MEMCFG_O_GSXLOCK 0x40U // Global Shared RAM Config Lock Register +#define MEMCFG_O_GSXCOMMIT 0x42U // Global Shared RAM Config Lock Commit Register +#define MEMCFG_O_GSXMSEL 0x44U // Global Shared RAM Master Sel Register +#define MEMCFG_O_GSXACCPROT0 0x48U // Global Shared RAM Config Register 0 +#define MEMCFG_O_GSXACCPROT1 0x4AU // Global Shared RAM Config Register 1 +#define MEMCFG_O_GSXACCPROT2 0x4CU // Global Shared RAM Config Register 2 +#define MEMCFG_O_GSXACCPROT3 0x4EU // Global Shared RAM Config Register 3 +#define MEMCFG_O_GSXTEST 0x50U // Global Shared RAM TEST Register +#define MEMCFG_O_GSXINIT 0x52U // Global Shared RAM Init Register +#define MEMCFG_O_GSXINITDONE 0x54U // Global Shared RAM InitDone Status Register +#define MEMCFG_O_MSGXTEST 0x70U // Message RAM TEST Register +#define MEMCFG_O_MSGXINIT 0x72U // Message RAM Init Register +#define MEMCFG_O_MSGXINITDONE 0x74U // Message RAM InitDone Status Register + +#define MEMCFG_O_EMIF1LOCK 0x0U // EMIF1 Config Lock Register +#define MEMCFG_O_EMIF1COMMIT 0x2U // EMIF1 Config Lock Commit Register +#define MEMCFG_O_EMIF1MSEL 0x4U // EMIF1 Master Sel Register +#define MEMCFG_O_EMIF1ACCPROT0 0x8U // EMIF1 Config Register 0 + +#define MEMCFG_O_EMIF2LOCK 0x0U // EMIF2 Config Lock Register +#define MEMCFG_O_EMIF2COMMIT 0x2U // EMIF2 Config Lock Commit Register +#define MEMCFG_O_EMIF2ACCPROT0 0x8U // EMIF2 Config Register 0 + +#define MEMCFG_O_NMAVFLG 0x0U // Non-Master Access Violation Flag Register +#define MEMCFG_O_NMAVSET 0x2U // Non-Master Access Violation Flag Set Register +#define MEMCFG_O_NMAVCLR 0x4U // Non-Master Access Violation Flag Clear Register +#define MEMCFG_O_NMAVINTEN 0x6U // Non-Master Access Violation Interrupt Enable Register +#define MEMCFG_O_NMCPURDAVADDR 0x8U // Non-Master CPU Read Access Violation Address +#define MEMCFG_O_NMCPUWRAVADDR 0xAU // Non-Master CPU Write Access Violation Address +#define MEMCFG_O_NMCPUFAVADDR 0xCU // Non-Master CPU Fetch Access Violation Address +#define MEMCFG_O_NMDMAWRAVADDR 0xEU // Non-Master DMA Write Access Violation Address +#define MEMCFG_O_NMCLA1RDAVADDR 0x10U // Non-Master CLA1 Read Access Violation Address +#define MEMCFG_O_NMCLA1WRAVADDR 0x12U // Non-Master CLA1 Write Access Violation Address +#define MEMCFG_O_NMCLA1FAVADDR 0x14U // Non-Master CLA1 Fetch Access Violation Address +#define MEMCFG_O_MAVFLG 0x20U // Master Access Violation Flag Register +#define MEMCFG_O_MAVSET 0x22U // Master Access Violation Flag Set Register +#define MEMCFG_O_MAVCLR 0x24U // Master Access Violation Flag Clear Register +#define MEMCFG_O_MAVINTEN 0x26U // Master Access Violation Interrupt Enable Register +#define MEMCFG_O_MCPUFAVADDR 0x28U // Master CPU Fetch Access Violation Address +#define MEMCFG_O_MCPUWRAVADDR 0x2AU // Master CPU Write Access Violation Address +#define MEMCFG_O_MDMAWRAVADDR 0x2CU // Master DMA Write Access Violation Address + +#define MEMCFG_O_UCERRFLG 0x0U // Uncorrectable Error Flag Register +#define MEMCFG_O_UCERRSET 0x2U // Uncorrectable Error Flag Set Register +#define MEMCFG_O_UCERRCLR 0x4U // Uncorrectable Error Flag Clear Register +#define MEMCFG_O_UCCPUREADDR 0x6U // Uncorrectable CPU Read Error Address +#define MEMCFG_O_UCDMAREADDR 0x8U // Uncorrectable DMA Read Error Address +#define MEMCFG_O_UCCLA1READDR 0xAU // Uncorrectable CLA1 Read Error Address +#define MEMCFG_O_CERRFLG 0x20U // Correctable Error Flag Register +#define MEMCFG_O_CERRSET 0x22U // Correctable Error Flag Set Register +#define MEMCFG_O_CERRCLR 0x24U // Correctable Error Flag Clear Register +#define MEMCFG_O_CCPUREADDR 0x26U // Correctable CPU Read Error Address +#define MEMCFG_O_CERRCNT 0x2EU // Correctable Error Count Register +#define MEMCFG_O_CERRTHRES 0x30U // Correctable Error Threshold Value Register +#define MEMCFG_O_CEINTFLG 0x32U // Correctable Error Interrupt Flag Status Register +#define MEMCFG_O_CEINTCLR 0x34U // Correctable Error Interrupt Flag Clear Register +#define MEMCFG_O_CEINTSET 0x36U // Correctable Error Interrupt Flag Set Register +#define MEMCFG_O_CEINTEN 0x38U // Correctable Error Interrupt Enable Register + +#define MEMCFG_O_ROMWAITSTATE 0x0U // ROM Wait State Configuration Register + +#define MEMCFG_O_ROMPREFETCH 0x0U // ROM Prefetch Configuration Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxLOCK register +// +//************************************************************************************************* +#define MEMCFG_DXLOCK_LOCK_D0 0x4U // D0 RAM access protection and master select fields lock + // bit +#define MEMCFG_DXLOCK_LOCK_D1 0x8U // D1 RAM access protection and master select fields lock + // bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_DXCOMMIT_COMMIT_D0 0x4U // D0 RAM access protection and master select permanent + // lock +#define MEMCFG_DXCOMMIT_COMMIT_D1 0x8U // D1 RAM access protection and master select permanent + // lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_DXACCPROT0_FETCHPROT_D0 0x10000U // Fetch Protection For D0 RAM +#define MEMCFG_DXACCPROT0_CPUWRPROT_D0 0x20000U // CPU WR Protection For D0 RAM +#define MEMCFG_DXACCPROT0_FETCHPROT_D1 0x1000000U // Fetch Protection For D1 RAM +#define MEMCFG_DXACCPROT0_CPUWRPROT_D1 0x2000000U // CPU WR Protection For D1 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxTEST register +// +//************************************************************************************************* +#define MEMCFG_DXTEST_TEST_M0_S 0U +#define MEMCFG_DXTEST_TEST_M0_M 0x3U // Selects the different modes for M0 RAM +#define MEMCFG_DXTEST_TEST_M1_S 2U +#define MEMCFG_DXTEST_TEST_M1_M 0xCU // Selects the different modes for M1 RAM +#define MEMCFG_DXTEST_TEST_D0_S 4U +#define MEMCFG_DXTEST_TEST_D0_M 0x30U // Selects the different modes for D0 RAM +#define MEMCFG_DXTEST_TEST_D1_S 6U +#define MEMCFG_DXTEST_TEST_D1_M 0xC0U // Selects the different modes for D1 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxINIT register +// +//************************************************************************************************* +#define MEMCFG_DXINIT_INIT_M0 0x1U // RAM Initialization control for M0 RAM. +#define MEMCFG_DXINIT_INIT_M1 0x2U // RAM Initialization control for M1 RAM. +#define MEMCFG_DXINIT_INIT_D0 0x4U // RAM Initialization control for D0 RAM. +#define MEMCFG_DXINIT_INIT_D1 0x8U // RAM Initialization control for D1 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_DXINITDONE_INITDONE_M0 0x1U // RAM Initialization status for M0 RAM. +#define MEMCFG_DXINITDONE_INITDONE_M1 0x2U // RAM Initialization status for M1 RAM. +#define MEMCFG_DXINITDONE_INITDONE_D0 0x4U // RAM Initialization status for D0 RAM. +#define MEMCFG_DXINITDONE_INITDONE_D1 0x8U // RAM Initialization status for D1 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxLOCK register +// +//************************************************************************************************* +#define MEMCFG_LSXLOCK_LOCK_LS0 0x1U // LS0 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS1 0x2U // LS1 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS2 0x4U // LS2 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS3 0x8U // LS3 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS4 0x10U // LS4 RAM access protection and master select fields + // lock bit +#define MEMCFG_LSXLOCK_LOCK_LS5 0x20U // LS5 RAM access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_LSXCOMMIT_COMMIT_LS0 0x1U // LS0 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS1 0x2U // LS1 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS2 0x4U // LS2 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS3 0x8U // LS3 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS4 0x10U // LS4 RAM access protection and master select + // permanent lock +#define MEMCFG_LSXCOMMIT_COMMIT_LS5 0x20U // LS5 RAM access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxMSEL register +// +//************************************************************************************************* +#define MEMCFG_LSXMSEL_MSEL_LS0_S 0U +#define MEMCFG_LSXMSEL_MSEL_LS0_M 0x3U // Master Select for LS0 RAM +#define MEMCFG_LSXMSEL_MSEL_LS1_S 2U +#define MEMCFG_LSXMSEL_MSEL_LS1_M 0xCU // Master Select for LS1 RAM +#define MEMCFG_LSXMSEL_MSEL_LS2_S 4U +#define MEMCFG_LSXMSEL_MSEL_LS2_M 0x30U // Master Select for LS2 RAM +#define MEMCFG_LSXMSEL_MSEL_LS3_S 6U +#define MEMCFG_LSXMSEL_MSEL_LS3_M 0xC0U // Master Select for LS3 RAM +#define MEMCFG_LSXMSEL_MSEL_LS4_S 8U +#define MEMCFG_LSXMSEL_MSEL_LS4_M 0x300U // Master Select for LS4 RAM +#define MEMCFG_LSXMSEL_MSEL_LS5_S 10U +#define MEMCFG_LSXMSEL_MSEL_LS5_M 0xC00U // Master Select for LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxCLAPGM register +// +//************************************************************************************************* +#define MEMCFG_LSXCLAPGM_CLAPGM_LS0 0x1U // Selects LS0 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS1 0x2U // Selects LS1 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS2 0x4U // Selects LS2 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS3 0x8U // Selects LS3 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS4 0x10U // Selects LS4 RAM as program vs data memory for CLA +#define MEMCFG_LSXCLAPGM_CLAPGM_LS5 0x20U // Selects LS5 RAM as program vs data memory for CLA + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS0 0x1U // Fetch Protection For LS0 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS0 0x2U // CPU WR Protection For LS0 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS1 0x100U // Fetch Protection For LS1 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS1 0x200U // CPU WR Protection For LS1 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS2 0x10000U // Fetch Protection For LS2 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS2 0x20000U // CPU WR Protection For LS2 RAM +#define MEMCFG_LSXACCPROT0_FETCHPROT_LS3 0x1000000U // Fetch Protection For LS3 RAM +#define MEMCFG_LSXACCPROT0_CPUWRPROT_LS3 0x2000000U // CPU WR Protection For LS3 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxACCPROT1 register +// +//************************************************************************************************* +#define MEMCFG_LSXACCPROT1_FETCHPROT_LS4 0x1U // Fetch Protection For LS4 RAM +#define MEMCFG_LSXACCPROT1_CPUWRPROT_LS4 0x2U // CPU WR Protection For LS4 RAM +#define MEMCFG_LSXACCPROT1_FETCHPROT_LS5 0x100U // Fetch Protection For LS5 RAM +#define MEMCFG_LSXACCPROT1_CPUWRPROT_LS5 0x200U // CPU WR Protection For LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxTEST register +// +//************************************************************************************************* +#define MEMCFG_LSXTEST_TEST_LS0_S 0U +#define MEMCFG_LSXTEST_TEST_LS0_M 0x3U // Selects the different modes for LS0 RAM +#define MEMCFG_LSXTEST_TEST_LS1_S 2U +#define MEMCFG_LSXTEST_TEST_LS1_M 0xCU // Selects the different modes for LS1 RAM +#define MEMCFG_LSXTEST_TEST_LS2_S 4U +#define MEMCFG_LSXTEST_TEST_LS2_M 0x30U // Selects the different modes for LS2 RAM +#define MEMCFG_LSXTEST_TEST_LS3_S 6U +#define MEMCFG_LSXTEST_TEST_LS3_M 0xC0U // Selects the different modes for LS3 RAM +#define MEMCFG_LSXTEST_TEST_LS4_S 8U +#define MEMCFG_LSXTEST_TEST_LS4_M 0x300U // Selects the different modes for LS4 RAM +#define MEMCFG_LSXTEST_TEST_LS5_S 10U +#define MEMCFG_LSXTEST_TEST_LS5_M 0xC00U // Selects the different modes for LS5 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxINIT register +// +//************************************************************************************************* +#define MEMCFG_LSXINIT_INIT_LS0 0x1U // RAM Initialization control for LS0 RAM. +#define MEMCFG_LSXINIT_INIT_LS1 0x2U // RAM Initialization control for LS1 RAM. +#define MEMCFG_LSXINIT_INIT_LS2 0x4U // RAM Initialization control for LS2 RAM. +#define MEMCFG_LSXINIT_INIT_LS3 0x8U // RAM Initialization control for LS3 RAM. +#define MEMCFG_LSXINIT_INIT_LS4 0x10U // RAM Initialization control for LS4 RAM. +#define MEMCFG_LSXINIT_INIT_LS5 0x20U // RAM Initialization control for LS5 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LSxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_LSXINITDONE_INITDONE_LS0 0x1U // RAM Initialization status for LS0 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS1 0x2U // RAM Initialization status for LS1 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS2 0x4U // RAM Initialization status for LS2 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS3 0x8U // RAM Initialization status for LS3 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS4 0x10U // RAM Initialization status for LS4 RAM. +#define MEMCFG_LSXINITDONE_INITDONE_LS5 0x20U // RAM Initialization status for LS5 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxLOCK register +// +//************************************************************************************************* +#define MEMCFG_GSXLOCK_LOCK_GS0 0x1U // GS0 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS1 0x2U // GS1 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS2 0x4U // GS2 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS3 0x8U // GS3 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS4 0x10U // GS4 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS5 0x20U // GS5 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS6 0x40U // GS6 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS7 0x80U // GS7 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS8 0x100U // GS8 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS9 0x200U // GS9 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS10 0x400U // GS10 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS11 0x800U // GS11 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS12 0x1000U // GS12 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS13 0x2000U // GS13 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS14 0x4000U // GS14 RAM access protection and master select fields + // lock bit +#define MEMCFG_GSXLOCK_LOCK_GS15 0x8000U // GS15 RAM access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxCOMMIT register +// +//************************************************************************************************* +#define MEMCFG_GSXCOMMIT_COMMIT_GS0 0x1U // GS0 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS1 0x2U // GS1 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS2 0x4U // GS2 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS3 0x8U // GS3 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS4 0x10U // GS4 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS5 0x20U // GS5 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS6 0x40U // GS6 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS7 0x80U // GS7 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS8 0x100U // GS8 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS9 0x200U // GS9 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS10 0x400U // GS10 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS11 0x800U // GS11 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS12 0x1000U // GS12 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS13 0x2000U // GS13 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS14 0x4000U // GS14 RAM access protection and master select + // permanent lock +#define MEMCFG_GSXCOMMIT_COMMIT_GS15 0x8000U // GS15 RAM access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxMSEL register +// +//************************************************************************************************* +#define MEMCFG_GSXMSEL_MSEL_GS0 0x1U // Master Select for GS0 RAM +#define MEMCFG_GSXMSEL_MSEL_GS1 0x2U // Master Select for GS1 RAM +#define MEMCFG_GSXMSEL_MSEL_GS2 0x4U // Master Select for GS2 RAM +#define MEMCFG_GSXMSEL_MSEL_GS3 0x8U // Master Select for GS3 RAM +#define MEMCFG_GSXMSEL_MSEL_GS4 0x10U // Master Select for GS4 RAM +#define MEMCFG_GSXMSEL_MSEL_GS5 0x20U // Master Select for GS5 RAM +#define MEMCFG_GSXMSEL_MSEL_GS6 0x40U // Master Select for GS6 RAM +#define MEMCFG_GSXMSEL_MSEL_GS7 0x80U // Master Select for GS7 RAM +#define MEMCFG_GSXMSEL_MSEL_GS8 0x100U // Master Select for GS8 RAM +#define MEMCFG_GSXMSEL_MSEL_GS9 0x200U // Master Select for GS9 RAM +#define MEMCFG_GSXMSEL_MSEL_GS10 0x400U // Master Select for GS10 RAM +#define MEMCFG_GSXMSEL_MSEL_GS11 0x800U // Master Select for GS11 RAM +#define MEMCFG_GSXMSEL_MSEL_GS12 0x1000U // Master Select for GS12 RAM +#define MEMCFG_GSXMSEL_MSEL_GS13 0x2000U // Master Select for GS13 RAM +#define MEMCFG_GSXMSEL_MSEL_GS14 0x4000U // Master Select for GS14 RAM +#define MEMCFG_GSXMSEL_MSEL_GS15 0x8000U // Master Select for GS15 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS0 0x1U // Fetch Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS0 0x2U // CPU WR Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS0 0x4U // DMA WR Protection For GS0 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS1 0x100U // Fetch Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS1 0x200U // CPU WR Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS1 0x400U // DMA WR Protection For GS1 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS2 0x10000U // Fetch Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS2 0x20000U // CPU WR Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS2 0x40000U // DMA WR Protection For GS2 RAM +#define MEMCFG_GSXACCPROT0_FETCHPROT_GS3 0x1000000U // Fetch Protection For GS3 RAM +#define MEMCFG_GSXACCPROT0_CPUWRPROT_GS3 0x2000000U // CPU WR Protection For GS3 RAM +#define MEMCFG_GSXACCPROT0_DMAWRPROT_GS3 0x4000000U // DMA WR Protection For GS3 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT1 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS4 0x1U // Fetch Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS4 0x2U // CPU WR Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS4 0x4U // DMA WR Protection For GS4 RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS5 0x100U // Fetch Protection For GS5 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS5 0x200U // CPU WR Protection For GS5 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS5 0x400U // DMA WR Protection For GS5RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS6 0x10000U // Fetch Protection For GS6 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS6 0x20000U // CPU WR Protection For GS6 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS6 0x40000U // DMA WR Protection For GS6RAM +#define MEMCFG_GSXACCPROT1_FETCHPROT_GS7 0x1000000U // Fetch Protection For GS7 RAM +#define MEMCFG_GSXACCPROT1_CPUWRPROT_GS7 0x2000000U // CPU WR Protection For GS7 RAM +#define MEMCFG_GSXACCPROT1_DMAWRPROT_GS7 0x4000000U // DMA WR Protection For GS7RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT2 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS8 0x1U // Fetch Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS8 0x2U // CPU WR Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS8 0x4U // DMA WR Protection For GS8 RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS9 0x100U // Fetch Protection For GS9 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS9 0x200U // CPU WR Protection For GS9 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS9 0x400U // DMA WR Protection For GS9RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS10 0x10000U // Fetch Protection For GS10 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS10 0x20000U // CPU WR Protection For GS10 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS10 0x40000U // DMA WR Protection For GS10RAM +#define MEMCFG_GSXACCPROT2_FETCHPROT_GS11 0x1000000U // Fetch Protection For GS11 RAM +#define MEMCFG_GSXACCPROT2_CPUWRPROT_GS11 0x2000000U // CPU WR Protection For GS11 RAM +#define MEMCFG_GSXACCPROT2_DMAWRPROT_GS11 0x4000000U // DMA WR Protection For GS11RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxACCPROT3 register +// +//************************************************************************************************* +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS12 0x1U // Fetch Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS12 0x2U // CPU WR Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS12 0x4U // DMA WR Protection For GS12 RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS13 0x100U // Fetch Protection For GS13 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS13 0x200U // CPU WR Protection For GS13 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS13 0x400U // DMA WR Protection For GS13RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS14 0x10000U // Fetch Protection For GS14 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS14 0x20000U // CPU WR Protection For GS14 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS14 0x40000U // DMA WR Protection For GS14RAM +#define MEMCFG_GSXACCPROT3_FETCHPROT_GS15 0x1000000U // Fetch Protection For GS15 RAM +#define MEMCFG_GSXACCPROT3_CPUWRPROT_GS15 0x2000000U // CPU WR Protection For GS15 RAM +#define MEMCFG_GSXACCPROT3_DMAWRPROT_GS15 0x4000000U // DMA WR Protection For GS15RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxTEST register +// +//************************************************************************************************* +#define MEMCFG_GSXTEST_TEST_GS0_S 0U +#define MEMCFG_GSXTEST_TEST_GS0_M 0x3U // Selects the different modes for GS0 RAM +#define MEMCFG_GSXTEST_TEST_GS1_S 2U +#define MEMCFG_GSXTEST_TEST_GS1_M 0xCU // Selects the different modes for GS1 RAM +#define MEMCFG_GSXTEST_TEST_GS2_S 4U +#define MEMCFG_GSXTEST_TEST_GS2_M 0x30U // Selects the different modes for GS2 RAM +#define MEMCFG_GSXTEST_TEST_GS3_S 6U +#define MEMCFG_GSXTEST_TEST_GS3_M 0xC0U // Selects the different modes for GS3 RAM +#define MEMCFG_GSXTEST_TEST_GS4_S 8U +#define MEMCFG_GSXTEST_TEST_GS4_M 0x300U // Selects the different modes for GS4 RAM +#define MEMCFG_GSXTEST_TEST_GS5_S 10U +#define MEMCFG_GSXTEST_TEST_GS5_M 0xC00U // Selects the different modes for GS5 RAM +#define MEMCFG_GSXTEST_TEST_GS6_S 12U +#define MEMCFG_GSXTEST_TEST_GS6_M 0x3000U // Selects the different modes for GS6 RAM +#define MEMCFG_GSXTEST_TEST_GS7_S 14U +#define MEMCFG_GSXTEST_TEST_GS7_M 0xC000U // Selects the different modes for GS7 RAM +#define MEMCFG_GSXTEST_TEST_GS8_S 16U +#define MEMCFG_GSXTEST_TEST_GS8_M 0x30000U // Selects the different modes for GS8 RAM +#define MEMCFG_GSXTEST_TEST_GS9_S 18U +#define MEMCFG_GSXTEST_TEST_GS9_M 0xC0000U // Selects the different modes for GS9 RAM +#define MEMCFG_GSXTEST_TEST_GS10_S 20U +#define MEMCFG_GSXTEST_TEST_GS10_M 0x300000U // Selects the different modes for GS10 RAM +#define MEMCFG_GSXTEST_TEST_GS11_S 22U +#define MEMCFG_GSXTEST_TEST_GS11_M 0xC00000U // Selects the different modes for GS11 RAM +#define MEMCFG_GSXTEST_TEST_GS12_S 24U +#define MEMCFG_GSXTEST_TEST_GS12_M 0x3000000U // Selects the different modes for GS12 RAM +#define MEMCFG_GSXTEST_TEST_GS13_S 26U +#define MEMCFG_GSXTEST_TEST_GS13_M 0xC000000U // Selects the different modes for GS13 RAM +#define MEMCFG_GSXTEST_TEST_GS14_S 28U +#define MEMCFG_GSXTEST_TEST_GS14_M 0x30000000U // Selects the different modes for GS14 RAM +#define MEMCFG_GSXTEST_TEST_GS15_S 30U +#define MEMCFG_GSXTEST_TEST_GS15_M 0xC0000000U // Selects the different modes for GS15 RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxINIT register +// +//************************************************************************************************* +#define MEMCFG_GSXINIT_INIT_GS0 0x1U // RAM Initialization control for GS0 RAM. +#define MEMCFG_GSXINIT_INIT_GS1 0x2U // RAM Initialization control for GS1 RAM. +#define MEMCFG_GSXINIT_INIT_GS2 0x4U // RAM Initialization control for GS2 RAM. +#define MEMCFG_GSXINIT_INIT_GS3 0x8U // RAM Initialization control for GS3 RAM. +#define MEMCFG_GSXINIT_INIT_GS4 0x10U // RAM Initialization control for GS4 RAM. +#define MEMCFG_GSXINIT_INIT_GS5 0x20U // RAM Initialization control for GS5 RAM. +#define MEMCFG_GSXINIT_INIT_GS6 0x40U // RAM Initialization control for GS6 RAM. +#define MEMCFG_GSXINIT_INIT_GS7 0x80U // RAM Initialization control for GS7 RAM. +#define MEMCFG_GSXINIT_INIT_GS8 0x100U // RAM Initialization control for GS8 RAM. +#define MEMCFG_GSXINIT_INIT_GS9 0x200U // RAM Initialization control for GS9 RAM. +#define MEMCFG_GSXINIT_INIT_GS10 0x400U // RAM Initialization control for GS10 RAM. +#define MEMCFG_GSXINIT_INIT_GS11 0x800U // RAM Initialization control for GS11 RAM. +#define MEMCFG_GSXINIT_INIT_GS12 0x1000U // RAM Initialization control for GS12 RAM. +#define MEMCFG_GSXINIT_INIT_GS13 0x2000U // RAM Initialization control for GS13 RAM. +#define MEMCFG_GSXINIT_INIT_GS14 0x4000U // RAM Initialization control for GS14 RAM. +#define MEMCFG_GSXINIT_INIT_GS15 0x8000U // RAM Initialization control for GS15 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GSxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_GSXINITDONE_INITDONE_GS0 0x1U // RAM Initialization status for GS0 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS1 0x2U // RAM Initialization status for GS1 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS2 0x4U // RAM Initialization status for GS2 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS3 0x8U // RAM Initialization status for GS3 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS4 0x10U // RAM Initialization status for GS4 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS5 0x20U // RAM Initialization status for GS5 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS6 0x40U // RAM Initialization status for GS6 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS7 0x80U // RAM Initialization status for GS7 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS8 0x100U // RAM Initialization status for GS8 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS9 0x200U // RAM Initialization status for GS9 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS10 0x400U // RAM Initialization status for GS10 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS11 0x800U // RAM Initialization status for GS11 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS12 0x1000U // RAM Initialization status for GS12 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS13 0x2000U // RAM Initialization status for GS13 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS14 0x4000U // RAM Initialization status for GS14 RAM. +#define MEMCFG_GSXINITDONE_INITDONE_GS15 0x8000U // RAM Initialization status for GS15 RAM. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxTEST register +// +//************************************************************************************************* +#define MEMCFG_MSGXTEST_TEST_CPUTOCPU_S 0U +#define MEMCFG_MSGXTEST_TEST_CPUTOCPU_M 0x3U // CPU to CPU Mode Select +#define MEMCFG_MSGXTEST_TEST_CPUTOCLA1_S 2U +#define MEMCFG_MSGXTEST_TEST_CPUTOCLA1_M 0xCU // CPU to CLA1 MSG RAM Mode Select +#define MEMCFG_MSGXTEST_TEST_CLA1TOCPU_S 4U +#define MEMCFG_MSGXTEST_TEST_CLA1TOCPU_M 0x30U // CLA1 to CPU MSG RAM Mode Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxINIT register +// +//************************************************************************************************* +#define MEMCFG_MSGXINIT_INIT_CPUTOCPU 0x1U // Initialization control for CPU to CPU MSG RAM +#define MEMCFG_MSGXINIT_INIT_CPUTOCLA1 0x2U // Initialization control for CPUTOCLA1 MSG RAM +#define MEMCFG_MSGXINIT_INIT_CLA1TOCPU 0x4U // Initialization control for CLA1TOCPU MSG RAM + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MSGxINITDONE register +// +//************************************************************************************************* +#define MEMCFG_MSGXINITDONE_INITDONE_CPUTOCPU 0x1U // Initialization status for CPU to CPU MSG + // RAM +#define MEMCFG_MSGXINITDONE_INITDONE_CPUTOCLA1 0x2U // Initialization status for CPU to CLA1 + // MSG RAM +#define MEMCFG_MSGXINITDONE_INITDONE_CLA1TOCPU 0x4U // Initialization status for CLA1 to CPU + // MSG RAM + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1LOCK register +// +//************************************************************************************************* +#define MEMCFG_EMIF1LOCK_LOCK_EMIF1 0x1U // EMIF1 access protection and master select fields + // lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1COMMIT register +// +//************************************************************************************************* +#define MEMCFG_EMIF1COMMIT_COMMIT_EMIF1 0x1U // EMIF1 access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1MSEL register +// +//************************************************************************************************* +#define MEMCFG_EMIF1MSEL_MSEL_EMIF1_S 0U +#define MEMCFG_EMIF1MSEL_MSEL_EMIF1_M 0x3U // Master Select for EMIF1. +#define MEMCFG_EMIF1MSEL_KEY_S 4U +#define MEMCFG_EMIF1MSEL_KEY_M 0xFFFFFFF0U // KEY to enable the write into MSEL_EMIF1 + // bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF1ACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 0x1U // Fetch Protection For EMIF1 +#define MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 0x2U // CPU WR Protection For EMIF1 +#define MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1 0x4U // DMA WR Protection For EMIF1 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2LOCK register +// +//************************************************************************************************* +#define MEMCFG_EMIF2LOCK_LOCK_EMIF2 0x1U // EMIF2 access protection and master select permanent + // lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2COMMIT register +// +//************************************************************************************************* +#define MEMCFG_EMIF2COMMIT_COMMIT_EMIF2 0x1U // EMIF2 access protection and master select + // permanent lock + +//************************************************************************************************* +// +// The following are defines for the bit fields in the EMIF2ACCPROT0 register +// +//************************************************************************************************* +#define MEMCFG_EMIF2ACCPROT0_FETCHPROT_EMIF2 0x1U // Fetch Protection For EMIF2 +#define MEMCFG_EMIF2ACCPROT0_CPUWRPROT_EMIF2 0x2U // CPU WR Protection For EMIF2 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVFLG register +// +//************************************************************************************************* +#define MEMCFG_NMAVFLG_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag +#define MEMCFG_NMAVFLG_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag +#define MEMCFG_NMAVFLG_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag +#define MEMCFG_NMAVFLG_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag +#define MEMCFG_NMAVFLG_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVSET register +// +//************************************************************************************************* +#define MEMCFG_NMAVSET_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag Set +#define MEMCFG_NMAVSET_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag Set +#define MEMCFG_NMAVSET_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag Set +#define MEMCFG_NMAVSET_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVCLR register +// +//************************************************************************************************* +#define MEMCFG_NMAVCLR_CPUREAD 0x1U // Non Master CPU Read Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CPUWRITE 0x2U // Non Master CPU Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Flag Clear +#define MEMCFG_NMAVCLR_DMAWRITE 0x8U // Non Master DMA Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Flag Clear +#define MEMCFG_NMAVCLR_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMAVINTEN register +// +//************************************************************************************************* +#define MEMCFG_NMAVINTEN_CPUREAD 0x1U // Non Master CPU Read Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CPUWRITE 0x2U // Non Master CPU Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CPUFETCH 0x4U // Non Master CPU Fetch Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_DMAWRITE 0x8U // Non Master DMA Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1READ 0x10U // Non Master CLA1 Read Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1WRITE 0x20U // Non Master CLA1 Write Access Violation Interrupt + // Enable +#define MEMCFG_NMAVINTEN_CLA1FETCH 0x40U // Non Master CLA1 Fetch Access Violation Interrupt + // Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVFLG register +// +//************************************************************************************************* +#define MEMCFG_MAVFLG_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag +#define MEMCFG_MAVFLG_CPUWRITE 0x2U // Master CPU Write Access Violation Flag +#define MEMCFG_MAVFLG_DMAWRITE 0x4U // Master DMA Write Access Violation Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVSET register +// +//************************************************************************************************* +#define MEMCFG_MAVSET_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag Set +#define MEMCFG_MAVSET_CPUWRITE 0x2U // Master CPU Write Access Violation Flag Set +#define MEMCFG_MAVSET_DMAWRITE 0x4U // Master DMA Write Access Violation Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVCLR register +// +//************************************************************************************************* +#define MEMCFG_MAVCLR_CPUFETCH 0x1U // Master CPU Fetch Access Violation Flag Clear +#define MEMCFG_MAVCLR_CPUWRITE 0x2U // Master CPU Write Access Violation Flag Clear +#define MEMCFG_MAVCLR_DMAWRITE 0x4U // Master DMA Write Access Violation Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MAVINTEN register +// +//************************************************************************************************* +#define MEMCFG_MAVINTEN_CPUFETCH 0x1U // Master CPU Fetch Access Violation Interrupt Enable +#define MEMCFG_MAVINTEN_CPUWRITE 0x2U // Master CPU Write Access Violation Interrupt Enable +#define MEMCFG_MAVINTEN_DMAWRITE 0x4U // Master DMA Write Access Violation Interrupt Enable + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRFLG register +// +//************************************************************************************************* +#define MEMCFG_UCERRFLG_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag +#define MEMCFG_UCERRFLG_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag +#define MEMCFG_UCERRFLG_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRSET register +// +//************************************************************************************************* +#define MEMCFG_UCERRSET_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag Set +#define MEMCFG_UCERRSET_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag Set +#define MEMCFG_UCERRSET_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the UCERRCLR register +// +//************************************************************************************************* +#define MEMCFG_UCERRCLR_CPURDERR 0x1U // CPU Uncorrectable Read Error Flag Clear +#define MEMCFG_UCERRCLR_DMARDERR 0x2U // DMA Uncorrectable Read Error Flag Clear +#define MEMCFG_UCERRCLR_CLA1RDERR 0x4U // CLA1 Uncorrectable Read Error Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRFLG register +// +//************************************************************************************************* +#define MEMCFG_CERRFLG_CPURDERR 0x1U // CPU Correctable Read Error Flag +#define MEMCFG_CERRFLG_DMARDERR 0x2U // DMA Correctable Read Error Flag +#define MEMCFG_CERRFLG_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRSET register +// +//************************************************************************************************* +#define MEMCFG_CERRSET_CPURDERR 0x1U // CPU Correctable Read Error Flag Set +#define MEMCFG_CERRSET_DMARDERR 0x2U // DMA Correctable Read Error Flag Set +#define MEMCFG_CERRSET_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag Set + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CERRCLR register +// +//************************************************************************************************* +#define MEMCFG_CERRCLR_CPURDERR 0x1U // CPU Correctable Read Error Flag Clear +#define MEMCFG_CERRCLR_DMARDERR 0x2U // DMA Correctable Read Error Flag Clear +#define MEMCFG_CERRCLR_CLA1RDERR 0x4U // CLA1 Correctable Read Error Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTFLG register +// +//************************************************************************************************* +#define MEMCFG_CEINTFLG_CEINTFLAG 0x1U // Total corrected error count exceeded threshold flag. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTCLR register +// +//************************************************************************************************* +#define MEMCFG_CEINTCLR_CEINTCLR 0x1U // CPU Corrected Error Threshold Exceeded Error Clear. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTSET register +// +//************************************************************************************************* +#define MEMCFG_CEINTSET_CEINTSET 0x1U // Total corrected error count exceeded flag set. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CEINTEN register +// +//************************************************************************************************* +#define MEMCFG_CEINTEN_CEINTEN 0x1U // CPU/DMA Correctable Error Interrupt Enable. + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ROMWAITSTATE register +// +//************************************************************************************************* +#define MEMCFG_ROMWAITSTATE_WSDISABLE 0x1U // C28x ROM Wait State Enable/Disable Control + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ROMPREFETCH register +// +//************************************************************************************************* +#define MEMCFG_ROMPREFETCH_PFENABLE 0x1U // ROM Prefetch Enable/Disable Control + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_memmap.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_memmap.h new file mode 100644 index 0000000..ba0b5e5 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_memmap.h @@ -0,0 +1,208 @@ +//########################################################################### +// +// FILE: hw_memmap.h +// +// TITLE: Macros defining the memory map of the C28x. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_MEMMAP_H +#define HW_MEMMAP_H + +//***************************************************************************** +// +// The following are defines for the base address of the memories and +// peripherals. +// +//***************************************************************************** +#define M0_RAM_BASE 0x00000000U +#define M1_RAM_BASE 0x00000400U +#define ADCARESULT_BASE 0x00000B00U +#define ADCBRESULT_BASE 0x00000B20U +#define ADCCRESULT_BASE 0x00000B40U +#define ADCDRESULT_BASE 0x00000B60U +#define CPUTIMER0_BASE 0x00000C00U +#define CPUTIMER1_BASE 0x00000C08U +#define CPUTIMER2_BASE 0x00000C10U +#define CLA1_SOFTINT_BASE 0x00000CE0U +#define PIECTRL_BASE 0x00000CE0U +#define PIEVECTTABLE_BASE 0x00000D00U +#define DMA_BASE 0x00001000U +#define DMA_CH1_BASE 0x00001020U +#define DMA_CH2_BASE 0x00001040U +#define DMA_CH3_BASE 0x00001060U +#define DMA_CH4_BASE 0x00001080U +#define DMA_CH5_BASE 0x000010A0U +#define DMA_CH6_BASE 0x000010C0U +#define CLA1_BASE 0x00001400U +#define CLATOCPU_RAM_BASE 0x00001480U +#define CPUTOCLA_RAM_BASE 0x00001500U +#define CLB1_BASE 0x00003000U +#define CLB1_LOGICCFG_BASE 0x00003000U +#define CLB1_LOGICCTL_BASE 0x00003100U +#define CLB1_DATAEXCH_BASE 0x00003200U +#define CLB2_BASE 0x00003400U +#define CLB2_LOGICCFG_BASE 0x00003400U +#define CLB2_LOGICCTL_BASE 0x00003500U +#define CLB2_DATAEXCH_BASE 0x00003600U +#define CLB3_BASE 0x00003800U +#define CLB3_LOGICCFG_BASE 0x00003800U +#define CLB3_LOGICCTL_BASE 0x00003900U +#define CLB3_DATAEXCH_BASE 0x00003A00U +#define CLB4_BASE 0x00003C00U +#define CLB4_LOGICCFG_BASE 0x00003C00U +#define CLB4_LOGICCTL_BASE 0x00003D00U +#define CLB4_DATAEXCH_BASE 0x00003E00U +#define EPWM1_BASE 0x00004000U +#define EPWM2_BASE 0x00004100U +#define EPWM3_BASE 0x00004200U +#define EPWM4_BASE 0x00004300U +#define EPWM5_BASE 0x00004400U +#define EPWM6_BASE 0x00004500U +#define EPWM7_BASE 0x00004600U +#define EPWM8_BASE 0x00004700U +#define EPWM9_BASE 0x00004800U +#define EPWM10_BASE 0x00004900U +#define EPWM11_BASE 0x00004A00U +#define EPWM12_BASE 0x00004B00U +#define ECAP1_BASE 0x00005000U +#define ECAP2_BASE 0x00005020U +#define ECAP3_BASE 0x00005040U +#define ECAP4_BASE 0x00005060U +#define ECAP5_BASE 0x00005080U +#define ECAP6_BASE 0x000050A0U +#define EQEP1_BASE 0x00005100U +#define EQEP2_BASE 0x00005140U +#define EQEP3_BASE 0x00005180U +#define DACA_BASE 0x00005C00U +#define DACB_BASE 0x00005C10U +#define DACC_BASE 0x00005C20U +#define CMPSS1_BASE 0x00005C80U +#define CMPSS2_BASE 0x00005CA0U +#define CMPSS3_BASE 0x00005CC0U +#define CMPSS4_BASE 0x00005CE0U +#define CMPSS5_BASE 0x00005D00U +#define CMPSS6_BASE 0x00005D20U +#define CMPSS7_BASE 0x00005D40U +#define CMPSS8_BASE 0x00005D60U +#define SDFM1_BASE 0x00005E00U +#define SDFM2_BASE 0x00005E80U +#define MCBSPA_BASE 0x00006000U +#define MCBSPB_BASE 0x00006040U +#define SPIA_BASE 0x00006100U +#define SPIB_BASE 0x00006110U +#define SPIC_BASE 0x00006120U +#define UPP_BASE 0x00006200U +#define UPP_TX_MSG_RAM_BASE 0x00006C00U +#define UPP_RX_MSG_RAM_BASE 0x00006E00U +#define WD_BASE 0x00007000U +#define NMI_BASE 0x00007060U +#define XINT_BASE 0x00007070U +#define SCIA_BASE 0x00007200U +#define SCIB_BASE 0x00007210U +#define SCIC_BASE 0x00007220U +#define SCID_BASE 0x00007230U +#define I2CA_BASE 0x00007300U +#define I2CB_BASE 0x00007340U +#define ADCA_BASE 0x00007400U +#define ADCB_BASE 0x00007480U +#define ADCC_BASE 0x00007500U +#define ADCD_BASE 0x00007580U +#define INPUTXBAR_BASE 0x00007900U +#define XBAR_BASE 0x00007920U +#define SYNCSOC_BASE 0x00007940U +#define DMACLASRCSEL_BASE 0x00007980U +#define EPWMXBAR_BASE 0x00007A00U +#define CLBXBAR_BASE 0x00007A40U +#define OUTPUTXBAR_BASE 0x00007A80U +#define GPIOCTRL_BASE 0x00007C00U +#define GPIODATA_BASE 0x00007F00U +#define LS0_RAM_BASE 0x00008000U +#define LS1_RAM_BASE 0x00008800U +#define LS2_RAM_BASE 0x00009000U +#define LS3_RAM_BASE 0x00009800U +#define LS4_RAM_BASE 0x0000A000U +#define LS5_RAM_BASE 0x0000A800U +#define D0_RAM_BASE 0x0000B000U +#define D1_RAM_BASE 0x0000B800U +#define GS0_RAM_BASE 0x0000C000U +#define GS1_RAM_BASE 0x0000D000U +#define GS2_RAM_BASE 0x0000E000U +#define GS3_RAM_BASE 0x0000F000U +#define GS4_RAM_BASE 0x00010000U +#define GS5_RAM_BASE 0x00011000U +#define GS6_RAM_BASE 0x00012000U +#define GS7_RAM_BASE 0x00013000U +#define GS8_RAM_BASE 0x00014000U +#define GS9_RAM_BASE 0x00015000U +#define GS10_RAM_BASE 0x00016000U +#define GS11_RAM_BASE 0x00017000U +#define GS12_RAM_BASE 0x00018000U +#define GS13_RAM_BASE 0x00019000U +#define GS14_RAM_BASE 0x0001A000U +#define GS15_RAM_BASE 0x0001B000U +#define CPU2_TO_CPU1_MSG_RAM_BASE 0x0003F800U +#define CPU1_TO_CPU2_MSG_RAM_BASE 0x0003FC00U +#define USBA_BASE 0x00040000U +#define EMIF1_BASE 0x00047000U +#define EMIF2_BASE 0x00047800U +#define CANA_BASE 0x00048000U +#define CANA_MSG_RAM_BASE 0x00049000U +#define CANB_BASE 0x0004A000U +#define CANB_MSG_RAM_BASE 0x0004B000U +#define IPC_BASE 0x00050000U +#define FLASHPUMPSEMAPHORE_BASE 0x00050024U +#define DEVCFG_BASE 0x0005D000U +#define ANALOGSUBSYS_BASE 0x0005D180U +#define CLKCFG_BASE 0x0005D200U +#define CPUSYS_BASE 0x0005D300U +#define ROMPREFETCH_BASE 0x0005E608U +#define DCSM_Z1_BASE 0x0005F000U +#define DCSM_Z2_BASE 0x0005F040U +#define DCSMCOMMON_BASE 0x0005F070U +#define MEMCFG_BASE 0x0005F400U +#define EMIF1CONFIG_BASE 0x0005F480U +#define EMIF2CONFIG_BASE 0x0005F4A0U +#define ACCESSPROTECTION_BASE 0x0005F4C0U +#define MEMORYERROR_BASE 0x0005F500U +#define ROMWAITSTATE_BASE 0x0005F540U +#define FLASH0CTRL_BASE 0x0005F800U +#define FLASH0ECC_BASE 0x0005FB00U +#define DCSM_Z1OTP_BASE 0x00078000U +#define DCSM_Z2OTP_BASE 0x00078200U +#define UID_BASE 0x000703C0U +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_nmi.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_nmi.h new file mode 100644 index 0000000..efd8157 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_nmi.h @@ -0,0 +1,134 @@ +//########################################################################### +// +// FILE: hw_nmi.h +// +// TITLE: Definitions for the NMI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_NMI_H +#define HW_NMI_H + +//************************************************************************************************* +// +// The following are defines for the NMI register offsets +// +//************************************************************************************************* +#define NMI_O_CFG 0x0U // NMI Configuration Register +#define NMI_O_FLG 0x1U // NMI Flag Register (XRSn Clear) +#define NMI_O_FLGCLR 0x2U // NMI Flag Clear Register +#define NMI_O_FLGFRC 0x3U // NMI Flag Force Register +#define NMI_O_WDCNT 0x4U // NMI Watchdog Counter Register +#define NMI_O_WDPRD 0x5U // NMI Watchdog Period Register +#define NMI_O_SHDFLG 0x6U // NMI Shadow Flag Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMICFG register +// +//************************************************************************************************* +#define NMI_CFG_NMIE 0x1U // Global NMI Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLG register +// +//************************************************************************************************* +#define NMI_FLG_NMIINT 0x1U // NMI Interrupt Flag +#define NMI_FLG_CLOCKFAIL 0x2U // Clock Fail Interrupt Flag +#define NMI_FLG_RAMUNCERR 0x4U // RAM Uncorrectable Error NMI Flag +#define NMI_FLG_FLUNCERR 0x8U // Flash Uncorrectable Error NMI Flag +#define NMI_FLG_CPU1HWBISTERR 0x10U // HW BIST Error NMI Flag +#define NMI_FLG_CPU2HWBISTERR 0x20U // HW BIST Error NMI Flag +#define NMI_FLG_PIEVECTERR 0x40U // PIE Vector Fetch Error Flag +#define NMI_FLG_CLBNMI 0x100U // Configurable Logic Block NMI Flag +#define NMI_FLG_CPU2WDRSN 0x200U // CPU2 WDRSn Reset Indication Flag +#define NMI_FLG_CPU2NMIWDRSN 0x400U // CPU2 NMIWDRSn Reset Indication Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLGCLR register +// +//************************************************************************************************* +#define NMI_FLGCLR_NMIINT 0x1U // NMIINT Flag Clear +#define NMI_FLGCLR_CLOCKFAIL 0x2U // CLOCKFAIL Flag Clear +#define NMI_FLGCLR_RAMUNCERR 0x4U // RAMUNCERR Flag Clear +#define NMI_FLGCLR_FLUNCERR 0x8U // FLUNCERR Flag Clear +#define NMI_FLGCLR_CPU1HWBISTERR 0x10U // CPU1HWBISTERR Flag Clear +#define NMI_FLGCLR_CPU2HWBISTERR 0x20U // CPU2HWBISTERR Flag Clear +#define NMI_FLGCLR_PIEVECTERR 0x40U // PIEVECTERR Flag Clear +#define NMI_FLGCLR_CLBNMI 0x100U // CLBNMI Flag Clear +#define NMI_FLGCLR_CPU2WDRSN 0x200U // CPU2WDRSn Flag Clear +#define NMI_FLGCLR_CPU2NMIWDRSN 0x400U // CPU2NMIWDRSn Flag Clear +#define NMI_FLGCLR_OVF 0x800U // OVF Flag Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMIFLGFRC register +// +//************************************************************************************************* +#define NMI_FLGFRC_CLOCKFAIL 0x2U // CLOCKFAIL Flag Force +#define NMI_FLGFRC_RAMUNCERR 0x4U // RAMUNCERR Flag Force +#define NMI_FLGFRC_FLUNCERR 0x8U // FLUNCERR Flag Force +#define NMI_FLGFRC_CPU1HWBISTERR 0x10U // CPU1HWBISTERR Flag Force +#define NMI_FLGFRC_CPU2HWBISTERR 0x20U // CPU2HWBISTERR Flag Force +#define NMI_FLGFRC_PIEVECTERR 0x40U // PIEVECTERR Flag Force +#define NMI_FLGFRC_CLBNMI 0x100U // CLBNMI Flag Force +#define NMI_FLGFRC_CPU2WDRSN 0x200U // CPU2WDRSn Flag Force +#define NMI_FLGFRC_CPU2NMIWDRSN 0x400U // CPU2NMIWDRSn Flag Force +#define NMI_FLGFRC_OVF 0x800U // OVF Flag Force + +//************************************************************************************************* +// +// The following are defines for the bit fields in the NMISHDFLG register +// +//************************************************************************************************* +#define NMI_SHDFLG_CLOCKFAIL 0x2U // Shadow CLOCKFAIL Flag +#define NMI_SHDFLG_RAMUNCERR 0x4U // Shadow RAMUNCERR Flag +#define NMI_SHDFLG_FLUNCERR 0x8U // Shadow FLUNCERR Flag +#define NMI_SHDFLG_CPU1HWBISTERR 0x10U // Shadow CPU1HWBISTERR Flag +#define NMI_SHDFLG_CPU2HWBISTERR 0x20U // Shadow CPU2HWBISTERR Flag +#define NMI_SHDFLG_PIEVECTERR 0x40U // Shadow PIEVECTERR Flag +#define NMI_SHDFLG_CLBNMI 0x100U // Shadow CLBNMI Flag +#define NMI_SHDFLG_CPU2WDRSN 0x200U // Shadow CPU2WDRSn Flag +#define NMI_SHDFLG_CPU2NMIWDRSN 0x400U // Shadow CPU2NMIWDRSn Flag +#define NMI_SHDFLG_OVF 0x800U // Shadow OVF Flag + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_otp.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_otp.h new file mode 100644 index 0000000..d074499 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_otp.h @@ -0,0 +1,63 @@ +//########################################################################### +// +// FILE: hw_otp.h +// +// TITLE: Definitions for the OTP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_OTP_H +#define HW_OTP_H + +//************************************************************************************************* +// +// The following are defines for the OTP register offsets +// +//************************************************************************************************* +#define OTP_O_UID_PSRAND0 0x0U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND1 0x2U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND2 0x4U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND3 0x6U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND4 0x8U // UID Psuedo-random 160 bit number +#define OTP_O_UID_PSRAND5 0xAU // UID Psuedo-random 160 bit number +#define OTP_O_UID_UNIQUE 0xCU // UID UID Unique 32 bit number +#define OTP_O_UID_CHECKSUM 0xEU // UID Checksum + + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_outputxbar.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_outputxbar.h new file mode 100644 index 0000000..30a10e9 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_outputxbar.h @@ -0,0 +1,1340 @@ +//########################################################################### +// +// FILE: hw_outputxbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_OUTPUTXBAR_H +#define HW_OUTPUTXBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_OUTPUT1MUX0TO15CFG 0x0U // Output X-BAR Mux Configuration for Output 1 +#define XBAR_O_OUTPUT1MUX16TO31CFG 0x2U // Output X-BAR Mux Configuration for Output 1 +#define XBAR_O_OUTPUT2MUX0TO15CFG 0x4U // Output X-BAR Mux Configuration for Output 2 +#define XBAR_O_OUTPUT2MUX16TO31CFG 0x6U // Output X-BAR Mux Configuration for Output 2 +#define XBAR_O_OUTPUT3MUX0TO15CFG 0x8U // Output X-BAR Mux Configuration for Output 3 +#define XBAR_O_OUTPUT3MUX16TO31CFG 0xAU // Output X-BAR Mux Configuration for Output 3 +#define XBAR_O_OUTPUT4MUX0TO15CFG 0xCU // Output X-BAR Mux Configuration for Output 4 +#define XBAR_O_OUTPUT4MUX16TO31CFG 0xEU // Output X-BAR Mux Configuration for Output 4 +#define XBAR_O_OUTPUT5MUX0TO15CFG 0x10U // Output X-BAR Mux Configuration for Output 5 +#define XBAR_O_OUTPUT5MUX16TO31CFG 0x12U // Output X-BAR Mux Configuration for Output 5 +#define XBAR_O_OUTPUT6MUX0TO15CFG 0x14U // Output X-BAR Mux Configuration for Output 6 +#define XBAR_O_OUTPUT6MUX16TO31CFG 0x16U // Output X-BAR Mux Configuration for Output 6 +#define XBAR_O_OUTPUT7MUX0TO15CFG 0x18U // Output X-BAR Mux Configuration for Output 7 +#define XBAR_O_OUTPUT7MUX16TO31CFG 0x1AU // Output X-BAR Mux Configuration for Output 7 +#define XBAR_O_OUTPUT8MUX0TO15CFG 0x1CU // Output X-BAR Mux Configuration for Output 8 +#define XBAR_O_OUTPUT8MUX16TO31CFG 0x1EU // Output X-BAR Mux Configuration for Output 8 +#define XBAR_O_OUTPUT1MUXENABLE 0x20U // Output X-BAR Mux Enable for Output 1 +#define XBAR_O_OUTPUT2MUXENABLE 0x22U // Output X-BAR Mux Enable for Output 2 +#define XBAR_O_OUTPUT3MUXENABLE 0x24U // Output X-BAR Mux Enable for Output 3 +#define XBAR_O_OUTPUT4MUXENABLE 0x26U // Output X-BAR Mux Enable for Output 4 +#define XBAR_O_OUTPUT5MUXENABLE 0x28U // Output X-BAR Mux Enable for Output 5 +#define XBAR_O_OUTPUT6MUXENABLE 0x2AU // Output X-BAR Mux Enable for Output 6 +#define XBAR_O_OUTPUT7MUXENABLE 0x2CU // Output X-BAR Mux Enable for Output 7 +#define XBAR_O_OUTPUT8MUXENABLE 0x2EU // Output X-BAR Mux Enable for Output 8 +#define XBAR_O_OUTPUTLATCH 0x30U // Output X-BAR Output Latch +#define XBAR_O_OUTPUTLATCHCLR 0x32U // Output X-BAR Output Latch Clear +#define XBAR_O_OUTPUTLATCHFRC 0x34U // Output X-BAR Output Latch Clear +#define XBAR_O_OUTPUTLATCHENABLE 0x36U // Output X-BAR Output Latch Enable +#define XBAR_O_OUTPUTINV 0x38U // Output X-BAR Output Inversion +#define XBAR_O_OUTPUTLOCK 0x3EU // Output X-BAR Configuration Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT1MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT1 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT1 of + // OUTPUT-XBAR +#define XBAR_OUTPUT1MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT1MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT1 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT2MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT2 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT2 of + // OUTPUT-XBAR +#define XBAR_OUTPUT2MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT2MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT2 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT3MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT3 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT3 of + // OUTPUT-XBAR +#define XBAR_OUTPUT3MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT3MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT3 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT4MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT4 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT4 of + // OUTPUT-XBAR +#define XBAR_OUTPUT4MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT4MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT4 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT5MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT5 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT5 of + // OUTPUT-XBAR +#define XBAR_OUTPUT5MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT5MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT5 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT6MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT6 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT6 of + // OUTPUT-XBAR +#define XBAR_OUTPUT6MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT6MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT6 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT7MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT7 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT7 of + // OUTPUT-XBAR +#define XBAR_OUTPUT7MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT7MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT7 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUX0TO15CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUX0TO15CFG_MUX0_S 0U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX0_M 0x3U // Mux0 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX1_S 2U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX1_M 0xCU // Mux1 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX2_S 4U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX2_M 0x30U // Mux2 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX3_S 6U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX3_M 0xC0U // Mux3 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX4_S 8U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX4_M 0x300U // Mux4 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX5_S 10U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX5_M 0xC00U // Mux5 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX6_S 12U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX6_M 0x3000U // Mux6 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX7_S 14U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX7_M 0xC000U // Mux7 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX8_S 16U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX8_M 0x30000U // Mux8 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX9_S 18U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX9_M 0xC0000U // Mux9 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX10_S 20U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX10_M 0x300000U // Mux10 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX11_S 22U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX11_M 0xC00000U // Mux11 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX12_S 24U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX12_M 0x3000000U // Mux12 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX13_S 26U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX13_M 0xC000000U // Mux13 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX14_S 28U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX14_M 0x30000000U // Mux14 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX0TO15CFG_MUX15_S 30U +#define XBAR_OUTPUT8MUX0TO15CFG_MUX15_M 0xC0000000U // Mux15 Configuration for OUTPUT8 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUX16TO31CFG register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUX16TO31CFG_MUX16_S 0U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX16_M 0x3U // Mux16 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX17_S 2U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX17_M 0xCU // Mux17 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX18_S 4U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX18_M 0x30U // Mux18 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX19_S 6U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX19_M 0xC0U // Mux19 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX20_S 8U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX20_M 0x300U // Mux20 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX21_S 10U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX21_M 0xC00U // Mux21 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX22_S 12U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX22_M 0x3000U // Mux22 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX23_S 14U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX23_M 0xC000U // Mux23 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX24_S 16U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX24_M 0x30000U // Mux24 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX25_S 18U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX25_M 0xC0000U // Mux25 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX26_S 20U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX26_M 0x300000U // Mux26 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX27_S 22U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX27_M 0xC00000U // Mux27 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX28_S 24U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX28_M 0x3000000U // Mux28 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX29_S 26U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX29_M 0xC000000U // Mux29 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX30_S 28U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX30_M 0x30000000U // Mux30 Configuration for OUTPUT8 of + // OUTPUT-XBAR +#define XBAR_OUTPUT8MUX16TO31CFG_MUX31_S 30U +#define XBAR_OUTPUT8MUX16TO31CFG_MUX31_M 0xC0000000U // Mux31 Configuration for OUTPUT8 of + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT1MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT1MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUT1MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT1 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT2MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT2MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUT2MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT2 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT3MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT3MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUT3MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT3 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT4MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT4MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUT4MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT4 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT5MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT5MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUT5MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT5 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT6MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT6MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUT6MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT6 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT7MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT7MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUT7MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT7 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUT8MUXENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUT8MUXENABLE_MUX0 0x1U // Mux0 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX1 0x2U // Mux1 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX2 0x4U // Mux2 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX3 0x8U // Mux3 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX4 0x10U // Mux4 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX5 0x20U // Mux5 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX6 0x40U // Mux6 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX7 0x80U // Mux7 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX8 0x100U // Mux8 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX9 0x200U // Mux9 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX10 0x400U // Mux10 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX11 0x800U // Mux11 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX12 0x1000U // Mux12 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX13 0x2000U // Mux13 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX14 0x4000U // Mux14 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX15 0x8000U // Mux15 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX16 0x10000U // Mux16 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX17 0x20000U // Mux17 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX18 0x40000U // Mux18 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX19 0x80000U // Mux19 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX20 0x100000U // Mux20 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX21 0x200000U // Mux21 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX22 0x400000U // Mux22 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX23 0x800000U // Mux23 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX24 0x1000000U // Mux24 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX25 0x2000000U // Mux25 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX26 0x4000000U // Mux26 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX27 0x8000000U // Mux27 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX28 0x10000000U // Mux28 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX29 0x20000000U // Mux29 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX30 0x40000000U // Mux30 to drive OUTPUT8 of OUTPUT-XBAR +#define XBAR_OUTPUT8MUXENABLE_MUX31 0x80000000U // Mux31 to drive OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCH register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCH_OUTPUT1 0x1U // Records the OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT2 0x2U // Records the OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT3 0x4U // Records the OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT4 0x8U // Records the OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT5 0x10U // Records the OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT6 0x20U // Records the OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT7 0x40U // Records the OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCH_OUTPUT8 0x80U // Records the OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHCLR register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHCLR_OUTPUT1 0x1U // Clears the Output-Latch for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT2 0x2U // Clears the Output-Latch for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT3 0x4U // Clears the Output-Latch for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT4 0x8U // Clears the Output-Latch for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT5 0x10U // Clears the Output-Latch for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT6 0x20U // Clears the Output-Latch for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT7 0x40U // Clears the Output-Latch for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHCLR_OUTPUT8 0x80U // Clears the Output-Latch for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHFRC register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHFRC_OUTPUT1 0x1U // Sets the Output-Latch for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT2 0x2U // Sets the Output-Latch for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT3 0x4U // Sets the Output-Latch for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT4 0x8U // Sets the Output-Latch for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT5 0x10U // Sets the Output-Latch for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT6 0x20U // Sets the Output-Latch for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT7 0x40U // Sets the Output-Latch for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTLATCHFRC_OUTPUT8 0x80U // Sets the Output-Latch for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLATCHENABLE register +// +//************************************************************************************************* +#define XBAR_OUTPUTLATCHENABLE_OUTPUT1 0x1U // Selects the output latch to drive OUTPUT1 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT2 0x2U // Selects the output latch to drive OUTPUT2 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT3 0x4U // Selects the output latch to drive OUTPUT3 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT4 0x8U // Selects the output latch to drive OUTPUT4 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT5 0x10U // Selects the output latch to drive OUTPUT5 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT6 0x20U // Selects the output latch to drive OUTPUT6 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT7 0x40U // Selects the output latch to drive OUTPUT7 for + // OUTPUT-XBAR +#define XBAR_OUTPUTLATCHENABLE_OUTPUT8 0x80U // Selects the output latch to drive OUTPUT8 for + // OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTINV register +// +//************************************************************************************************* +#define XBAR_OUTPUTINV_OUTPUT1 0x1U // Selects polarity for OUTPUT1 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT2 0x2U // Selects polarity for OUTPUT2 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT3 0x4U // Selects polarity for OUTPUT3 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT4 0x8U // Selects polarity for OUTPUT4 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT5 0x10U // Selects polarity for OUTPUT5 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT6 0x20U // Selects polarity for OUTPUT6 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT7 0x40U // Selects polarity for OUTPUT7 of OUTPUT-XBAR +#define XBAR_OUTPUTINV_OUTPUT8 0x80U // Selects polarity for OUTPUT8 of OUTPUT-XBAR + +//************************************************************************************************* +// +// The following are defines for the bit fields in the OUTPUTLOCK register +// +//************************************************************************************************* +#define XBAR_OUTPUTLOCK_LOCK 0x1U // Locks the configuration for OUTPUT-XBAR +#define XBAR_OUTPUTLOCK_KEY_S 16U +#define XBAR_OUTPUTLOCK_KEY_M 0xFFFF0000U // Write Protection KEY + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_pie.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_pie.h new file mode 100644 index 0000000..9a4f09f --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_pie.h @@ -0,0 +1,636 @@ +//########################################################################### +// +// FILE: hw_pie.h +// +// TITLE: Definitions for the PIE registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_PIE_H +#define HW_PIE_H + +//************************************************************************************************* +// +// The following are defines for the PIE register offsets +// +//************************************************************************************************* +#define PIE_O_CTRL 0x0U // ePIE Control Register +#define PIE_O_ACK 0x1U // Interrupt Acknowledge Register +#define PIE_O_IER1 0x2U // Interrupt Group 1 Enable Register +#define PIE_O_IFR1 0x3U // Interrupt Group 1 Flag Register +#define PIE_O_IER2 0x4U // Interrupt Group 2 Enable Register +#define PIE_O_IFR2 0x5U // Interrupt Group 2 Flag Register +#define PIE_O_IER3 0x6U // Interrupt Group 3 Enable Register +#define PIE_O_IFR3 0x7U // Interrupt Group 3 Flag Register +#define PIE_O_IER4 0x8U // Interrupt Group 4 Enable Register +#define PIE_O_IFR4 0x9U // Interrupt Group 4 Flag Register +#define PIE_O_IER5 0xAU // Interrupt Group 5 Enable Register +#define PIE_O_IFR5 0xBU // Interrupt Group 5 Flag Register +#define PIE_O_IER6 0xCU // Interrupt Group 6 Enable Register +#define PIE_O_IFR6 0xDU // Interrupt Group 6 Flag Register +#define PIE_O_IER7 0xEU // Interrupt Group 7 Enable Register +#define PIE_O_IFR7 0xFU // Interrupt Group 7 Flag Register +#define PIE_O_IER8 0x10U // Interrupt Group 8 Enable Register +#define PIE_O_IFR8 0x11U // Interrupt Group 8 Flag Register +#define PIE_O_IER9 0x12U // Interrupt Group 9 Enable Register +#define PIE_O_IFR9 0x13U // Interrupt Group 9 Flag Register +#define PIE_O_IER10 0x14U // Interrupt Group 10 Enable Register +#define PIE_O_IFR10 0x15U // Interrupt Group 10 Flag Register +#define PIE_O_IER11 0x16U // Interrupt Group 11 Enable Register +#define PIE_O_IFR11 0x17U // Interrupt Group 11 Flag Register +#define PIE_O_IER12 0x18U // Interrupt Group 12 Enable Register +#define PIE_O_IFR12 0x19U // Interrupt Group 12 Flag Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIECTRL register +// +//************************************************************************************************* +#define PIE_CTRL_ENPIE 0x1U // PIE Enable +#define PIE_CTRL_PIEVECT_S 1U +#define PIE_CTRL_PIEVECT_M 0xFFFEU // PIE Vector Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEACK register +// +//************************************************************************************************* +#define PIE_ACK_ACK1 0x1U // Acknowledge PIE Interrupt Group 1 +#define PIE_ACK_ACK2 0x2U // Acknowledge PIE Interrupt Group 2 +#define PIE_ACK_ACK3 0x4U // Acknowledge PIE Interrupt Group 3 +#define PIE_ACK_ACK4 0x8U // Acknowledge PIE Interrupt Group 4 +#define PIE_ACK_ACK5 0x10U // Acknowledge PIE Interrupt Group 5 +#define PIE_ACK_ACK6 0x20U // Acknowledge PIE Interrupt Group 6 +#define PIE_ACK_ACK7 0x40U // Acknowledge PIE Interrupt Group 7 +#define PIE_ACK_ACK8 0x80U // Acknowledge PIE Interrupt Group 8 +#define PIE_ACK_ACK9 0x100U // Acknowledge PIE Interrupt Group 9 +#define PIE_ACK_ACK10 0x200U // Acknowledge PIE Interrupt Group 10 +#define PIE_ACK_ACK11 0x400U // Acknowledge PIE Interrupt Group 11 +#define PIE_ACK_ACK12 0x800U // Acknowledge PIE Interrupt Group 12 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER1 register +// +//************************************************************************************************* +#define PIE_IER1_INTX1 0x1U // Enable for Interrupt 1.1 +#define PIE_IER1_INTX2 0x2U // Enable for Interrupt 1.2 +#define PIE_IER1_INTX3 0x4U // Enable for Interrupt 1.3 +#define PIE_IER1_INTX4 0x8U // Enable for Interrupt 1.4 +#define PIE_IER1_INTX5 0x10U // Enable for Interrupt 1.5 +#define PIE_IER1_INTX6 0x20U // Enable for Interrupt 1.6 +#define PIE_IER1_INTX7 0x40U // Enable for Interrupt 1.7 +#define PIE_IER1_INTX8 0x80U // Enable for Interrupt 1.8 +#define PIE_IER1_INTX9 0x100U // Enable for Interrupt 1.9 +#define PIE_IER1_INTX10 0x200U // Enable for Interrupt 1.10 +#define PIE_IER1_INTX11 0x400U // Enable for Interrupt 1.11 +#define PIE_IER1_INTX12 0x800U // Enable for Interrupt 1.12 +#define PIE_IER1_INTX13 0x1000U // Enable for Interrupt 1.13 +#define PIE_IER1_INTX14 0x2000U // Enable for Interrupt 1.14 +#define PIE_IER1_INTX15 0x4000U // Enable for Interrupt 1.15 +#define PIE_IER1_INTX16 0x8000U // Enable for Interrupt 1.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR1 register +// +//************************************************************************************************* +#define PIE_IFR1_INTX1 0x1U // Flag for Interrupt 1.1 +#define PIE_IFR1_INTX2 0x2U // Flag for Interrupt 1.2 +#define PIE_IFR1_INTX3 0x4U // Flag for Interrupt 1.3 +#define PIE_IFR1_INTX4 0x8U // Flag for Interrupt 1.4 +#define PIE_IFR1_INTX5 0x10U // Flag for Interrupt 1.5 +#define PIE_IFR1_INTX6 0x20U // Flag for Interrupt 1.6 +#define PIE_IFR1_INTX7 0x40U // Flag for Interrupt 1.7 +#define PIE_IFR1_INTX8 0x80U // Flag for Interrupt 1.8 +#define PIE_IFR1_INTX9 0x100U // Flag for Interrupt 1.9 +#define PIE_IFR1_INTX10 0x200U // Flag for Interrupt 1.10 +#define PIE_IFR1_INTX11 0x400U // Flag for Interrupt 1.11 +#define PIE_IFR1_INTX12 0x800U // Flag for Interrupt 1.12 +#define PIE_IFR1_INTX13 0x1000U // Flag for Interrupt 1.13 +#define PIE_IFR1_INTX14 0x2000U // Flag for Interrupt 1.14 +#define PIE_IFR1_INTX15 0x4000U // Flag for Interrupt 1.15 +#define PIE_IFR1_INTX16 0x8000U // Flag for Interrupt 1.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER2 register +// +//************************************************************************************************* +#define PIE_IER2_INTX1 0x1U // Enable for Interrupt 2.1 +#define PIE_IER2_INTX2 0x2U // Enable for Interrupt 2.2 +#define PIE_IER2_INTX3 0x4U // Enable for Interrupt 2.3 +#define PIE_IER2_INTX4 0x8U // Enable for Interrupt 2.4 +#define PIE_IER2_INTX5 0x10U // Enable for Interrupt 2.5 +#define PIE_IER2_INTX6 0x20U // Enable for Interrupt 2.6 +#define PIE_IER2_INTX7 0x40U // Enable for Interrupt 2.7 +#define PIE_IER2_INTX8 0x80U // Enable for Interrupt 2.8 +#define PIE_IER2_INTX9 0x100U // Enable for Interrupt 2.9 +#define PIE_IER2_INTX10 0x200U // Enable for Interrupt 2.10 +#define PIE_IER2_INTX11 0x400U // Enable for Interrupt 2.11 +#define PIE_IER2_INTX12 0x800U // Enable for Interrupt 2.12 +#define PIE_IER2_INTX13 0x1000U // Enable for Interrupt 2.13 +#define PIE_IER2_INTX14 0x2000U // Enable for Interrupt 2.14 +#define PIE_IER2_INTX15 0x4000U // Enable for Interrupt 2.15 +#define PIE_IER2_INTX16 0x8000U // Enable for Interrupt 2.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR2 register +// +//************************************************************************************************* +#define PIE_IFR2_INTX1 0x1U // Flag for Interrupt 2.1 +#define PIE_IFR2_INTX2 0x2U // Flag for Interrupt 2.2 +#define PIE_IFR2_INTX3 0x4U // Flag for Interrupt 2.3 +#define PIE_IFR2_INTX4 0x8U // Flag for Interrupt 2.4 +#define PIE_IFR2_INTX5 0x10U // Flag for Interrupt 2.5 +#define PIE_IFR2_INTX6 0x20U // Flag for Interrupt 2.6 +#define PIE_IFR2_INTX7 0x40U // Flag for Interrupt 2.7 +#define PIE_IFR2_INTX8 0x80U // Flag for Interrupt 2.8 +#define PIE_IFR2_INTX9 0x100U // Flag for Interrupt 2.9 +#define PIE_IFR2_INTX10 0x200U // Flag for Interrupt 2.10 +#define PIE_IFR2_INTX11 0x400U // Flag for Interrupt 2.11 +#define PIE_IFR2_INTX12 0x800U // Flag for Interrupt 2.12 +#define PIE_IFR2_INTX13 0x1000U // Flag for Interrupt 2.13 +#define PIE_IFR2_INTX14 0x2000U // Flag for Interrupt 2.14 +#define PIE_IFR2_INTX15 0x4000U // Flag for Interrupt 2.15 +#define PIE_IFR2_INTX16 0x8000U // Flag for Interrupt 2.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER3 register +// +//************************************************************************************************* +#define PIE_IER3_INTX1 0x1U // Enable for Interrupt 3.1 +#define PIE_IER3_INTX2 0x2U // Enable for Interrupt 3.2 +#define PIE_IER3_INTX3 0x4U // Enable for Interrupt 3.3 +#define PIE_IER3_INTX4 0x8U // Enable for Interrupt 3.4 +#define PIE_IER3_INTX5 0x10U // Enable for Interrupt 3.5 +#define PIE_IER3_INTX6 0x20U // Enable for Interrupt 3.6 +#define PIE_IER3_INTX7 0x40U // Enable for Interrupt 3.7 +#define PIE_IER3_INTX8 0x80U // Enable for Interrupt 3.8 +#define PIE_IER3_INTX9 0x100U // Enable for Interrupt 3.9 +#define PIE_IER3_INTX10 0x200U // Enable for Interrupt 3.10 +#define PIE_IER3_INTX11 0x400U // Enable for Interrupt 3.11 +#define PIE_IER3_INTX12 0x800U // Enable for Interrupt 3.12 +#define PIE_IER3_INTX13 0x1000U // Enable for Interrupt 3.13 +#define PIE_IER3_INTX14 0x2000U // Enable for Interrupt 3.14 +#define PIE_IER3_INTX15 0x4000U // Enable for Interrupt 3.15 +#define PIE_IER3_INTX16 0x8000U // Enable for Interrupt 3.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR3 register +// +//************************************************************************************************* +#define PIE_IFR3_INTX1 0x1U // Flag for Interrupt 3.1 +#define PIE_IFR3_INTX2 0x2U // Flag for Interrupt 3.2 +#define PIE_IFR3_INTX3 0x4U // Flag for Interrupt 3.3 +#define PIE_IFR3_INTX4 0x8U // Flag for Interrupt 3.4 +#define PIE_IFR3_INTX5 0x10U // Flag for Interrupt 3.5 +#define PIE_IFR3_INTX6 0x20U // Flag for Interrupt 3.6 +#define PIE_IFR3_INTX7 0x40U // Flag for Interrupt 3.7 +#define PIE_IFR3_INTX8 0x80U // Flag for Interrupt 3.8 +#define PIE_IFR3_INTX9 0x100U // Flag for Interrupt 3.9 +#define PIE_IFR3_INTX10 0x200U // Flag for Interrupt 3.10 +#define PIE_IFR3_INTX11 0x400U // Flag for Interrupt 3.11 +#define PIE_IFR3_INTX12 0x800U // Flag for Interrupt 3.12 +#define PIE_IFR3_INTX13 0x1000U // Flag for Interrupt 3.13 +#define PIE_IFR3_INTX14 0x2000U // Flag for Interrupt 3.14 +#define PIE_IFR3_INTX15 0x4000U // Flag for Interrupt 3.15 +#define PIE_IFR3_INTX16 0x8000U // Flag for Interrupt 3.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER4 register +// +//************************************************************************************************* +#define PIE_IER4_INTX1 0x1U // Enable for Interrupt 4.1 +#define PIE_IER4_INTX2 0x2U // Enable for Interrupt 4.2 +#define PIE_IER4_INTX3 0x4U // Enable for Interrupt 4.3 +#define PIE_IER4_INTX4 0x8U // Enable for Interrupt 4.4 +#define PIE_IER4_INTX5 0x10U // Enable for Interrupt 4.5 +#define PIE_IER4_INTX6 0x20U // Enable for Interrupt 4.6 +#define PIE_IER4_INTX7 0x40U // Enable for Interrupt 4.7 +#define PIE_IER4_INTX8 0x80U // Enable for Interrupt 4.8 +#define PIE_IER4_INTX9 0x100U // Enable for Interrupt 4.9 +#define PIE_IER4_INTX10 0x200U // Enable for Interrupt 4.10 +#define PIE_IER4_INTX11 0x400U // Enable for Interrupt 4.11 +#define PIE_IER4_INTX12 0x800U // Enable for Interrupt 4.12 +#define PIE_IER4_INTX13 0x1000U // Enable for Interrupt 4.13 +#define PIE_IER4_INTX14 0x2000U // Enable for Interrupt 4.14 +#define PIE_IER4_INTX15 0x4000U // Enable for Interrupt 4.15 +#define PIE_IER4_INTX16 0x8000U // Enable for Interrupt 4.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR4 register +// +//************************************************************************************************* +#define PIE_IFR4_INTX1 0x1U // Flag for Interrupt 4.1 +#define PIE_IFR4_INTX2 0x2U // Flag for Interrupt 4.2 +#define PIE_IFR4_INTX3 0x4U // Flag for Interrupt 4.3 +#define PIE_IFR4_INTX4 0x8U // Flag for Interrupt 4.4 +#define PIE_IFR4_INTX5 0x10U // Flag for Interrupt 4.5 +#define PIE_IFR4_INTX6 0x20U // Flag for Interrupt 4.6 +#define PIE_IFR4_INTX7 0x40U // Flag for Interrupt 4.7 +#define PIE_IFR4_INTX8 0x80U // Flag for Interrupt 4.8 +#define PIE_IFR4_INTX9 0x100U // Flag for Interrupt 4.9 +#define PIE_IFR4_INTX10 0x200U // Flag for Interrupt 4.10 +#define PIE_IFR4_INTX11 0x400U // Flag for Interrupt 4.11 +#define PIE_IFR4_INTX12 0x800U // Flag for Interrupt 4.12 +#define PIE_IFR4_INTX13 0x1000U // Flag for Interrupt 4.13 +#define PIE_IFR4_INTX14 0x2000U // Flag for Interrupt 4.14 +#define PIE_IFR4_INTX15 0x4000U // Flag for Interrupt 4.15 +#define PIE_IFR4_INTX16 0x8000U // Flag for Interrupt 4.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER5 register +// +//************************************************************************************************* +#define PIE_IER5_INTX1 0x1U // Enable for Interrupt 5.1 +#define PIE_IER5_INTX2 0x2U // Enable for Interrupt 5.2 +#define PIE_IER5_INTX3 0x4U // Enable for Interrupt 5.3 +#define PIE_IER5_INTX4 0x8U // Enable for Interrupt 5.4 +#define PIE_IER5_INTX5 0x10U // Enable for Interrupt 5.5 +#define PIE_IER5_INTX6 0x20U // Enable for Interrupt 5.6 +#define PIE_IER5_INTX7 0x40U // Enable for Interrupt 5.7 +#define PIE_IER5_INTX8 0x80U // Enable for Interrupt 5.8 +#define PIE_IER5_INTX9 0x100U // Enable for Interrupt 5.9 +#define PIE_IER5_INTX10 0x200U // Enable for Interrupt 5.10 +#define PIE_IER5_INTX11 0x400U // Enable for Interrupt 5.11 +#define PIE_IER5_INTX12 0x800U // Enable for Interrupt 5.12 +#define PIE_IER5_INTX13 0x1000U // Enable for Interrupt 5.13 +#define PIE_IER5_INTX14 0x2000U // Enable for Interrupt 5.14 +#define PIE_IER5_INTX15 0x4000U // Enable for Interrupt 5.15 +#define PIE_IER5_INTX16 0x8000U // Enable for Interrupt 5.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR5 register +// +//************************************************************************************************* +#define PIE_IFR5_INTX1 0x1U // Flag for Interrupt 5.1 +#define PIE_IFR5_INTX2 0x2U // Flag for Interrupt 5.2 +#define PIE_IFR5_INTX3 0x4U // Flag for Interrupt 5.3 +#define PIE_IFR5_INTX4 0x8U // Flag for Interrupt 5.4 +#define PIE_IFR5_INTX5 0x10U // Flag for Interrupt 5.5 +#define PIE_IFR5_INTX6 0x20U // Flag for Interrupt 5.6 +#define PIE_IFR5_INTX7 0x40U // Flag for Interrupt 5.7 +#define PIE_IFR5_INTX8 0x80U // Flag for Interrupt 5.8 +#define PIE_IFR5_INTX9 0x100U // Flag for Interrupt 5.9 +#define PIE_IFR5_INTX10 0x200U // Flag for Interrupt 5.10 +#define PIE_IFR5_INTX11 0x400U // Flag for Interrupt 5.11 +#define PIE_IFR5_INTX12 0x800U // Flag for Interrupt 5.12 +#define PIE_IFR5_INTX13 0x1000U // Flag for Interrupt 5.13 +#define PIE_IFR5_INTX14 0x2000U // Flag for Interrupt 5.14 +#define PIE_IFR5_INTX15 0x4000U // Flag for Interrupt 5.15 +#define PIE_IFR5_INTX16 0x8000U // Flag for Interrupt 5.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER6 register +// +//************************************************************************************************* +#define PIE_IER6_INTX1 0x1U // Enable for Interrupt 6.1 +#define PIE_IER6_INTX2 0x2U // Enable for Interrupt 6.2 +#define PIE_IER6_INTX3 0x4U // Enable for Interrupt 6.3 +#define PIE_IER6_INTX4 0x8U // Enable for Interrupt 6.4 +#define PIE_IER6_INTX5 0x10U // Enable for Interrupt 6.5 +#define PIE_IER6_INTX6 0x20U // Enable for Interrupt 6.6 +#define PIE_IER6_INTX7 0x40U // Enable for Interrupt 6.7 +#define PIE_IER6_INTX8 0x80U // Enable for Interrupt 6.8 +#define PIE_IER6_INTX9 0x100U // Enable for Interrupt 6.9 +#define PIE_IER6_INTX10 0x200U // Enable for Interrupt 6.10 +#define PIE_IER6_INTX11 0x400U // Enable for Interrupt 6.11 +#define PIE_IER6_INTX12 0x800U // Enable for Interrupt 6.12 +#define PIE_IER6_INTX13 0x1000U // Enable for Interrupt 6.13 +#define PIE_IER6_INTX14 0x2000U // Enable for Interrupt 6.14 +#define PIE_IER6_INTX15 0x4000U // Enable for Interrupt 6.15 +#define PIE_IER6_INTX16 0x8000U // Enable for Interrupt 6.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR6 register +// +//************************************************************************************************* +#define PIE_IFR6_INTX1 0x1U // Flag for Interrupt 6.1 +#define PIE_IFR6_INTX2 0x2U // Flag for Interrupt 6.2 +#define PIE_IFR6_INTX3 0x4U // Flag for Interrupt 6.3 +#define PIE_IFR6_INTX4 0x8U // Flag for Interrupt 6.4 +#define PIE_IFR6_INTX5 0x10U // Flag for Interrupt 6.5 +#define PIE_IFR6_INTX6 0x20U // Flag for Interrupt 6.6 +#define PIE_IFR6_INTX7 0x40U // Flag for Interrupt 6.7 +#define PIE_IFR6_INTX8 0x80U // Flag for Interrupt 6.8 +#define PIE_IFR6_INTX9 0x100U // Flag for Interrupt 6.9 +#define PIE_IFR6_INTX10 0x200U // Flag for Interrupt 6.10 +#define PIE_IFR6_INTX11 0x400U // Flag for Interrupt 6.11 +#define PIE_IFR6_INTX12 0x800U // Flag for Interrupt 6.12 +#define PIE_IFR6_INTX13 0x1000U // Flag for Interrupt 6.13 +#define PIE_IFR6_INTX14 0x2000U // Flag for Interrupt 6.14 +#define PIE_IFR6_INTX15 0x4000U // Flag for Interrupt 6.15 +#define PIE_IFR6_INTX16 0x8000U // Flag for Interrupt 6.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER7 register +// +//************************************************************************************************* +#define PIE_IER7_INTX1 0x1U // Enable for Interrupt 7.1 +#define PIE_IER7_INTX2 0x2U // Enable for Interrupt 7.2 +#define PIE_IER7_INTX3 0x4U // Enable for Interrupt 7.3 +#define PIE_IER7_INTX4 0x8U // Enable for Interrupt 7.4 +#define PIE_IER7_INTX5 0x10U // Enable for Interrupt 7.5 +#define PIE_IER7_INTX6 0x20U // Enable for Interrupt 7.6 +#define PIE_IER7_INTX7 0x40U // Enable for Interrupt 7.7 +#define PIE_IER7_INTX8 0x80U // Enable for Interrupt 7.8 +#define PIE_IER7_INTX9 0x100U // Enable for Interrupt 7.9 +#define PIE_IER7_INTX10 0x200U // Enable for Interrupt 7.10 +#define PIE_IER7_INTX11 0x400U // Enable for Interrupt 7.11 +#define PIE_IER7_INTX12 0x800U // Enable for Interrupt 7.12 +#define PIE_IER7_INTX13 0x1000U // Enable for Interrupt 7.13 +#define PIE_IER7_INTX14 0x2000U // Enable for Interrupt 7.14 +#define PIE_IER7_INTX15 0x4000U // Enable for Interrupt 7.15 +#define PIE_IER7_INTX16 0x8000U // Enable for Interrupt 7.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR7 register +// +//************************************************************************************************* +#define PIE_IFR7_INTX1 0x1U // Flag for Interrupt 7.1 +#define PIE_IFR7_INTX2 0x2U // Flag for Interrupt 7.2 +#define PIE_IFR7_INTX3 0x4U // Flag for Interrupt 7.3 +#define PIE_IFR7_INTX4 0x8U // Flag for Interrupt 7.4 +#define PIE_IFR7_INTX5 0x10U // Flag for Interrupt 7.5 +#define PIE_IFR7_INTX6 0x20U // Flag for Interrupt 7.6 +#define PIE_IFR7_INTX7 0x40U // Flag for Interrupt 7.7 +#define PIE_IFR7_INTX8 0x80U // Flag for Interrupt 7.8 +#define PIE_IFR7_INTX9 0x100U // Flag for Interrupt 7.9 +#define PIE_IFR7_INTX10 0x200U // Flag for Interrupt 7.10 +#define PIE_IFR7_INTX11 0x400U // Flag for Interrupt 7.11 +#define PIE_IFR7_INTX12 0x800U // Flag for Interrupt 7.12 +#define PIE_IFR7_INTX13 0x1000U // Flag for Interrupt 7.13 +#define PIE_IFR7_INTX14 0x2000U // Flag for Interrupt 7.14 +#define PIE_IFR7_INTX15 0x4000U // Flag for Interrupt 7.15 +#define PIE_IFR7_INTX16 0x8000U // Flag for Interrupt 7.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER8 register +// +//************************************************************************************************* +#define PIE_IER8_INTX1 0x1U // Enable for Interrupt 8.1 +#define PIE_IER8_INTX2 0x2U // Enable for Interrupt 8.2 +#define PIE_IER8_INTX3 0x4U // Enable for Interrupt 8.3 +#define PIE_IER8_INTX4 0x8U // Enable for Interrupt 8.4 +#define PIE_IER8_INTX5 0x10U // Enable for Interrupt 8.5 +#define PIE_IER8_INTX6 0x20U // Enable for Interrupt 8.6 +#define PIE_IER8_INTX7 0x40U // Enable for Interrupt 8.7 +#define PIE_IER8_INTX8 0x80U // Enable for Interrupt 8.8 +#define PIE_IER8_INTX9 0x100U // Enable for Interrupt 8.9 +#define PIE_IER8_INTX10 0x200U // Enable for Interrupt 8.10 +#define PIE_IER8_INTX11 0x400U // Enable for Interrupt 8.11 +#define PIE_IER8_INTX12 0x800U // Enable for Interrupt 8.12 +#define PIE_IER8_INTX13 0x1000U // Enable for Interrupt 8.13 +#define PIE_IER8_INTX14 0x2000U // Enable for Interrupt 8.14 +#define PIE_IER8_INTX15 0x4000U // Enable for Interrupt 8.15 +#define PIE_IER8_INTX16 0x8000U // Enable for Interrupt 8.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR8 register +// +//************************************************************************************************* +#define PIE_IFR8_INTX1 0x1U // Flag for Interrupt 8.1 +#define PIE_IFR8_INTX2 0x2U // Flag for Interrupt 8.2 +#define PIE_IFR8_INTX3 0x4U // Flag for Interrupt 8.3 +#define PIE_IFR8_INTX4 0x8U // Flag for Interrupt 8.4 +#define PIE_IFR8_INTX5 0x10U // Flag for Interrupt 8.5 +#define PIE_IFR8_INTX6 0x20U // Flag for Interrupt 8.6 +#define PIE_IFR8_INTX7 0x40U // Flag for Interrupt 8.7 +#define PIE_IFR8_INTX8 0x80U // Flag for Interrupt 8.8 +#define PIE_IFR8_INTX9 0x100U // Flag for Interrupt 8.9 +#define PIE_IFR8_INTX10 0x200U // Flag for Interrupt 8.10 +#define PIE_IFR8_INTX11 0x400U // Flag for Interrupt 8.11 +#define PIE_IFR8_INTX12 0x800U // Flag for Interrupt 8.12 +#define PIE_IFR8_INTX13 0x1000U // Flag for Interrupt 8.13 +#define PIE_IFR8_INTX14 0x2000U // Flag for Interrupt 8.14 +#define PIE_IFR8_INTX15 0x4000U // Flag for Interrupt 8.15 +#define PIE_IFR8_INTX16 0x8000U // Flag for Interrupt 8.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER9 register +// +//************************************************************************************************* +#define PIE_IER9_INTX1 0x1U // Enable for Interrupt 9.1 +#define PIE_IER9_INTX2 0x2U // Enable for Interrupt 9.2 +#define PIE_IER9_INTX3 0x4U // Enable for Interrupt 9.3 +#define PIE_IER9_INTX4 0x8U // Enable for Interrupt 9.4 +#define PIE_IER9_INTX5 0x10U // Enable for Interrupt 9.5 +#define PIE_IER9_INTX6 0x20U // Enable for Interrupt 9.6 +#define PIE_IER9_INTX7 0x40U // Enable for Interrupt 9.7 +#define PIE_IER9_INTX8 0x80U // Enable for Interrupt 9.8 +#define PIE_IER9_INTX9 0x100U // Enable for Interrupt 9.9 +#define PIE_IER9_INTX10 0x200U // Enable for Interrupt 9.10 +#define PIE_IER9_INTX11 0x400U // Enable for Interrupt 9.11 +#define PIE_IER9_INTX12 0x800U // Enable for Interrupt 9.12 +#define PIE_IER9_INTX13 0x1000U // Enable for Interrupt 9.13 +#define PIE_IER9_INTX14 0x2000U // Enable for Interrupt 9.14 +#define PIE_IER9_INTX15 0x4000U // Enable for Interrupt 9.15 +#define PIE_IER9_INTX16 0x8000U // Enable for Interrupt 9.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR9 register +// +//************************************************************************************************* +#define PIE_IFR9_INTX1 0x1U // Flag for Interrupt 9.1 +#define PIE_IFR9_INTX2 0x2U // Flag for Interrupt 9.2 +#define PIE_IFR9_INTX3 0x4U // Flag for Interrupt 9.3 +#define PIE_IFR9_INTX4 0x8U // Flag for Interrupt 9.4 +#define PIE_IFR9_INTX5 0x10U // Flag for Interrupt 9.5 +#define PIE_IFR9_INTX6 0x20U // Flag for Interrupt 9.6 +#define PIE_IFR9_INTX7 0x40U // Flag for Interrupt 9.7 +#define PIE_IFR9_INTX8 0x80U // Flag for Interrupt 9.8 +#define PIE_IFR9_INTX9 0x100U // Flag for Interrupt 9.9 +#define PIE_IFR9_INTX10 0x200U // Flag for Interrupt 9.10 +#define PIE_IFR9_INTX11 0x400U // Flag for Interrupt 9.11 +#define PIE_IFR9_INTX12 0x800U // Flag for Interrupt 9.12 +#define PIE_IFR9_INTX13 0x1000U // Flag for Interrupt 9.13 +#define PIE_IFR9_INTX14 0x2000U // Flag for Interrupt 9.14 +#define PIE_IFR9_INTX15 0x4000U // Flag for Interrupt 9.15 +#define PIE_IFR9_INTX16 0x8000U // Flag for Interrupt 9.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER10 register +// +//************************************************************************************************* +#define PIE_IER10_INTX1 0x1U // Enable for Interrupt 10.1 +#define PIE_IER10_INTX2 0x2U // Enable for Interrupt 10.2 +#define PIE_IER10_INTX3 0x4U // Enable for Interrupt 10.3 +#define PIE_IER10_INTX4 0x8U // Enable for Interrupt 10.4 +#define PIE_IER10_INTX5 0x10U // Enable for Interrupt 10.5 +#define PIE_IER10_INTX6 0x20U // Enable for Interrupt 10.6 +#define PIE_IER10_INTX7 0x40U // Enable for Interrupt 10.7 +#define PIE_IER10_INTX8 0x80U // Enable for Interrupt 10.8 +#define PIE_IER10_INTX9 0x100U // Enable for Interrupt 10.9 +#define PIE_IER10_INTX10 0x200U // Enable for Interrupt 10.10 +#define PIE_IER10_INTX11 0x400U // Enable for Interrupt 10.11 +#define PIE_IER10_INTX12 0x800U // Enable for Interrupt 10.12 +#define PIE_IER10_INTX13 0x1000U // Enable for Interrupt 10.13 +#define PIE_IER10_INTX14 0x2000U // Enable for Interrupt 10.14 +#define PIE_IER10_INTX15 0x4000U // Enable for Interrupt 10.15 +#define PIE_IER10_INTX16 0x8000U // Enable for Interrupt 10.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR10 register +// +//************************************************************************************************* +#define PIE_IFR10_INTX1 0x1U // Flag for Interrupt 10.1 +#define PIE_IFR10_INTX2 0x2U // Flag for Interrupt 10.2 +#define PIE_IFR10_INTX3 0x4U // Flag for Interrupt 10.3 +#define PIE_IFR10_INTX4 0x8U // Flag for Interrupt 10.4 +#define PIE_IFR10_INTX5 0x10U // Flag for Interrupt 10.5 +#define PIE_IFR10_INTX6 0x20U // Flag for Interrupt 10.6 +#define PIE_IFR10_INTX7 0x40U // Flag for Interrupt 10.7 +#define PIE_IFR10_INTX8 0x80U // Flag for Interrupt 10.8 +#define PIE_IFR10_INTX9 0x100U // Flag for Interrupt 10.9 +#define PIE_IFR10_INTX10 0x200U // Flag for Interrupt 10.10 +#define PIE_IFR10_INTX11 0x400U // Flag for Interrupt 10.11 +#define PIE_IFR10_INTX12 0x800U // Flag for Interrupt 10.12 +#define PIE_IFR10_INTX13 0x1000U // Flag for Interrupt 10.13 +#define PIE_IFR10_INTX14 0x2000U // Flag for Interrupt 10.14 +#define PIE_IFR10_INTX15 0x4000U // Flag for Interrupt 10.15 +#define PIE_IFR10_INTX16 0x8000U // Flag for Interrupt 10.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER11 register +// +//************************************************************************************************* +#define PIE_IER11_INTX1 0x1U // Enable for Interrupt 11.1 +#define PIE_IER11_INTX2 0x2U // Enable for Interrupt 11.2 +#define PIE_IER11_INTX3 0x4U // Enable for Interrupt 11.3 +#define PIE_IER11_INTX4 0x8U // Enable for Interrupt 11.4 +#define PIE_IER11_INTX5 0x10U // Enable for Interrupt 11.5 +#define PIE_IER11_INTX6 0x20U // Enable for Interrupt 11.6 +#define PIE_IER11_INTX7 0x40U // Enable for Interrupt 11.7 +#define PIE_IER11_INTX8 0x80U // Enable for Interrupt 11.8 +#define PIE_IER11_INTX9 0x100U // Enable for Interrupt 11.9 +#define PIE_IER11_INTX10 0x200U // Enable for Interrupt 11.10 +#define PIE_IER11_INTX11 0x400U // Enable for Interrupt 11.11 +#define PIE_IER11_INTX12 0x800U // Enable for Interrupt 11.12 +#define PIE_IER11_INTX13 0x1000U // Enable for Interrupt 11.13 +#define PIE_IER11_INTX14 0x2000U // Enable for Interrupt 11.14 +#define PIE_IER11_INTX15 0x4000U // Enable for Interrupt 11.15 +#define PIE_IER11_INTX16 0x8000U // Enable for Interrupt 11.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR11 register +// +//************************************************************************************************* +#define PIE_IFR11_INTX1 0x1U // Flag for Interrupt 11.1 +#define PIE_IFR11_INTX2 0x2U // Flag for Interrupt 11.2 +#define PIE_IFR11_INTX3 0x4U // Flag for Interrupt 11.3 +#define PIE_IFR11_INTX4 0x8U // Flag for Interrupt 11.4 +#define PIE_IFR11_INTX5 0x10U // Flag for Interrupt 11.5 +#define PIE_IFR11_INTX6 0x20U // Flag for Interrupt 11.6 +#define PIE_IFR11_INTX7 0x40U // Flag for Interrupt 11.7 +#define PIE_IFR11_INTX8 0x80U // Flag for Interrupt 11.8 +#define PIE_IFR11_INTX9 0x100U // Flag for Interrupt 11.9 +#define PIE_IFR11_INTX10 0x200U // Flag for Interrupt 11.10 +#define PIE_IFR11_INTX11 0x400U // Flag for Interrupt 11.11 +#define PIE_IFR11_INTX12 0x800U // Flag for Interrupt 11.12 +#define PIE_IFR11_INTX13 0x1000U // Flag for Interrupt 11.13 +#define PIE_IFR11_INTX14 0x2000U // Flag for Interrupt 11.14 +#define PIE_IFR11_INTX15 0x4000U // Flag for Interrupt 11.15 +#define PIE_IFR11_INTX16 0x8000U // Flag for Interrupt 11.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIER12 register +// +//************************************************************************************************* +#define PIE_IER12_INTX1 0x1U // Enable for Interrupt 12.1 +#define PIE_IER12_INTX2 0x2U // Enable for Interrupt 12.2 +#define PIE_IER12_INTX3 0x4U // Enable for Interrupt 12.3 +#define PIE_IER12_INTX4 0x8U // Enable for Interrupt 12.4 +#define PIE_IER12_INTX5 0x10U // Enable for Interrupt 12.5 +#define PIE_IER12_INTX6 0x20U // Enable for Interrupt 12.6 +#define PIE_IER12_INTX7 0x40U // Enable for Interrupt 12.7 +#define PIE_IER12_INTX8 0x80U // Enable for Interrupt 12.8 +#define PIE_IER12_INTX9 0x100U // Enable for Interrupt 12.9 +#define PIE_IER12_INTX10 0x200U // Enable for Interrupt 12.10 +#define PIE_IER12_INTX11 0x400U // Enable for Interrupt 12.11 +#define PIE_IER12_INTX12 0x800U // Enable for Interrupt 12.12 +#define PIE_IER12_INTX13 0x1000U // Enable for Interrupt 12.13 +#define PIE_IER12_INTX14 0x2000U // Enable for Interrupt 12.14 +#define PIE_IER12_INTX15 0x4000U // Enable for Interrupt 12.15 +#define PIE_IER12_INTX16 0x8000U // Enable for Interrupt 12.16 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEIFR12 register +// +//************************************************************************************************* +#define PIE_IFR12_INTX1 0x1U // Flag for Interrupt 12.1 +#define PIE_IFR12_INTX2 0x2U // Flag for Interrupt 12.2 +#define PIE_IFR12_INTX3 0x4U // Flag for Interrupt 12.3 +#define PIE_IFR12_INTX4 0x8U // Flag for Interrupt 12.4 +#define PIE_IFR12_INTX5 0x10U // Flag for Interrupt 12.5 +#define PIE_IFR12_INTX6 0x20U // Flag for Interrupt 12.6 +#define PIE_IFR12_INTX7 0x40U // Flag for Interrupt 12.7 +#define PIE_IFR12_INTX8 0x80U // Flag for Interrupt 12.8 +#define PIE_IFR12_INTX9 0x100U // Flag for Interrupt 12.9 +#define PIE_IFR12_INTX10 0x200U // Flag for Interrupt 12.10 +#define PIE_IFR12_INTX11 0x400U // Flag for Interrupt 12.11 +#define PIE_IFR12_INTX12 0x800U // Flag for Interrupt 12.12 +#define PIE_IFR12_INTX13 0x1000U // Flag for Interrupt 12.13 +#define PIE_IFR12_INTX14 0x2000U // Flag for Interrupt 12.14 +#define PIE_IFR12_INTX15 0x4000U // Flag for Interrupt 12.15 +#define PIE_IFR12_INTX16 0x8000U // Flag for Interrupt 12.16 + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_sci.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sci.h new file mode 100644 index 0000000..2fc9680 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sci.h @@ -0,0 +1,209 @@ +//########################################################################### +// +// FILE: hw_sci.h +// +// TITLE: Definitions for the SCI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SCI_H +#define HW_SCI_H + +//************************************************************************************************* +// +// The following are defines for the SCI register offsets +// +//************************************************************************************************* +#define SCI_O_CCR 0x0U // Communications control register +#define SCI_O_CTL1 0x1U // Control register 1 +#define SCI_O_HBAUD 0x2U // Baud rate (high) register +#define SCI_O_LBAUD 0x3U // Baud rate (low) register +#define SCI_O_CTL2 0x4U // Control register 2 +#define SCI_O_RXST 0x5U // Receive status register +#define SCI_O_RXEMU 0x6U // Receive emulation buffer register +#define SCI_O_RXBUF 0x7U // Receive data buffer +#define SCI_O_TXBUF 0x9U // Transmit data buffer +#define SCI_O_FFTX 0xAU // FIFO transmit register +#define SCI_O_FFRX 0xBU // FIFO receive register +#define SCI_O_FFCT 0xCU // FIFO control register +#define SCI_O_PRI 0xFU // SCI priority control + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICCR register +// +//************************************************************************************************* +#define SCI_CCR_SCICHAR_S 0U +#define SCI_CCR_SCICHAR_M 0x7U // Character length control +#define SCI_CCR_ADDRIDLE_MODE 0x8U // ADDR/IDLE Mode control +#define SCI_CCR_LOOPBKENA 0x10U // Loop Back enable +#define SCI_CCR_PARITYENA 0x20U // Parity enable +#define SCI_CCR_PARITY 0x40U // Even or Odd Parity +#define SCI_CCR_STOPBITS 0x80U // Number of Stop Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICTL1 register +// +//************************************************************************************************* +#define SCI_CTL1_RXENA 0x1U // SCI receiver enable +#define SCI_CTL1_TXENA 0x2U // SCI transmitter enable +#define SCI_CTL1_SLEEP 0x4U // SCI sleep +#define SCI_CTL1_TXWAKE 0x8U // Transmitter wakeup method +#define SCI_CTL1_SWRESET 0x20U // Software reset +#define SCI_CTL1_RXERRINTENA 0x40U // Receive error interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIHBAUD register +// +//************************************************************************************************* +#define SCI_HBAUD_BAUD_S 0U +#define SCI_HBAUD_BAUD_M 0xFFU // SCI 16-bit baud selection Registers SCIHBAUD + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCILBAUD register +// +//************************************************************************************************* +#define SCI_LBAUD_BAUD_S 0U +#define SCI_LBAUD_BAUD_M 0xFFU // SCI 16-bit baud selection Registers SCILBAUD + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCICTL2 register +// +//************************************************************************************************* +#define SCI_CTL2_TXINTENA 0x1U // Transmit __interrupt enable +#define SCI_CTL2_RXBKINTENA 0x2U // Receiver-buffer break enable +#define SCI_CTL2_TXEMPTY 0x40U // Transmitter empty flag +#define SCI_CTL2_TXRDY 0x80U // Transmitter ready flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXST register +// +//************************************************************************************************* +#define SCI_RXST_RXWAKE 0x2U // Receiver wakeup detect flag +#define SCI_RXST_PE 0x4U // Parity error flag +#define SCI_RXST_OE 0x8U // Overrun error flag +#define SCI_RXST_FE 0x10U // Framing error flag +#define SCI_RXST_BRKDT 0x20U // Break-detect flag +#define SCI_RXST_RXRDY 0x40U // Receiver ready flag +#define SCI_RXST_RXERROR 0x80U // Receiver error flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXEMU register +// +//************************************************************************************************* +#define SCI_RXEMU_ERXDT_S 0U +#define SCI_RXEMU_ERXDT_M 0xFFU // Receive emulation buffer data + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIRXBUF register +// +//************************************************************************************************* +#define SCI_RXBUF_SAR_S 0U +#define SCI_RXBUF_SAR_M 0xFFU // Receive Character bits +#define SCI_RXBUF_SCIFFPE 0x4000U // Receiver error flag +#define SCI_RXBUF_SCIFFFE 0x8000U // Receiver error flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCITXBUF register +// +//************************************************************************************************* +#define SCI_TXBUF_TXDT_S 0U +#define SCI_TXBUF_TXDT_M 0xFFU // Transmit data buffer + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFTX register +// +//************************************************************************************************* +#define SCI_FFTX_TXFFIL_S 0U +#define SCI_FFTX_TXFFIL_M 0x1FU // Interrupt level +#define SCI_FFTX_TXFFIENA 0x20U // Interrupt enable +#define SCI_FFTX_TXFFINTCLR 0x40U // Clear INT flag +#define SCI_FFTX_TXFFINT 0x80U // INT flag +#define SCI_FFTX_TXFFST_S 8U +#define SCI_FFTX_TXFFST_M 0x1F00U // FIFO status +#define SCI_FFTX_TXFIFORESET 0x2000U // FIFO reset +#define SCI_FFTX_SCIFFENA 0x4000U // Enhancement enable +#define SCI_FFTX_SCIRST 0x8000U // SCI reset rx/tx channels + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFRX register +// +//************************************************************************************************* +#define SCI_FFRX_RXFFIL_S 0U +#define SCI_FFRX_RXFFIL_M 0x1FU // Interrupt level +#define SCI_FFRX_RXFFIENA 0x20U // Interrupt enable +#define SCI_FFRX_RXFFINTCLR 0x40U // Clear INT flag +#define SCI_FFRX_RXFFINT 0x80U // INT flag +#define SCI_FFRX_RXFFST_S 8U +#define SCI_FFRX_RXFFST_M 0x1F00U // FIFO status +#define SCI_FFRX_RXFIFORESET 0x2000U // FIFO reset +#define SCI_FFRX_RXFFOVRCLR 0x4000U // Clear overflow +#define SCI_FFRX_RXFFOVF 0x8000U // FIFO overflow + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIFFCT register +// +//************************************************************************************************* +#define SCI_FFCT_FFTXDLY_S 0U +#define SCI_FFCT_FFTXDLY_M 0xFFU // FIFO transmit delay +#define SCI_FFCT_CDC 0x2000U // Auto baud mode enable +#define SCI_FFCT_ABDCLR 0x4000U // Auto baud clear +#define SCI_FFCT_ABD 0x8000U // Auto baud detect + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCIPRI register +// +//************************************************************************************************* +#define SCI_PRI_FREESOFT_S 3U +#define SCI_PRI_FREESOFT_M 0x18U // Emulation modes + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_sdfm.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sdfm.h new file mode 100644 index 0000000..d2ba146 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sdfm.h @@ -0,0 +1,431 @@ +//########################################################################### +// +// FILE: hw_sdfm.h +// +// TITLE: Definitions for the SDFM registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SDFM_H +#define HW_SDFM_H + +//************************************************************************************************* +// +// The following are defines for the SDFM register offsets +// +//************************************************************************************************* +#define SDFM_O_SDIFLG 0x0U // Interrupt Flag Register +#define SDFM_O_SDIFLGCLR 0x2U // Interrupt Flag Clear Register +#define SDFM_O_SDCTL 0x4U // SD Control Register +#define SDFM_O_SDMFILEN 0x6U // SD Master Filter Enable +#define SDFM_O_SDCTLPARM1 0x10U // Control Parameter Register for Ch1 +#define SDFM_O_SDDFPARM1 0x11U // Data Filter Parameter Register for Ch1 +#define SDFM_O_SDDPARM1 0x12U // Integer Parameter Register for Ch1 +#define SDFM_O_SDCMPH1 0x13U // High-level Threshold Register for Ch1 +#define SDFM_O_SDCMPL1 0x14U // Low-level Threshold Register for Ch1 +#define SDFM_O_SDCPARM1 0x15U // Comparator Parameter Register for Ch1 +#define SDFM_O_SDDATA1 0x16U // Filter Data Register (16 or 32bit) for Ch1 +#define SDFM_O_SDCTLPARM2 0x20U // Control Parameter Register for Ch2 +#define SDFM_O_SDDFPARM2 0x21U // Data Filter Parameter Register for Ch2 +#define SDFM_O_SDDPARM2 0x22U // Integer Parameter Register for Ch2 +#define SDFM_O_SDCMPH2 0x23U // High-level Threshold Register for Ch2 +#define SDFM_O_SDCMPL2 0x24U // Low-level Threshold Register for Ch2 +#define SDFM_O_SDCPARM2 0x25U // Comparator Parameter Register for Ch2 +#define SDFM_O_SDDATA2 0x26U // Filter Data Register (16 or 32bit) for Ch2 +#define SDFM_O_SDCTLPARM3 0x30U // Control Parameter Register for Ch3 +#define SDFM_O_SDDFPARM3 0x31U // Data Filter Parameter Register for Ch3 +#define SDFM_O_SDDPARM3 0x32U // Integer Parameter Register for Ch3 +#define SDFM_O_SDCMPH3 0x33U // High-level Threshold Register for Ch3 +#define SDFM_O_SDCMPL3 0x34U // Low-level Threshold Register for Ch3 +#define SDFM_O_SDCPARM3 0x35U // Comparator Parameter Register for Ch3 +#define SDFM_O_SDDATA3 0x36U // Filter Data Register (16 or 32bit) for Ch3 +#define SDFM_O_SDCTLPARM4 0x40U // Control Parameter Register for Ch4 +#define SDFM_O_SDDFPARM4 0x41U // Data Filter Parameter Register for Ch4 +#define SDFM_O_SDDPARM4 0x42U // Integer Parameter Register for Ch4 +#define SDFM_O_SDCMPH4 0x43U // High-level Threshold Register for Ch4 +#define SDFM_O_SDCMPL4 0x44U // Low-level Threshold Register for Ch4 +#define SDFM_O_SDCPARM4 0x45U // Comparator Parameter Register for Ch4 +#define SDFM_O_SDDATA4 0x46U // Filter Data Register (16 or 32bit) for Ch4 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDIFLG register +// +//************************************************************************************************* +#define SDFM_SDIFLG_IFH1 0x1U // High-level Interrupt flag Filter 1 +#define SDFM_SDIFLG_IFL1 0x2U // Low-Level Interrupt flag Filter 1 +#define SDFM_SDIFLG_IFH2 0x4U // High-level Interrupt flag Filter 2 +#define SDFM_SDIFLG_IFL2 0x8U // Low-Level Interrupt flag Filter 2 +#define SDFM_SDIFLG_IFH3 0x10U // High-level Interrupt flag Filter 3 +#define SDFM_SDIFLG_IFL3 0x20U // Low-Level Interrupt flag Filter 3 +#define SDFM_SDIFLG_IFH4 0x40U // High-level Interrupt flag Filter 4 +#define SDFM_SDIFLG_IFL4 0x80U // Low-Level Interrupt flag Filter 4 +#define SDFM_SDIFLG_MF1 0x100U // Modulator Failure for Filter 1 +#define SDFM_SDIFLG_MF2 0x200U // Modulator Failure for Filter 2 +#define SDFM_SDIFLG_MF3 0x400U // Modulator Failure for Filter 3 +#define SDFM_SDIFLG_MF4 0x800U // Modulator Failure for Filter 4 +#define SDFM_SDIFLG_AF1 0x1000U // Acknowledge flag for Filter 1 +#define SDFM_SDIFLG_AF2 0x2000U // Acknowledge flag for Filter 2 +#define SDFM_SDIFLG_AF3 0x4000U // Acknowledge flag for Filter 3 +#define SDFM_SDIFLG_AF4 0x8000U // Acknowledge flag for Filter 4 +#define SDFM_SDIFLG_MIF 0x80000000U // Master Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDIFLGCLR register +// +//************************************************************************************************* +#define SDFM_SDIFLGCLR_IFH1 0x1U // High-level Interrupt flag Filter 1 +#define SDFM_SDIFLGCLR_IFL1 0x2U // Low-Level Interrupt flag Filter 1 +#define SDFM_SDIFLGCLR_IFH2 0x4U // High-level Interrupt flag Filter 2 +#define SDFM_SDIFLGCLR_IFL2 0x8U // Low-Level Interrupt flag Filter 2 +#define SDFM_SDIFLGCLR_IFH3 0x10U // High-level Interrupt flag Filter 3 +#define SDFM_SDIFLGCLR_IFL3 0x20U // Low-Level Interrupt flag Filter 3 +#define SDFM_SDIFLGCLR_IFH4 0x40U // High-level Interrupt flag Filter 4 +#define SDFM_SDIFLGCLR_IFL4 0x80U // Low-Level Interrupt flag Filter 4 +#define SDFM_SDIFLGCLR_MF1 0x100U // Modulator Failure for Filter 1 +#define SDFM_SDIFLGCLR_MF2 0x200U // Modulator Failure for Filter 2 +#define SDFM_SDIFLGCLR_MF3 0x400U // Modulator Failure for Filter 3 +#define SDFM_SDIFLGCLR_MF4 0x800U // Modulator Failure for Filter 4 +#define SDFM_SDIFLGCLR_AF1 0x1000U // Acknowledge flag for Filter 1 +#define SDFM_SDIFLGCLR_AF2 0x2000U // Acknowledge flag for Filter 2 +#define SDFM_SDIFLGCLR_AF3 0x4000U // Acknowledge flag for Filter 3 +#define SDFM_SDIFLGCLR_AF4 0x8000U // Acknowledge flag for Filter 4 +#define SDFM_SDIFLGCLR_MIF 0x80000000U // Master Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTL register +// +//************************************************************************************************* +#define SDFM_SDCTL_MIE 0x2000U // Master Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDMFILEN register +// +//************************************************************************************************* +#define SDFM_SDMFILEN_MFE 0x800U // Master Filter Enable. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM1 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM1_MOD_S 0U +#define SDFM_SDCTLPARM1_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM1 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM1_DOSR_S 0U +#define SDFM_SDDFPARM1_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM1_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM1_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM1_SST_S 10U +#define SDFM_SDDFPARM1_SST_M 0xC00U // Data Filter Structure (DataFast/1/2/3) +#define SDFM_SDDFPARM1_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM1 register +// +//************************************************************************************************* +#define SDFM_SDDPARM1_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM1_SH_S 11U +#define SDFM_SDDPARM1_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH1 register +// +//************************************************************************************************* +#define SDFM_SDCMPH1_HLT_S 0U +#define SDFM_SDCMPH1_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL1 register +// +//************************************************************************************************* +#define SDFM_SDCMPL1_LLT_S 0U +#define SDFM_SDCMPL1_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM1 register +// +//************************************************************************************************* +#define SDFM_SDCPARM1_COSR_S 0U +#define SDFM_SDCPARM1_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM1_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM1_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM1_CS1_CS0_S 7U +#define SDFM_SDCPARM1_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM1_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA1 register +// +//************************************************************************************************* +#define SDFM_SDDATA1_DATA16_S 0U +#define SDFM_SDDATA1_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA1_DATA32HI_S 16U +#define SDFM_SDDATA1_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM2 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM2_MOD_S 0U +#define SDFM_SDCTLPARM2_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM2 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM2_DOSR_S 0U +#define SDFM_SDDFPARM2_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM2_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM2_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM2_SST_S 10U +#define SDFM_SDDFPARM2_SST_M 0xC00U // Data Filter Structure (SincFast/1/2/3) +#define SDFM_SDDFPARM2_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM2 register +// +//************************************************************************************************* +#define SDFM_SDDPARM2_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM2_SH_S 11U +#define SDFM_SDDPARM2_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH2 register +// +//************************************************************************************************* +#define SDFM_SDCMPH2_HLT_S 0U +#define SDFM_SDCMPH2_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL2 register +// +//************************************************************************************************* +#define SDFM_SDCMPL2_LLT_S 0U +#define SDFM_SDCMPL2_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM2 register +// +//************************************************************************************************* +#define SDFM_SDCPARM2_COSR_S 0U +#define SDFM_SDCPARM2_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM2_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM2_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM2_CS1_CS0_S 7U +#define SDFM_SDCPARM2_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM2_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA2 register +// +//************************************************************************************************* +#define SDFM_SDDATA2_DATA16_S 0U +#define SDFM_SDDATA2_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA2_DATA32HI_S 16U +#define SDFM_SDDATA2_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM3 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM3_MOD_S 0U +#define SDFM_SDCTLPARM3_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM3 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM3_DOSR_S 0U +#define SDFM_SDDFPARM3_DOSR_M 0xFFU // Data Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM3_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM3_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM3_SST_S 10U +#define SDFM_SDDFPARM3_SST_M 0xC00U // Data filter structure (SincFast/1/2/3) +#define SDFM_SDDFPARM3_SDSYNCEN 0x1000U // Data FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM3 register +// +//************************************************************************************************* +#define SDFM_SDDPARM3_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM3_SH_S 11U +#define SDFM_SDDPARM3_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH3 register +// +//************************************************************************************************* +#define SDFM_SDCMPH3_HLT_S 0U +#define SDFM_SDCMPH3_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL3 register +// +//************************************************************************************************* +#define SDFM_SDCMPL3_LLT_S 0U +#define SDFM_SDCMPL3_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM3 register +// +//************************************************************************************************* +#define SDFM_SDCPARM3_COSR_S 0U +#define SDFM_SDCPARM3_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM3_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM3_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM3_CS1_CS0_S 7U +#define SDFM_SDCPARM3_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM3_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA3 register +// +//************************************************************************************************* +#define SDFM_SDDATA3_DATA16_S 0U +#define SDFM_SDDATA3_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA3_DATA32HI_S 16U +#define SDFM_SDDATA3_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCTLPARM4 register +// +//************************************************************************************************* +#define SDFM_SDCTLPARM4_MOD_S 0U +#define SDFM_SDCTLPARM4_MOD_M 0x3U // Delta-Sigma Modulator mode + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDFPARM4 register +// +//************************************************************************************************* +#define SDFM_SDDFPARM4_DOSR_S 0U +#define SDFM_SDDFPARM4_DOSR_M 0xFFU // SINC Filter Oversample Ratio= DOSR+1 +#define SDFM_SDDFPARM4_FEN 0x100U // Filter Enable +#define SDFM_SDDFPARM4_AE 0x200U // Ack Enable +#define SDFM_SDDFPARM4_SST_S 10U +#define SDFM_SDDFPARM4_SST_M 0xC00U // Data filter structure (SincFast/1/2/3) +#define SDFM_SDDFPARM4_SDSYNCEN 0x1000U // SINC FILTER Reset Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDPARM4 register +// +//************************************************************************************************* +#define SDFM_SDDPARM4_DR 0x400U // Data Representation (0/1 = 16/32b 2's complement) +#define SDFM_SDDPARM4_SH_S 11U +#define SDFM_SDDPARM4_SH_M 0xF800U // Shift Control (# bits to shift in 16b mode) + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPH4 register +// +//************************************************************************************************* +#define SDFM_SDCMPH4_HLT_S 0U +#define SDFM_SDCMPH4_HLT_M 0x7FFFU // High-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCMPL4 register +// +//************************************************************************************************* +#define SDFM_SDCMPL4_LLT_S 0U +#define SDFM_SDCMPL4_LLT_M 0x7FFFU // Low-level threshold for the comparator filter output. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDCPARM4 register +// +//************************************************************************************************* +#define SDFM_SDCPARM4_COSR_S 0U +#define SDFM_SDCPARM4_COSR_M 0x1FU // Comparator Oversample Ratio = COSR + 1 +#define SDFM_SDCPARM4_IEH 0x20U // High-level interrupt enable +#define SDFM_SDCPARM4_IEL 0x40U // Low-level interrupt enable +#define SDFM_SDCPARM4_CS1_CS0_S 7U +#define SDFM_SDCPARM4_CS1_CS0_M 0x180U // Comparator filter structure + // (Sincfast/Sinc1/Sinc2/Sinc3 +#define SDFM_SDCPARM4_MFIE 0x200U // Modulator Failure Interrupt enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SDDATA4 register +// +//************************************************************************************************* +#define SDFM_SDDATA4_DATA16_S 0U +#define SDFM_SDDATA4_DATA16_M 0xFFFFU // 16-bit Data in 16b mode, Lo-order 16b in 32b + // mode +#define SDFM_SDDATA4_DATA32HI_S 16U +#define SDFM_SDDATA4_DATA32HI_M 0xFFFF0000U // Hi-order 16b in 32b mode + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_spi.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_spi.h new file mode 100644 index 0000000..c4907aa --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_spi.h @@ -0,0 +1,157 @@ +//########################################################################### +// +// FILE: hw_spi.h +// +// TITLE: Definitions for the SPI registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SPI_H +#define HW_SPI_H + +//************************************************************************************************* +// +// The following are defines for the SPI register offsets +// +//************************************************************************************************* +#define SPI_O_CCR 0x0U // SPI Configuration Control Register +#define SPI_O_CTL 0x1U // SPI Operation Control Register +#define SPI_O_STS 0x2U // SPI Status Register +#define SPI_O_BRR 0x4U // SPI Baud Rate Register +#define SPI_O_RXEMU 0x6U // SPI Emulation Buffer Register +#define SPI_O_RXBUF 0x7U // SPI Serial Input Buffer Register +#define SPI_O_TXBUF 0x8U // SPI Serial Output Buffer Register +#define SPI_O_DAT 0x9U // SPI Serial Data Register +#define SPI_O_FFTX 0xAU // SPI FIFO Transmit Register +#define SPI_O_FFRX 0xBU // SPI FIFO Receive Register +#define SPI_O_FFCT 0xCU // SPI FIFO Control Register +#define SPI_O_PRI 0xFU // SPI Priority Control Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPICCR register +// +//************************************************************************************************* +#define SPI_CCR_SPICHAR_S 0U +#define SPI_CCR_SPICHAR_M 0xFU // Character Length Control +#define SPI_CCR_SPILBK 0x10U // SPI Loopback +#define SPI_CCR_HS_MODE 0x20U // High Speed mode control +#define SPI_CCR_CLKPOLARITY 0x40U // Shift Clock Polarity +#define SPI_CCR_SPISWRESET 0x80U // SPI Software Reset + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPICTL register +// +//************************************************************************************************* +#define SPI_CTL_SPIINTENA 0x1U // SPI Interupt Enable +#define SPI_CTL_TALK 0x2U // Master/Slave Transmit Enable +#define SPI_CTL_MASTER_SLAVE 0x4U // SPI Network Mode Control +#define SPI_CTL_CLK_PHASE 0x8U // SPI Clock Phase +#define SPI_CTL_OVERRUNINTENA 0x10U // Overrun Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPISTS register +// +//************************************************************************************************* +#define SPI_STS_BUFFULL_FLAG 0x20U // SPI Transmit Buffer Full Flag +#define SPI_STS_INT_FLAG 0x40U // SPI Interrupt Flag +#define SPI_STS_OVERRUN_FLAG 0x80U // SPI Receiver Overrun Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIBRR register +// +//************************************************************************************************* +#define SPI_BRR_SPI_BIT_RATE_S 0U +#define SPI_BRR_SPI_BIT_RATE_M 0x7FU // SPI Bit Rate Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFTX register +// +//************************************************************************************************* +#define SPI_FFTX_TXFFIL_S 0U +#define SPI_FFTX_TXFFIL_M 0x1FU // TXFIFO Interrupt Level +#define SPI_FFTX_TXFFIENA 0x20U // TXFIFO Interrupt Enable +#define SPI_FFTX_TXFFINTCLR 0x40U // TXFIFO Interrupt Clear +#define SPI_FFTX_TXFFINT 0x80U // TXFIFO Interrupt Flag +#define SPI_FFTX_TXFFST_S 8U +#define SPI_FFTX_TXFFST_M 0x1F00U // Transmit FIFO Status +#define SPI_FFTX_TXFIFO 0x2000U // TXFIFO Reset +#define SPI_FFTX_SPIFFENA 0x4000U // FIFO Enhancements Enable +#define SPI_FFTX_SPIRST 0x8000U // SPI Reset + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFRX register +// +//************************************************************************************************* +#define SPI_FFRX_RXFFIL_S 0U +#define SPI_FFRX_RXFFIL_M 0x1FU // RXFIFO Interrupt Level +#define SPI_FFRX_RXFFIENA 0x20U // RXFIFO Interrupt Enable +#define SPI_FFRX_RXFFINTCLR 0x40U // RXFIFO Interupt Clear +#define SPI_FFRX_RXFFINT 0x80U // RXFIFO Interrupt Flag +#define SPI_FFRX_RXFFST_S 8U +#define SPI_FFRX_RXFFST_M 0x1F00U // Receive FIFO Status +#define SPI_FFRX_RXFIFORESET 0x2000U // RXFIFO Reset +#define SPI_FFRX_RXFFOVFCLR 0x4000U // Receive FIFO Overflow Clear +#define SPI_FFRX_RXFFOVF 0x8000U // Receive FIFO Overflow Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIFFCT register +// +//************************************************************************************************* +#define SPI_FFCT_TXDLY_S 0U +#define SPI_FFCT_TXDLY_M 0xFFU // FIFO Transmit Delay Bits + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SPIPRI register +// +//************************************************************************************************* +#define SPI_PRI_TRIWIRE 0x1U // 3-wire mode select bit +#define SPI_PRI_STEINV 0x2U // SPISTE inversion bit +#define SPI_PRI_FREE 0x10U // Free emulation mode +#define SPI_PRI_SOFT 0x20U // Soft emulation mode + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_sysctl.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sysctl.h new file mode 100644 index 0000000..11df8d3 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_sysctl.h @@ -0,0 +1,1428 @@ +//########################################################################### +// +// FILE: hw_sysctl.h +// +// TITLE: Definitions for the SYSCTL registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_SYSCTL_H +#define HW_SYSCTL_H + +//************************************************************************************************* +// +// The following are defines for the SYSCTL register offsets +// +//************************************************************************************************* +#define SYSCTL_O_DEVCFGLOCK1 0x0U // Lock bit for CPUSELx registers +#define SYSCTL_O_PARTIDL 0x8U // Lower 32-bit of Device PART Identification Number +#define SYSCTL_O_PARTIDH 0xAU // Upper 32-bit of Device PART Identification Number +#define SYSCTL_O_REVID 0xCU // Device Revision Number +#define SYSCTL_O_DC0 0x10U // Device Capability: Device Information +#define SYSCTL_O_DC1 0x12U // Device Capability: Processing Block Customization +#define SYSCTL_O_DC2 0x14U // Device Capability: EMIF Customization +#define SYSCTL_O_DC3 0x16U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC4 0x18U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC5 0x1AU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC6 0x1CU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC7 0x1EU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC8 0x20U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC9 0x22U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC10 0x24U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC11 0x26U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC12 0x28U // Device Capability: Peripheral Customization +#define SYSCTL_O_DC13 0x2AU // Device Capability: Peripheral Customization +#define SYSCTL_O_DC14 0x2CU // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC15 0x2EU // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC17 0x32U // Device Capability: Analog Modules Customization +#define SYSCTL_O_DC18 0x34U // Device Capability: CPU1 Lx SRAM Customization +#define SYSCTL_O_DC19 0x36U // Device Capability: CPU2 Lx SRAM Customization +#define SYSCTL_O_DC20 0x38U // Device Capability: GSx SRAM Customization +#define SYSCTL_O_PERCNF1 0x60U // Peripheral Configuration register +#define SYSCTL_O_FUSEERR 0x74U // e-Fuse error Status register +#define SYSCTL_O_SOFTPRES0 0x82U // Processing Block Software Reset register +#define SYSCTL_O_SOFTPRES1 0x84U // EMIF Software Reset register +#define SYSCTL_O_SOFTPRES2 0x86U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES3 0x88U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES4 0x8AU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES6 0x8EU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES7 0x90U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES8 0x92U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES9 0x94U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES11 0x98U // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES13 0x9CU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES14 0x9EU // Peripheral Software Reset register +#define SYSCTL_O_SOFTPRES16 0xA2U // Peripheral Software Reset register +#define SYSCTL_O_CPUSEL0 0xD6U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL1 0xD8U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL2 0xDAU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL4 0xDEU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL5 0xE0U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL6 0xE2U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL7 0xE4U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL8 0xE6U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL9 0xE8U // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL11 0xECU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL12 0xEEU // CPU Select register for common peripherals +#define SYSCTL_O_CPUSEL14 0xF2U // CPU Select register for common peripherals +#define SYSCTL_O_CPU2RESCTL 0x122U // CPU2 Reset Control Register +#define SYSCTL_O_RSTSTAT 0x124U // Reset Status register for secondary C28x CPUs +#define SYSCTL_O_LPMSTAT 0x125U // LPM Status Register for secondary C28x CPUs +#define SYSCTL_O_SYSDBGCTL 0x12CU // System Debug Control register + +#define SYSCTL_O_CLKSEM 0x0U // Clock Control Semaphore Register +#define SYSCTL_O_CLKCFGLOCK1 0x2U // Lock bit for CLKCFG registers +#define SYSCTL_O_CLKSRCCTL1 0x8U // Clock Source Control register-1 +#define SYSCTL_O_CLKSRCCTL2 0xAU // Clock Source Control register-2 +#define SYSCTL_O_CLKSRCCTL3 0xCU // Clock Source Control register-3 +#define SYSCTL_O_SYSPLLCTL1 0xEU // SYSPLL Control register-1 +#define SYSCTL_O_SYSPLLMULT 0x14U // SYSPLL Multiplier register +#define SYSCTL_O_SYSPLLSTS 0x16U // SYSPLL Status register +#define SYSCTL_O_AUXPLLCTL1 0x18U // AUXPLL Control register-1 +#define SYSCTL_O_AUXPLLMULT 0x1EU // AUXPLL Multiplier register +#define SYSCTL_O_AUXPLLSTS 0x20U // AUXPLL Status register +#define SYSCTL_O_SYSCLKDIVSEL 0x22U // System Clock Divider Select register +#define SYSCTL_O_AUXCLKDIVSEL 0x24U // Auxillary Clock Divider Select register +#define SYSCTL_O_PERCLKDIVSEL 0x26U // Peripheral Clock Divider Selet register +#define SYSCTL_O_XCLKOUTDIVSEL 0x28U // XCLKOUT Divider Select register +#define SYSCTL_O_LOSPCP 0x2CU // Low Speed Clock Source Prescalar +#define SYSCTL_O_MCDCR 0x2EU // Missing Clock Detect Control Register +#define SYSCTL_O_X1CNT 0x30U // 10-bit Counter on X1 Clock + +#define SYSCTL_O_CPUSYSLOCK1 0x0U // Lock bit for CPUSYS registers +#define SYSCTL_O_HIBBOOTMODE 0x6U // HIB Boot Mode Register +#define SYSCTL_O_IORESTOREADDR 0x8U // IORestore() routine Address Register +#define SYSCTL_O_PIEVERRADDR 0xAU // PIE Vector Fetch Error Address register +#define SYSCTL_O_PCLKCR0 0x22U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR1 0x24U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR2 0x26U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR3 0x28U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR4 0x2AU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR6 0x2EU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR7 0x30U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR8 0x32U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR9 0x34U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR10 0x36U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR11 0x38U // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR12 0x3AU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR13 0x3CU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR14 0x3EU // Peripheral Clock Gating Registers +#define SYSCTL_O_PCLKCR16 0x42U // Peripheral Clock Gating Registers +#define SYSCTL_O_SECMSEL 0x74U // Secondary Master Select register for common + // peripherals: Selects between CLA & DMA +#define SYSCTL_O_LPMCR 0x76U // LPM Control Register +#define SYSCTL_O_GPIOLPMSEL0 0x78U // GPIO LPM Wakeup select registers +#define SYSCTL_O_GPIOLPMSEL1 0x7AU // GPIO LPM Wakeup select registers +#define SYSCTL_O_TMR2CLKCTL 0x7CU // Timer2 Clock Measurement functionality control register +#define SYSCTL_O_RESC 0x80U // Reset Cause register + +#define SYSCTL_O_SCSR 0x22U // System Control & Status Register +#define SYSCTL_O_WDCNTR 0x23U // Watchdog Counter Register +#define SYSCTL_O_WDKEY 0x25U // Watchdog Reset Key Register +#define SYSCTL_O_WDCR 0x29U // Watchdog Control Register +#define SYSCTL_O_WDWCR 0x2AU // Watchdog Windowed Control Register + +#define SYSCTL_O_CLA1TASKSRCSELLOCK 0x0U // CLA1 Task Trigger Source Select Lock Register +#define SYSCTL_O_DMACHSRCSELLOCK 0x4U // DMA Channel Triger Source Select Lock Register +#define SYSCTL_O_CLA1TASKSRCSEL1 0x6U // CLA1 Task Trigger Source Select Register-1 +#define SYSCTL_O_CLA1TASKSRCSEL2 0x8U // CLA1 Task Trigger Source Select Register-2 +#define SYSCTL_O_DMACHSRCSEL1 0x16U // DMA Channel Trigger Source Select Register-1 +#define SYSCTL_O_DMACHSRCSEL2 0x18U // DMA Channel Trigger Source Select Register-2 + +#define SYSCTL_O_SYNCSELECT 0x0U // Sync Input and Output Select Register +#define SYSCTL_O_ADCSOCOUTSELECT 0x2U // External ADC (Off Chip) SOC Select Register +#define SYSCTL_O_SYNCSOCLOCK 0x4U // SYNCSEL and EXTADCSOC Select Lock register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DEVCFGLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_DEVCFGLOCK1_CPUSEL0 0x1U // Lock bit for CPUSEL0 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL1 0x2U // Lock bit for CPUSEL1 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL2 0x4U // Lock bit for CPUSEL2 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL3 0x8U // Lock bit for CPUSEL3 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL4 0x10U // Lock bit for CPUSEL4 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL5 0x20U // Lock bit for CPUSEL5 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL6 0x40U // Lock bit for CPUSEL6 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL7 0x80U // Lock bit for CPUSEL7 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL8 0x100U // Lock bit for CPUSEL8 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL9 0x200U // Lock bit for CPUSEL9 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL10 0x400U // Lock bit for CPUSEL10 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL11 0x800U // Lock bit for CPUSEL11 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL12 0x1000U // Lock bit for CPUSEL12 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL13 0x2000U // Lock bit for CPUSEL13 register +#define SYSCTL_DEVCFGLOCK1_CPUSEL14 0x4000U // Lock bit for CPUSEL14 register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PARTIDL register +// +//************************************************************************************************* +#define SYSCTL_PARTIDL_QUAL_S 6U +#define SYSCTL_PARTIDL_QUAL_M 0xC0U // Qualification Status +#define SYSCTL_PARTIDL_PIN_COUNT_S 8U +#define SYSCTL_PARTIDL_PIN_COUNT_M 0x700U // Device Pin Count +#define SYSCTL_PARTIDL_INSTASPIN_S 13U +#define SYSCTL_PARTIDL_INSTASPIN_M 0x6000U // Motorware feature set +#define SYSCTL_PARTIDL_FLASH_SIZE_S 16U +#define SYSCTL_PARTIDL_FLASH_SIZE_M 0xFF0000U // Flash size in KB +#define SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_S 28U +#define SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_M 0xF0000000U // Revision of the PARTID format + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PARTIDH register +// +//************************************************************************************************* +#define SYSCTL_PARTIDH_FAMILY_S 8U +#define SYSCTL_PARTIDH_FAMILY_M 0xFF00U // Device family +#define SYSCTL_PARTIDH_PARTNO_S 16U +#define SYSCTL_PARTIDH_PARTNO_M 0xFF0000U // Device part number +#define SYSCTL_PARTIDH_DEVICE_CLASS_ID_S 24U +#define SYSCTL_PARTIDH_DEVICE_CLASS_ID_M 0xFF000000U // Device class ID + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC0 register +// +//************************************************************************************************* +#define SYSCTL_DC0_SINGLE_CORE 0x1U // Single Core vs Dual Core + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC1 register +// +//************************************************************************************************* +#define SYSCTL_DC1_CPU1_FPU_TMU 0x1U // CPU1's FPU1+TMU1 +#define SYSCTL_DC1_CPU2_FPU_TMU 0x2U // CPU2's FPU2+TMU2 +#define SYSCTL_DC1_CPU1_VCU 0x4U // CPU1's VCU +#define SYSCTL_DC1_CPU2_VCU 0x8U // CPU2's VCU +#define SYSCTL_DC1_CPU1_CLA1 0x40U // CPU1.CLA1 +#define SYSCTL_DC1_CPU2_CLA1 0x100U // CPU2.CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC2 register +// +//************************************************************************************************* +#define SYSCTL_DC2_EMIF1 0x1U // EMIF1 +#define SYSCTL_DC2_EMIF2 0x2U // EMIF2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC3 register +// +//************************************************************************************************* +#define SYSCTL_DC3_EPWM1 0x1U // EPWM1 +#define SYSCTL_DC3_EPWM2 0x2U // EPWM2 +#define SYSCTL_DC3_EPWM3 0x4U // EPWM3 +#define SYSCTL_DC3_EPWM4 0x8U // EPWM4 +#define SYSCTL_DC3_EPWM5 0x10U // EPWM5 +#define SYSCTL_DC3_EPWM6 0x20U // EPWM6 +#define SYSCTL_DC3_EPWM7 0x40U // EPWM7 +#define SYSCTL_DC3_EPWM8 0x80U // EPWM8 +#define SYSCTL_DC3_EPWM9 0x100U // EPWM9 +#define SYSCTL_DC3_EPWM10 0x200U // EPWM10 +#define SYSCTL_DC3_EPWM11 0x400U // EPWM11 +#define SYSCTL_DC3_EPWM12 0x800U // EPWM12 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC4 register +// +//************************************************************************************************* +#define SYSCTL_DC4_ECAP1 0x1U // ECAP1 +#define SYSCTL_DC4_ECAP2 0x2U // ECAP2 +#define SYSCTL_DC4_ECAP3 0x4U // ECAP3 +#define SYSCTL_DC4_ECAP4 0x8U // ECAP4 +#define SYSCTL_DC4_ECAP5 0x10U // ECAP5 +#define SYSCTL_DC4_ECAP6 0x20U // ECAP6 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC5 register +// +//************************************************************************************************* +#define SYSCTL_DC5_EQEP1 0x1U // EQEP1 +#define SYSCTL_DC5_EQEP2 0x2U // EQEP2 +#define SYSCTL_DC5_EQEP3 0x4U // EQEP3 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC6 register +// +//************************************************************************************************* +#define SYSCTL_DC6_CLB1 0x1U // CLB1 +#define SYSCTL_DC6_CLB2 0x2U // CLB2 +#define SYSCTL_DC6_CLB3 0x4U // CLB3 +#define SYSCTL_DC6_CLB4 0x8U // CLB4 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC7 register +// +//************************************************************************************************* +#define SYSCTL_DC7_SD1 0x1U // SD1 +#define SYSCTL_DC7_SD2 0x2U // SD2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC8 register +// +//************************************************************************************************* +#define SYSCTL_DC8_SCI_A 0x1U // SCI_A +#define SYSCTL_DC8_SCI_B 0x2U // SCI_B +#define SYSCTL_DC8_SCI_C 0x4U // SCI_C +#define SYSCTL_DC8_SCI_D 0x8U // SCI_D + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC9 register +// +//************************************************************************************************* +#define SYSCTL_DC9_SPI_A 0x1U // SPI_A +#define SYSCTL_DC9_SPI_B 0x2U // SPI_B +#define SYSCTL_DC9_SPI_C 0x4U // SPI_C + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC10 register +// +//************************************************************************************************* +#define SYSCTL_DC10_I2C_A 0x1U // I2C_A +#define SYSCTL_DC10_I2C_B 0x2U // I2C_B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC11 register +// +//************************************************************************************************* +#define SYSCTL_DC11_CAN_A 0x1U // CAN_A +#define SYSCTL_DC11_CAN_B 0x2U // CAN_B + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC12 register +// +//************************************************************************************************* +#define SYSCTL_DC12_MCBSP_A 0x1U // McBSP_A +#define SYSCTL_DC12_MCBSP_B 0x2U // McBSP_B +#define SYSCTL_DC12_USB_A_S 16U +#define SYSCTL_DC12_USB_A_M 0x30000U // Decides the capability of the USB_A Module + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC13 register +// +//************************************************************************************************* +#define SYSCTL_DC13_UPP_A 0x1U // uPP_A + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC14 register +// +//************************************************************************************************* +#define SYSCTL_DC14_ADC_A 0x1U // ADC_A +#define SYSCTL_DC14_ADC_B 0x2U // ADC_B +#define SYSCTL_DC14_ADC_C 0x4U // ADC_C +#define SYSCTL_DC14_ADC_D 0x8U // ADC_D + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC15 register +// +//************************************************************************************************* +#define SYSCTL_DC15_CMPSS1 0x1U // CMPSS1 +#define SYSCTL_DC15_CMPSS2 0x2U // CMPSS2 +#define SYSCTL_DC15_CMPSS3 0x4U // CMPSS3 +#define SYSCTL_DC15_CMPSS4 0x8U // CMPSS4 +#define SYSCTL_DC15_CMPSS5 0x10U // CMPSS5 +#define SYSCTL_DC15_CMPSS6 0x20U // CMPSS6 +#define SYSCTL_DC15_CMPSS7 0x40U // CMPSS7 +#define SYSCTL_DC15_CMPSS8 0x80U // CMPSS8 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC17 register +// +//************************************************************************************************* +#define SYSCTL_DC17_DAC_A 0x10000U // Buffered-DAC_A +#define SYSCTL_DC17_DAC_B 0x20000U // Buffered-DAC_B +#define SYSCTL_DC17_DAC_C 0x40000U // Buffered-DAC_C + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC18 register +// +//************************************************************************************************* +#define SYSCTL_DC18_LS0_1 0x1U // LS0_1 +#define SYSCTL_DC18_LS1_1 0x2U // LS1_1 +#define SYSCTL_DC18_LS2_1 0x4U // LS2_1 +#define SYSCTL_DC18_LS3_1 0x8U // LS3_1 +#define SYSCTL_DC18_LS4_1 0x10U // LS4_1 +#define SYSCTL_DC18_LS5_1 0x20U // LS5_1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC19 register +// +//************************************************************************************************* +#define SYSCTL_DC19_LS0_2 0x1U // LS0_2 +#define SYSCTL_DC19_LS1_2 0x2U // LS1_2 +#define SYSCTL_DC19_LS2_2 0x4U // LS2_2 +#define SYSCTL_DC19_LS3_2 0x8U // LS3_2 +#define SYSCTL_DC19_LS4_2 0x10U // LS4_2 +#define SYSCTL_DC19_LS5_2 0x20U // LS5_2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DC20 register +// +//************************************************************************************************* +#define SYSCTL_DC20_GS0 0x1U // GS0 +#define SYSCTL_DC20_GS1 0x2U // GS1 +#define SYSCTL_DC20_GS2 0x4U // GS2 +#define SYSCTL_DC20_GS3 0x8U // GS3 +#define SYSCTL_DC20_GS4 0x10U // GS4 +#define SYSCTL_DC20_GS5 0x20U // GS5 +#define SYSCTL_DC20_GS6 0x40U // GS6 +#define SYSCTL_DC20_GS7 0x80U // GS7 +#define SYSCTL_DC20_GS8 0x100U // GS8 +#define SYSCTL_DC20_GS9 0x200U // GS9 +#define SYSCTL_DC20_GS10 0x400U // GS10 +#define SYSCTL_DC20_GS11 0x800U // GS11 +#define SYSCTL_DC20_GS12 0x1000U // GS12 +#define SYSCTL_DC20_GS13 0x2000U // GS13 +#define SYSCTL_DC20_GS14 0x4000U // GS14 +#define SYSCTL_DC20_GS15 0x8000U // GS15 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCNF1 register +// +//************************************************************************************************* +#define SYSCTL_PERCNF1_ADC_A_MODE 0x1U // ADC_A mode setting bit +#define SYSCTL_PERCNF1_ADC_B_MODE 0x2U // ADC_B mode setting bit +#define SYSCTL_PERCNF1_ADC_C_MODE 0x4U // ADC_C mode setting bit +#define SYSCTL_PERCNF1_ADC_D_MODE 0x8U // ADC_D mode setting bit +#define SYSCTL_PERCNF1_USB_A_PHY 0x10000U // USB_A_PHY + +//************************************************************************************************* +// +// The following are defines for the bit fields in the FUSEERR register +// +//************************************************************************************************* +#define SYSCTL_FUSEERR_ALERR_S 0U +#define SYSCTL_FUSEERR_ALERR_M 0x1FU // Efuse Autoload Error Status +#define SYSCTL_FUSEERR_ERR 0x20U // Efuse Self Test Error Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES0 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES0_CPU1_CLA1 0x1U // CPU1_CLA1 software reset bit +#define SYSCTL_SOFTPRES0_CPU2_CLA1 0x4U // CPU2_CLA1 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES1 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES1_EMIF1 0x1U // EMIF1 software reset bit +#define SYSCTL_SOFTPRES1_EMIF2 0x2U // EMIF2 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES2 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES2_EPWM1 0x1U // EPWM1 software reset bit +#define SYSCTL_SOFTPRES2_EPWM2 0x2U // EPWM2 software reset bit +#define SYSCTL_SOFTPRES2_EPWM3 0x4U // EPWM3 software reset bit +#define SYSCTL_SOFTPRES2_EPWM4 0x8U // EPWM4 software reset bit +#define SYSCTL_SOFTPRES2_EPWM5 0x10U // EPWM5 software reset bit +#define SYSCTL_SOFTPRES2_EPWM6 0x20U // EPWM6 software reset bit +#define SYSCTL_SOFTPRES2_EPWM7 0x40U // EPWM7 software reset bit +#define SYSCTL_SOFTPRES2_EPWM8 0x80U // EPWM8 software reset bit +#define SYSCTL_SOFTPRES2_EPWM9 0x100U // EPWM9 software reset bit +#define SYSCTL_SOFTPRES2_EPWM10 0x200U // EPWM10 software reset bit +#define SYSCTL_SOFTPRES2_EPWM11 0x400U // EPWM11 software reset bit +#define SYSCTL_SOFTPRES2_EPWM12 0x800U // EPWM12 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES3 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES3_ECAP1 0x1U // ECAP1 software reset bit +#define SYSCTL_SOFTPRES3_ECAP2 0x2U // ECAP2 software reset bit +#define SYSCTL_SOFTPRES3_ECAP3 0x4U // ECAP3 software reset bit +#define SYSCTL_SOFTPRES3_ECAP4 0x8U // ECAP4 software reset bit +#define SYSCTL_SOFTPRES3_ECAP5 0x10U // ECAP5 software reset bit +#define SYSCTL_SOFTPRES3_ECAP6 0x20U // ECAP6 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES4 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES4_EQEP1 0x1U // EQEP1 software reset bit +#define SYSCTL_SOFTPRES4_EQEP2 0x2U // EQEP2 software reset bit +#define SYSCTL_SOFTPRES4_EQEP3 0x4U // EQEP3 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES6 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES6_SD1 0x1U // SD1 software reset bit +#define SYSCTL_SOFTPRES6_SD2 0x2U // SD2 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES7 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES7_SCI_A 0x1U // SCI_A software reset bit +#define SYSCTL_SOFTPRES7_SCI_B 0x2U // SCI_B software reset bit +#define SYSCTL_SOFTPRES7_SCI_C 0x4U // SCI_C software reset bit +#define SYSCTL_SOFTPRES7_SCI_D 0x8U // SCI_D software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES8 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES8_SPI_A 0x1U // SPI_A software reset bit +#define SYSCTL_SOFTPRES8_SPI_B 0x2U // SPI_B software reset bit +#define SYSCTL_SOFTPRES8_SPI_C 0x4U // SPI_C software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES9 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES9_I2C_A 0x1U // I2C_A software reset bit +#define SYSCTL_SOFTPRES9_I2C_B 0x2U // I2C_B software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES11 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES11_MCBSP_A 0x1U // McBSP_A software reset bit +#define SYSCTL_SOFTPRES11_MCBSP_B 0x2U // McBSP_B software reset bit +#define SYSCTL_SOFTPRES11_USB_A 0x10000U // USB_A software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES13 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES13_ADC_A 0x1U // ADC_A software reset bit +#define SYSCTL_SOFTPRES13_ADC_B 0x2U // ADC_B software reset bit +#define SYSCTL_SOFTPRES13_ADC_C 0x4U // ADC_C software reset bit +#define SYSCTL_SOFTPRES13_ADC_D 0x8U // ADC_D software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES14 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES14_CMPSS1 0x1U // CMPSS1 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS2 0x2U // CMPSS2 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS3 0x4U // CMPSS3 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS4 0x8U // CMPSS4 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS5 0x10U // CMPSS5 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS6 0x20U // CMPSS6 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS7 0x40U // CMPSS7 software reset bit +#define SYSCTL_SOFTPRES14_CMPSS8 0x80U // CMPSS8 software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SOFTPRES16 register +// +//************************************************************************************************* +#define SYSCTL_SOFTPRES16_DAC_A 0x10000U // Buffered_DAC_A software reset bit +#define SYSCTL_SOFTPRES16_DAC_B 0x20000U // Buffered_DAC_B software reset bit +#define SYSCTL_SOFTPRES16_DAC_C 0x40000U // Buffered_DAC_C software reset bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL0 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL0_EPWM1 0x1U // EPWM1 CPU select bit +#define SYSCTL_CPUSEL0_EPWM2 0x2U // EPWM2 CPU select bit +#define SYSCTL_CPUSEL0_EPWM3 0x4U // EPWM3 CPU select bit +#define SYSCTL_CPUSEL0_EPWM4 0x8U // EPWM4 CPU select bit +#define SYSCTL_CPUSEL0_EPWM5 0x10U // EPWM5 CPU select bit +#define SYSCTL_CPUSEL0_EPWM6 0x20U // EPWM6 CPU select bit +#define SYSCTL_CPUSEL0_EPWM7 0x40U // EPWM7 CPU select bit +#define SYSCTL_CPUSEL0_EPWM8 0x80U // EPWM8 CPU select bit +#define SYSCTL_CPUSEL0_EPWM9 0x100U // EPWM9 CPU select bit +#define SYSCTL_CPUSEL0_EPWM10 0x200U // EPWM10 CPU select bit +#define SYSCTL_CPUSEL0_EPWM11 0x400U // EPWM11 CPU select bit +#define SYSCTL_CPUSEL0_EPWM12 0x800U // EPWM12 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL1 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL1_ECAP1 0x1U // ECAP1 CPU select bit +#define SYSCTL_CPUSEL1_ECAP2 0x2U // ECAP2 CPU select bit +#define SYSCTL_CPUSEL1_ECAP3 0x4U // ECAP3 CPU select bit +#define SYSCTL_CPUSEL1_ECAP4 0x8U // ECAP4 CPU select bit +#define SYSCTL_CPUSEL1_ECAP5 0x10U // ECAP5 CPU select bit +#define SYSCTL_CPUSEL1_ECAP6 0x20U // ECAP6 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL2 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL2_EQEP1 0x1U // EQEP1 CPU select bit +#define SYSCTL_CPUSEL2_EQEP2 0x2U // EQEP2 CPU select bit +#define SYSCTL_CPUSEL2_EQEP3 0x4U // EQEP3 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL4 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL4_SD1 0x1U // SD1 CPU select bit +#define SYSCTL_CPUSEL4_SD2 0x2U // SD2 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL5 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL5_SCI_A 0x1U // SCI_A CPU select bit +#define SYSCTL_CPUSEL5_SCI_B 0x2U // SCI_B CPU select bit +#define SYSCTL_CPUSEL5_SCI_C 0x4U // SCI_C CPU select bit +#define SYSCTL_CPUSEL5_SCI_D 0x8U // SCI_D CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL6 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL6_SPI_A 0x1U // SPI_A CPU select bit +#define SYSCTL_CPUSEL6_SPI_B 0x2U // SPI_B CPU select bit +#define SYSCTL_CPUSEL6_SPI_C 0x4U // SPI_C CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL7 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL7_I2C_A 0x1U // I2C_A CPU select bit +#define SYSCTL_CPUSEL7_I2C_B 0x2U // I2C_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL8 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL8_CAN_A 0x1U // CAN_A CPU select bit +#define SYSCTL_CPUSEL8_CAN_B 0x2U // CAN_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL9 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL9_MCBSP_A 0x1U // McBSP_A CPU select bit +#define SYSCTL_CPUSEL9_MCBSP_B 0x2U // McBSP_B CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL11 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL11_ADC_A 0x1U // ADC_A CPU select bit +#define SYSCTL_CPUSEL11_ADC_B 0x2U // ADC_B CPU select bit +#define SYSCTL_CPUSEL11_ADC_C 0x4U // ADC_C CPU select bit +#define SYSCTL_CPUSEL11_ADC_D 0x8U // ADC_D CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL12 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL12_CMPSS1 0x1U // CMPSS1 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS2 0x2U // CMPSS2 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS3 0x4U // CMPSS3 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS4 0x8U // CMPSS4 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS5 0x10U // CMPSS5 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS6 0x20U // CMPSS6 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS7 0x40U // CMPSS7 CPU select bit +#define SYSCTL_CPUSEL12_CMPSS8 0x80U // CMPSS8 CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSEL14 register +// +//************************************************************************************************* +#define SYSCTL_CPUSEL14_DAC_A 0x10000U // Buffered_DAC_A CPU select bit +#define SYSCTL_CPUSEL14_DAC_B 0x20000U // Buffered_DAC_B CPU select bit +#define SYSCTL_CPUSEL14_DAC_C 0x40000U // Buffered_DAC_C CPU select bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPU2RESCTL register +// +//************************************************************************************************* +#define SYSCTL_CPU2RESCTL_RESET 0x1U // CPU2 Reset Control bit +#define SYSCTL_CPU2RESCTL_KEY_S 16U +#define SYSCTL_CPU2RESCTL_KEY_M 0xFFFF0000U // Key Qualifier for writes to this register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RSTSTAT register +// +//************************************************************************************************* +#define SYSCTL_RSTSTAT_CPU2RES 0x1U // CPU2 Reset Status bit +#define SYSCTL_RSTSTAT_CPU2NMIWDRST 0x2U // Indicates whether a CPU2.NMIWD reset was issued + // to CPU2 +#define SYSCTL_RSTSTAT_CPU2HWBISTRST0 0x4U // Indicates whether a HWBIST reset was issued to + // CPU2 +#define SYSCTL_RSTSTAT_CPU2HWBISTRST1 0x8U // Indicates whether a HWBIST reset was issued to + // CPU2 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LPMSTAT register +// +//************************************************************************************************* +#define SYSCTL_LPMSTAT_CPU2LPMSTAT_S 0U +#define SYSCTL_LPMSTAT_CPU2LPMSTAT_M 0x3U // CPU2 LPM Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSDBGCTL register +// +//************************************************************************************************* +#define SYSCTL_SYSDBGCTL_BIT_0 0x1U // Used in PLL startup. Only reset by POR. + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSEM register +// +//************************************************************************************************* +#define SYSCTL_CLKSEM_SEM_S 0U +#define SYSCTL_CLKSEM_SEM_M 0x3U // Semaphore for CLKCFG Ownership by CPU1 or CPU2 +#define SYSCTL_CLKSEM_KEY_S 16U +#define SYSCTL_CLKSEM_KEY_M 0xFFFF0000U // Key Qualifier for writes to this register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKCFGLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL1 0x1U // Lock bit for CLKSRCCTL1 register +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL2 0x2U // Lock bit for CLKSRCCTL2 register +#define SYSCTL_CLKCFGLOCK1_CLKSRCCTL3 0x4U // Lock bit for CLKSRCCTL3 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL1 0x8U // Lock bit for SYSPLLCTL1 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL2 0x10U // Lock bit for SYSPLLCTL2 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLCTL3 0x20U // Lock bit for SYSPLLCTL3 register +#define SYSCTL_CLKCFGLOCK1_SYSPLLMULT 0x40U // Lock bit for SYSPLLMULT register +#define SYSCTL_CLKCFGLOCK1_AUXPLLCTL1 0x80U // Lock bit for AUXPLLCTL1 register +#define SYSCTL_CLKCFGLOCK1_AUXPLLMULT 0x400U // Lock bit for AUXPLLMULT register +#define SYSCTL_CLKCFGLOCK1_SYSCLKDIVSEL 0x800U // Lock bit for SYSCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_AUXCLKDIVSEL 0x1000U // Lock bit for AUXCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_PERCLKDIVSEL 0x2000U // Lock bit for PERCLKDIVSEL register +#define SYSCTL_CLKCFGLOCK1_LOSPCP 0x8000U // Lock bit for LOSPCP register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL1 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_S 0U +#define SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M 0x3U // OSCCLK Source Select Bit +#define SYSCTL_CLKSRCCTL1_INTOSC2OFF 0x8U // Internal Oscillator 2 Off Bit +#define SYSCTL_CLKSRCCTL1_XTALOFF 0x10U // Crystal (External) Oscillator Off Bit +#define SYSCTL_CLKSRCCTL1_WDHALTI 0x20U // Watchdog HALT Mode Ignore Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL2 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S 0U +#define SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M 0x3U // AUXOSCCLK Source Select Bit +#define SYSCTL_CLKSRCCTL2_CANABCLKSEL_S 2U +#define SYSCTL_CLKSRCCTL2_CANABCLKSEL_M 0xCU // CANA Bit Clock Source Select Bit +#define SYSCTL_CLKSRCCTL2_CANBBCLKSEL_S 4U +#define SYSCTL_CLKSRCCTL2_CANBBCLKSEL_M 0x30U // CANB Bit Clock Source Select Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLKSRCCTL3 register +// +//************************************************************************************************* +#define SYSCTL_CLKSRCCTL3_XCLKOUTSEL_S 0U +#define SYSCTL_CLKSRCCTL3_XCLKOUTSEL_M 0x7U // XCLKOUT Source Select Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLCTL1 register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLCTL1_PLLEN 0x1U // SYSPLL enable/disable bit +#define SYSCTL_SYSPLLCTL1_PLLCLKEN 0x2U // SYSPLL bypassed or included in the PLLSYSCLK path + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLMULT register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLMULT_IMULT_S 0U +#define SYSCTL_SYSPLLMULT_IMULT_M 0x7FU // SYSPLL Integer Multiplier +#define SYSCTL_SYSPLLMULT_FMULT_S 8U +#define SYSCTL_SYSPLLMULT_FMULT_M 0x300U // SYSPLL Fractional Multiplier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSPLLSTS register +// +//************************************************************************************************* +#define SYSCTL_SYSPLLSTS_LOCKS 0x1U // SYSPLL Lock Status Bit +#define SYSCTL_SYSPLLSTS_SLIPS 0x2U // SYSPLL Slip Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLCTL1 register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLCTL1_PLLEN 0x1U // AUXPLL enable/disable bit +#define SYSCTL_AUXPLLCTL1_PLLCLKEN 0x2U // AUXPLL bypassed or included in the AUXPLLCLK path + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLMULT register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLMULT_IMULT_S 0U +#define SYSCTL_AUXPLLMULT_IMULT_M 0x7FU // AUXPLL Integer Multiplier +#define SYSCTL_AUXPLLMULT_FMULT_S 8U +#define SYSCTL_AUXPLLMULT_FMULT_M 0x300U // AUXPLL Fractional Multiplier + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXPLLSTS register +// +//************************************************************************************************* +#define SYSCTL_AUXPLLSTS_LOCKS 0x1U // AUXPLL Lock Status Bit +#define SYSCTL_AUXPLLSTS_SLIPS 0x2U // AUXPLL Slip Status Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYSCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_S 0U +#define SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M 0x3FU // PLLSYSCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the AUXCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_S 0U +#define SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M 0x3U // AUXPLLCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCLKDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_S 0U +#define SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_M 0x3U // EPWM Clock Divide Select +#define SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV 0x10U // EMIF1 Clock Divide Select +#define SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV 0x40U // EMIF2 Clock Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XCLKOUTDIVSEL register +// +//************************************************************************************************* +#define SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_S 0U +#define SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_M 0x3U // XCLKOUT Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LOSPCP register +// +//************************************************************************************************* +#define SYSCTL_LOSPCP_LSPCLKDIV_S 0U +#define SYSCTL_LOSPCP_LSPCLKDIV_M 0x7U // LSPCLK Divide Select + +//************************************************************************************************* +// +// The following are defines for the bit fields in the MCDCR register +// +//************************************************************************************************* +#define SYSCTL_MCDCR_MCLKSTS 0x1U // Missing Clock Status Bit +#define SYSCTL_MCDCR_MCLKCLR 0x2U // Missing Clock Clear Bit +#define SYSCTL_MCDCR_MCLKOFF 0x4U // Missing Clock Detect Off Bit +#define SYSCTL_MCDCR_OSCOFF 0x8U // Oscillator Clock Off Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the X1CNT register +// +//************************************************************************************************* +#define SYSCTL_X1CNT_X1CNT_S 0U +#define SYSCTL_X1CNT_X1CNT_M 0x3FFU // X1 Counter + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CPUSYSLOCK1 register +// +//************************************************************************************************* +#define SYSCTL_CPUSYSLOCK1_HIBBOOTMODE 0x1U // Lock bit for HIBBOOTMODE register +#define SYSCTL_CPUSYSLOCK1_IORESTOREADDR 0x2U // Lock bit for IORESTOREADDR Register +#define SYSCTL_CPUSYSLOCK1_PIEVERRADDR 0x4U // Lock bit for PIEVERRADDR Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR0 0x8U // Lock bit for PCLKCR0 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR1 0x10U // Lock bit for PCLKCR1 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR2 0x20U // Lock bit for PCLKCR2 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR3 0x40U // Lock bit for PCLKCR3 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR4 0x80U // Lock bit for PCLKCR4 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR5 0x100U // Lock bit for PCLKCR5 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR6 0x200U // Lock bit for PCLKCR6 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR7 0x400U // Lock bit for PCLKCR7 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR8 0x800U // Lock bit for PCLKCR8 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR9 0x1000U // Lock bit for PCLKCR9 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR10 0x2000U // Lock bit for PCLKCR10 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR11 0x4000U // Lock bit for PCLKCR11 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR12 0x8000U // Lock bit for PCLKCR12 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR13 0x10000U // Lock bit for PCLKCR13 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR14 0x20000U // Lock bit for PCLKCR14 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR15 0x40000U // Lock bit for PCLKCR15 Register +#define SYSCTL_CPUSYSLOCK1_PCLKCR16 0x80000U // Lock bit for PCLKCR16 Register +#define SYSCTL_CPUSYSLOCK1_SECMSEL 0x100000U // Lock bit for SECMSEL Register +#define SYSCTL_CPUSYSLOCK1_LPMCR 0x200000U // Lock bit for LPMCR Register +#define SYSCTL_CPUSYSLOCK1_GPIOLPMSEL0 0x400000U // Lock bit for GPIOLPMSEL0 Register +#define SYSCTL_CPUSYSLOCK1_GPIOLPMSEL1 0x800000U // Lock bit for GPIOLPMSEL1 Register + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IORESTOREADDR register +// +//************************************************************************************************* +#define SYSCTL_IORESTOREADDR_ADDR_S 0U +#define SYSCTL_IORESTOREADDR_ADDR_M 0x3FFFFFU // restoreIO() routine address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PIEVERRADDR register +// +//************************************************************************************************* +#define SYSCTL_PIEVERRADDR_ADDR_S 0U +#define SYSCTL_PIEVERRADDR_ADDR_M 0x3FFFFFU // PIE Vector Fetch Error Handler Routine Address + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR0 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR0_CLA1 0x1U // CLA1 Clock Enable Bit +#define SYSCTL_PCLKCR0_DMA 0x4U // DMA Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER0 0x8U // CPUTIMER0 Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER1 0x10U // CPUTIMER1 Clock Enable bit +#define SYSCTL_PCLKCR0_CPUTIMER2 0x20U // CPUTIMER2 Clock Enable bit +#define SYSCTL_PCLKCR0_HRPWM 0x10000U // HRPWM Clock Enable Bit +#define SYSCTL_PCLKCR0_TBCLKSYNC 0x40000U // EPWM Time Base Clock sync +#define SYSCTL_PCLKCR0_GTBCLKSYNC 0x80000U // EPWM Time Base Clock Global sync + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR1 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR1_EMIF1 0x1U // EMIF1 Clock Enable bit +#define SYSCTL_PCLKCR1_EMIF2 0x2U // EMIF2 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR2 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR2_EPWM1 0x1U // EPWM1 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM2 0x2U // EPWM2 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM3 0x4U // EPWM3 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM4 0x8U // EPWM4 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM5 0x10U // EPWM5 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM6 0x20U // EPWM6 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM7 0x40U // EPWM7 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM8 0x80U // EPWM8 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM9 0x100U // EPWM9 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM10 0x200U // EPWM10 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM11 0x400U // EPWM11 Clock Enable bit +#define SYSCTL_PCLKCR2_EPWM12 0x800U // EPWM12 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR3 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR3_ECAP1 0x1U // ECAP1 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP2 0x2U // ECAP2 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP3 0x4U // ECAP3 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP4 0x8U // ECAP4 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP5 0x10U // ECAP5 Clock Enable bit +#define SYSCTL_PCLKCR3_ECAP6 0x20U // ECAP6 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR4 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR4_EQEP1 0x1U // EQEP1 Clock Enable bit +#define SYSCTL_PCLKCR4_EQEP2 0x2U // EQEP2 Clock Enable bit +#define SYSCTL_PCLKCR4_EQEP3 0x4U // EQEP3 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR6 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR6_SD1 0x1U // SD1 Clock Enable bit +#define SYSCTL_PCLKCR6_SD2 0x2U // SD2 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR7 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR7_SCI_A 0x1U // SCI_A Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_B 0x2U // SCI_B Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_C 0x4U // SCI_C Clock Enable bit +#define SYSCTL_PCLKCR7_SCI_D 0x8U // SCI_D Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR8 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR8_SPI_A 0x1U // SPI_A Clock Enable bit +#define SYSCTL_PCLKCR8_SPI_B 0x2U // SPI_B Clock Enable bit +#define SYSCTL_PCLKCR8_SPI_C 0x4U // SPI_C Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR9 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR9_I2C_A 0x1U // I2C_A Clock Enable bit +#define SYSCTL_PCLKCR9_I2C_B 0x2U // I2C_B Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR10 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR10_CAN_A 0x1U // CAN_A Clock Enable bit +#define SYSCTL_PCLKCR10_CAN_B 0x2U // CAN_B Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR11 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR11_MCBSP_A 0x1U // McBSP_A Clock Enable bit +#define SYSCTL_PCLKCR11_MCBSP_B 0x2U // McBSP_B Clock Enable bit +#define SYSCTL_PCLKCR11_USB_A 0x10000U // USB_A Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR12 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR12_UPP_A 0x1U // uPP_A Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR13 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR13_ADC_A 0x1U // ADC_A Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_B 0x2U // ADC_B Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_C 0x4U // ADC_C Clock Enable bit +#define SYSCTL_PCLKCR13_ADC_D 0x8U // ADC_D Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR14 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR14_CMPSS1 0x1U // CMPSS1 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS2 0x2U // CMPSS2 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS3 0x4U // CMPSS3 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS4 0x8U // CMPSS4 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS5 0x10U // CMPSS5 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS6 0x20U // CMPSS6 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS7 0x40U // CMPSS7 Clock Enable bit +#define SYSCTL_PCLKCR14_CMPSS8 0x80U // CMPSS8 Clock Enable bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PCLKCR16 register +// +//************************************************************************************************* +#define SYSCTL_PCLKCR16_DAC_A 0x10000U // Buffered_DAC_A Clock Enable Bit +#define SYSCTL_PCLKCR16_DAC_B 0x20000U // Buffered_DAC_B Clock Enable Bit +#define SYSCTL_PCLKCR16_DAC_C 0x40000U // Buffered_DAC_C Clock Enable Bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SECMSEL register +// +//************************************************************************************************* +#define SYSCTL_SECMSEL_PF1SEL_S 0U +#define SYSCTL_SECMSEL_PF1SEL_M 0x3U // Secondary Master Select for VBUS32_1 Bridge +#define SYSCTL_SECMSEL_PF2SEL_S 2U +#define SYSCTL_SECMSEL_PF2SEL_M 0xCU // Secondary Master Select for VBUS32_2 Bridge + +//************************************************************************************************* +// +// The following are defines for the bit fields in the LPMCR register +// +//************************************************************************************************* +#define SYSCTL_LPMCR_LPM_S 0U +#define SYSCTL_LPMCR_LPM_M 0x3U // Low Power Mode setting +#define SYSCTL_LPMCR_QUALSTDBY_S 2U +#define SYSCTL_LPMCR_QUALSTDBY_M 0xFCU // STANDBY Wakeup Pin Qualification Setting +#define SYSCTL_LPMCR_WDINTE 0x8000U // Enable for WDINT wakeup from STANDBY +#define SYSCTL_LPMCR_M0M1MODE_S 16U +#define SYSCTL_LPMCR_M0M1MODE_M 0x30000U // Configuration for M0 and M1 mode during HIB +#define SYSCTL_LPMCR_IOISODIS 0x80000000U // IO Isolation Disable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPIOLPMSEL0 register +// +//************************************************************************************************* +#define SYSCTL_GPIOLPMSEL0_GPIO0 0x1U // GPIO0 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO1 0x2U // GPIO1 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO2 0x4U // GPIO2 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO3 0x8U // GPIO3 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO4 0x10U // GPIO4 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO5 0x20U // GPIO5 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO6 0x40U // GPIO6 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO7 0x80U // GPIO7 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO8 0x100U // GPIO8 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO9 0x200U // GPIO9 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO10 0x400U // GPIO10 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO11 0x800U // GPIO11 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO12 0x1000U // GPIO12 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO13 0x2000U // GPIO13 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO14 0x4000U // GPIO14 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO15 0x8000U // GPIO15 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO16 0x10000U // GPIO16 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO17 0x20000U // GPIO17 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO18 0x40000U // GPIO18 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO19 0x80000U // GPIO19 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO20 0x100000U // GPIO20 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO21 0x200000U // GPIO21 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO22 0x400000U // GPIO22 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO23 0x800000U // GPIO23 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO24 0x1000000U // GPIO24 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO25 0x2000000U // GPIO25 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO26 0x4000000U // GPIO26 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO27 0x8000000U // GPIO27 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO28 0x10000000U // GPIO28 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO29 0x20000000U // GPIO29 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO30 0x40000000U // GPIO30 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL0_GPIO31 0x80000000U // GPIO31 Enable for LPM Wakeup + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GPIOLPMSEL1 register +// +//************************************************************************************************* +#define SYSCTL_GPIOLPMSEL1_GPIO32 0x1U // GPIO32 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO33 0x2U // GPIO33 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO34 0x4U // GPIO34 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO35 0x8U // GPIO35 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO36 0x10U // GPIO36 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO37 0x20U // GPIO37 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO38 0x40U // GPIO38 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO39 0x80U // GPIO39 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO40 0x100U // GPIO40 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO41 0x200U // GPIO41 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO42 0x400U // GPIO42 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO43 0x800U // GPIO43 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO44 0x1000U // GPIO44 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO45 0x2000U // GPIO45 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO46 0x4000U // GPIO46 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO47 0x8000U // GPIO47 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO48 0x10000U // GPIO48 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO49 0x20000U // GPIO49 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO50 0x40000U // GPIO50 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO51 0x80000U // GPIO51 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO52 0x100000U // GPIO52 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO53 0x200000U // GPIO53 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO54 0x400000U // GPIO54 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO55 0x800000U // GPIO55 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO56 0x1000000U // GPIO56 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO57 0x2000000U // GPIO57 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO58 0x4000000U // GPIO58 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO59 0x8000000U // GPIO59 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO60 0x10000000U // GPIO60 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO61 0x20000000U // GPIO61 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO62 0x40000000U // GPIO62 Enable for LPM Wakeup +#define SYSCTL_GPIOLPMSEL1_GPIO63 0x80000000U // GPIO63 Enable for LPM Wakeup + +//************************************************************************************************* +// +// The following are defines for the bit fields in the TMR2CLKCTL register +// +//************************************************************************************************* +#define SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_S 0U +#define SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M 0x7U // CPU Timer 2 Clock Source Select Bit +#define SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_S 3U +#define SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M 0x38U // CPU Timer 2 Clock Pre-Scale Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RESC register +// +//************************************************************************************************* +#define SYSCTL_RESC_POR 0x1U // POR Reset Cause Indication Bit +#define SYSCTL_RESC_XRSN 0x2U // XRSn Reset Cause Indication Bit +#define SYSCTL_RESC_WDRSN 0x4U // WDRSn Reset Cause Indication Bit +#define SYSCTL_RESC_NMIWDRSN 0x8U // NMIWDRSn Reset Cause Indication Bit +#define SYSCTL_RESC_HWBISTN 0x20U // HWBISTn Reset Cause Indication Bit +#define SYSCTL_RESC_HIBRESETN 0x40U // HIBRESETn Reset Cause Indication Bit +#define SYSCTL_RESC_SCCRESETN 0x100U // SCCRESETn Reset Cause Indication Bit +#define SYSCTL_RESC_XRSN_PIN_STATUS 0x40000000U // XRSN Pin Status +#define SYSCTL_RESC_TRSTN_PIN_STATUS 0x80000000U // TRSTn Status + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SCSR register +// +//************************************************************************************************* +#define SYSCTL_SCSR_WDOVERRIDE 0x1U // WD Override for WDDIS bit +#define SYSCTL_SCSR_WDENINT 0x2U // WD Interrupt Enable +#define SYSCTL_SCSR_WDINTS 0x4U // WD Interrupt Status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDCNTR register +// +//************************************************************************************************* +#define SYSCTL_WDCNTR_WDCNTR_S 0U +#define SYSCTL_WDCNTR_WDCNTR_M 0xFFU // WD Counter + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDKEY register +// +//************************************************************************************************* +#define SYSCTL_WDKEY_WDKEY_S 0U +#define SYSCTL_WDKEY_WDKEY_M 0xFFU // WD KEY + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDCR register +// +//************************************************************************************************* +#define SYSCTL_WDCR_WDPS_S 0U +#define SYSCTL_WDCR_WDPS_M 0x7U // WD Clock Prescalar +#define SYSCTL_WDCR_WDCHK_S 3U +#define SYSCTL_WDCR_WDCHK_M 0x38U // WD Check Bits +#define SYSCTL_WDCR_WDDIS 0x40U // WD Disable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the WDWCR register +// +//************************************************************************************************* +#define SYSCTL_WDWCR_MIN_S 0U +#define SYSCTL_WDWCR_MIN_M 0xFFU // WD Min Threshold setting for Windowed Watchdog + // functionality +#define SYSCTL_WDWCR_FIRSTKEY 0x100U // First Key Detect Flag + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSELLOCK register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSELLOCK_CLA1TASKSRCSEL1 0x1U // CLA1TASKSRCSEL1 Register Lock bit +#define SYSCTL_CLA1TASKSRCSELLOCK_CLA1TASKSRCSEL2 0x2U // CLA1TASKSRCSEL2 Register Lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSELLOCK register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSELLOCK_DMACHSRCSEL1 0x1U // DMACHSRCSEL1 Register Lock bit +#define SYSCTL_DMACHSRCSELLOCK_DMACHSRCSEL2 0x2U // DMACHSRCSEL2 Register Lock bit + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSEL1 register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSEL1_TASK1_S 0U +#define SYSCTL_CLA1TASKSRCSEL1_TASK1_M 0xFFU // Selects the Trigger Source for TASK1 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK2_S 8U +#define SYSCTL_CLA1TASKSRCSEL1_TASK2_M 0xFF00U // Selects the Trigger Source for TASK2 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK3_S 16U +#define SYSCTL_CLA1TASKSRCSEL1_TASK3_M 0xFF0000U // Selects the Trigger Source for TASK3 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL1_TASK4_S 24U +#define SYSCTL_CLA1TASKSRCSEL1_TASK4_M 0xFF000000U // Selects the Trigger Source for TASK4 of + // CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CLA1TASKSRCSEL2 register +// +//************************************************************************************************* +#define SYSCTL_CLA1TASKSRCSEL2_TASK5_S 0U +#define SYSCTL_CLA1TASKSRCSEL2_TASK5_M 0xFFU // Selects the Trigger Source for TASK5 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK6_S 8U +#define SYSCTL_CLA1TASKSRCSEL2_TASK6_M 0xFF00U // Selects the Trigger Source for TASK6 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK7_S 16U +#define SYSCTL_CLA1TASKSRCSEL2_TASK7_M 0xFF0000U // Selects the Trigger Source for TASK7 of + // CLA1 +#define SYSCTL_CLA1TASKSRCSEL2_TASK8_S 24U +#define SYSCTL_CLA1TASKSRCSEL2_TASK8_M 0xFF000000U // Selects the Trigger Source for TASK8 of + // CLA1 + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSEL1 register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSEL1_CH1_S 0U +#define SYSCTL_DMACHSRCSEL1_CH1_M 0xFFU // Selects the Trigger and Sync Source CH1 of DMA +#define SYSCTL_DMACHSRCSEL1_CH2_S 8U +#define SYSCTL_DMACHSRCSEL1_CH2_M 0xFF00U // Selects the Trigger and Sync Source CH2 of DMA +#define SYSCTL_DMACHSRCSEL1_CH3_S 16U +#define SYSCTL_DMACHSRCSEL1_CH3_M 0xFF0000U // Selects the Trigger and Sync Source CH3 of DMA +#define SYSCTL_DMACHSRCSEL1_CH4_S 24U +#define SYSCTL_DMACHSRCSEL1_CH4_M 0xFF000000U // Selects the Trigger and Sync Source CH4 of DMA + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DMACHSRCSEL2 register +// +//************************************************************************************************* +#define SYSCTL_DMACHSRCSEL2_CH5_S 0U +#define SYSCTL_DMACHSRCSEL2_CH5_M 0xFFU // Selects the Trigger and Sync Source CH5 of DMA +#define SYSCTL_DMACHSRCSEL2_CH6_S 8U +#define SYSCTL_DMACHSRCSEL2_CH6_M 0xFF00U // Selects the Trigger and Sync Source CH6 of DMA + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYNCSELECT register +// +//************************************************************************************************* +#define SYSCTL_SYNCSELECT_EPWM4SYNCIN_S 0U +#define SYSCTL_SYNCSELECT_EPWM4SYNCIN_M 0x7U // Selects Sync Input Source for EPWM4 +#define SYSCTL_SYNCSELECT_EPWM7SYNCIN_S 3U +#define SYSCTL_SYNCSELECT_EPWM7SYNCIN_M 0x38U // Selects Sync Input Source for EPWM7 +#define SYSCTL_SYNCSELECT_EPWM10SYNCIN_S 6U +#define SYSCTL_SYNCSELECT_EPWM10SYNCIN_M 0x1C0U // Selects Sync Input Source for EPWM10 +#define SYSCTL_SYNCSELECT_ECAP1SYNCIN_S 9U +#define SYSCTL_SYNCSELECT_ECAP1SYNCIN_M 0xE00U // Selects Sync Input Source for ECAP1 +#define SYSCTL_SYNCSELECT_ECAP4SYNCIN_S 12U +#define SYSCTL_SYNCSELECT_ECAP4SYNCIN_M 0x7000U // Selects Sync Input Source for ECAP4 +#define SYSCTL_SYNCSELECT_SYNCOUT_S 27U +#define SYSCTL_SYNCSELECT_SYNCOUT_M 0x18000000U // Select Syncout Source + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ADCSOCOUTSELECT register +// +//************************************************************************************************* +#define SYSCTL_ADCSOCOUTSELECT_PWM1SOCAEN 0x1U // PWM1SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM2SOCAEN 0x2U // PWM2SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM3SOCAEN 0x4U // PWM3SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM4SOCAEN 0x8U // PWM4SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM5SOCAEN 0x10U // PWM5SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM6SOCAEN 0x20U // PWM6SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM7SOCAEN 0x40U // PWM7SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM8SOCAEN 0x80U // PWM8SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM9SOCAEN 0x100U // PWM9SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM10SOCAEN 0x200U // PWM10SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM11SOCAEN 0x400U // PWM11SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM12SOCAEN 0x800U // PWM12SOCAEN Enable for ADCSOCAO +#define SYSCTL_ADCSOCOUTSELECT_PWM1SOCBEN 0x10000U // PWM1SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM2SOCBEN 0x20000U // PWM2SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM3SOCBEN 0x40000U // PWM3SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM4SOCBEN 0x80000U // PWM4SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM5SOCBEN 0x100000U // PWM5SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM6SOCBEN 0x200000U // PWM6SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM7SOCBEN 0x400000U // PWM7SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM8SOCBEN 0x800000U // PWM8SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM9SOCBEN 0x1000000U // PWM9SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM10SOCBEN 0x2000000U // PWM10SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM11SOCBEN 0x4000000U // PWM11SOCBEN Enable for ADCSOCBO +#define SYSCTL_ADCSOCOUTSELECT_PWM12SOCBEN 0x8000000U // PWM12SOCBEN Enable for ADCSOCBO + +//************************************************************************************************* +// +// The following are defines for the bit fields in the SYNCSOCLOCK register +// +//************************************************************************************************* +#define SYSCTL_SYNCSOCLOCK_SYNCSELECT 0x1U // SYNCSEL Register Lock bit +#define SYSCTL_SYNCSOCLOCK_ADCSOCOUTSELECT 0x2U // ADCSOCOUTSELECT Register Lock bit + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_types.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_types.h new file mode 100644 index 0000000..8c1b32d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_types.h @@ -0,0 +1,166 @@ +//########################################################################### +// +// FILE: hw_types.h +// +// TITLE: Type definitions used in driverlib functions. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_TYPES_H +#define HW_TYPES_H + +//***************************************************************************** +// +// Macros for hardware access +// +//***************************************************************************** +#if defined(__TMS320C28XX_CLA__) + #define HWREG(x) \ + (*((volatile uint32_t *)((uintptr_t)(x)))) + #define HWREGH(x) \ + (*((volatile uint16_t *)((uintptr_t)(x)))) +#else + #define HWREG(x) \ + (*((volatile uint32_t *)(x))) + #define HWREGH(x) \ + (*((volatile uint16_t *)(x))) +#endif + +#define HWREG_BP(x) \ + __byte_peripheral_32((uint32_t *)(x)) +#define HWREGB(x) \ + __byte((int *)(x),0) + +//***************************************************************************** +// +// SUCCESS and FAILURE for API return value +// +//***************************************************************************** +#define STATUS_S_SUCCESS (0) +#define STATUS_E_FAILURE (-1) + +//***************************************************************************** +// +// Definition of 8 bit types for USB Driver code to maintain portability +// between byte and word addressable cores of C2000 Devices. +// +//***************************************************************************** +typedef uint16_t uint8_t; +typedef int16_t int8_t; + +//**************************************************************************** +// +// For checking NULL pointers +// +//**************************************************************************** +#ifndef NULL +#define NULL ((void *)0x0) +#endif + +//***************************************************************************** +// +// 32-bit & 64-bit float type +// +//***************************************************************************** +#ifndef C2000_IEEE754_TYPES +#define C2000_IEEE754_TYPES +#ifdef __TI_EABI__ +typedef float float32_t; +typedef double float64_t; +#else // TI COFF +typedef float float32_t; +typedef long double float64_t; +#endif // __TI_EABI__ +#endif // C2000_IEEE754_TYPES + + +//***************************************************************************** +// +// Emulated Bitbanded write +// +//***************************************************************************** +#define HWREGBITW(address, mask, value) \ + (*(volatile uint32_t *)(address)) = \ + ((*(volatile uint32_t *)(address)) & ~((uint32_t)1 << mask)) \ + | ((uint32_t)value << mask) + +#define HWREGBITHW(address, mask, value) \ + (*(volatile uint16_t *)(address)) = \ + ((*(volatile uint16_t *)(address)) & ~((uint16_t)1 << mask)) \ + | ((uint16_t)value << mask) + +//***************************************************************************** +// +// Emulated Bitbanded read +// +//***************************************************************************** +#define HWREGBITR(address, mask) \ + (((*(volatile uint32_t *)(address)) & ((uint32_t)1 << mask)) >> mask) + +#define HWREGBITHR(address, mask) \ + (((*(volatile uint16_t *)(address)) & ((uint16_t)1 << mask)) >> mask) + +//***************************************************************************** +// +// Extern compiler intrinsic prototypes. See compiler User's Guide for details. +// These are provided to satisfy static analysis tools. The #ifndef is required +// because the '&' is for a C++-style reference, and although it is the correct +// prototype, it will not build in C code. +// +//***************************************************************************** +#if(defined(__TMS320C28XX__) || defined(__TMS320C28XX_CLA__)) +#else +extern int16_t &__byte(int16_t *array, uint16_t byte_index); +extern uint32_t &__byte_peripheral_32(uint32_t *x); +#endif + +// +// C++ Bool Compatibility +// +#if defined(__cplusplus) +typedef bool _Bool; +#endif + +/* To fix Misra-C errors */ +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#endif // HW_TYPES_H diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_upp.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_upp.h new file mode 100644 index 0000000..9f73e9b --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_upp.h @@ -0,0 +1,306 @@ +//########################################################################### +// +// FILE: hw_upp.h +// +// TITLE: Definitions for the UPP registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_UPP_H +#define HW_UPP_H + +//************************************************************************************************* +// +// The following are defines for the UPP register offsets +// +//************************************************************************************************* +#define UPP_O_PID 0x0U // Peripheral ID Register +#define UPP_O_PERCTL 0x2U // Peripheral Control Register +#define UPP_O_CHCTL 0x8U // General Control Register +#define UPP_O_IFCFG 0xAU // Interface Configuration Register +#define UPP_O_IFIVAL 0xCU // Interface Idle Value Register +#define UPP_O_THCFG 0xEU // Threshold Configuration Register +#define UPP_O_RAWINTST 0x10U // Raw Interrupt Status Register +#define UPP_O_ENINTST 0x12U // Enable Interrupt Status Register +#define UPP_O_INTENSET 0x14U // Interrupt Enable Set Register +#define UPP_O_INTENCLR 0x16U // Interrupt Enable Clear Register +#define UPP_O_CHIDESC0 0x20U // DMA Channel I Descriptor 0 Register +#define UPP_O_CHIDESC1 0x22U // DMA Channel I Descriptor 1 Register +#define UPP_O_CHIDESC2 0x24U // DMA Channel I Descriptor 2 Register +#define UPP_O_CHIST0 0x28U // DMA Channel I Status 0 Register +#define UPP_O_CHIST1 0x2AU // DMA Channel I Status 1 Register +#define UPP_O_CHIST2 0x2CU // DMA Channel I Status 2 Register +#define UPP_O_CHQDESC0 0x30U // DMA Channel Q Descriptor 0 Register +#define UPP_O_CHQDESC1 0x32U // DMA Channel Q Descriptor 1 Register +#define UPP_O_CHQDESC2 0x34U // DMA Channel Q Descriptor 2 Register +#define UPP_O_CHQST0 0x38U // DMA Channel Q Status 0 Register +#define UPP_O_CHQST1 0x3AU // DMA Channel Q Status 1 Register +#define UPP_O_CHQST2 0x3CU // DMA Channel Q Status 2 Register +#define UPP_O_GINTEN 0x40U // Global Peripheral Interrupt Enable Register +#define UPP_O_GINTFLG 0x42U // Global Peripheral Interrupt Flag Register +#define UPP_O_GINTCLR 0x44U // Global Peripheral Interrupt Clear Register +#define UPP_O_DLYCTL 0x46U // IO clock data skew control Register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the PERCTL register +// +//************************************************************************************************* +#define UPP_PERCTL_FREE 0x1U // Emulation control. +#define UPP_PERCTL_SOFT 0x2U // Emulation control. +#define UPP_PERCTL_RTEMU 0x4U // Realtime emulation control. +#define UPP_PERCTL_PEREN 0x8U // Peripheral Enable +#define UPP_PERCTL_SOFTRST 0x10U // Software Reset +#define UPP_PERCTL_DMAST 0x80U // DMA Burst transaction status + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHCTL register +// +//************************************************************************************************* +#define UPP_CHCTL_MODE_S 0U +#define UPP_CHCTL_MODE_M 0x3U // Operating mode +#define UPP_CHCTL_SDRTXILA 0x8U // SDR TX Interleve mode +#define UPP_CHCTL_DEMUXA 0x10U // DDR de-multiplexing mode +#define UPP_CHCTL_DRA 0x10000U // Data rate + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IFCFG register +// +//************************************************************************************************* +#define UPP_IFCFG_STARTPOLA 0x1U // Polarity of START(SELECT) signal +#define UPP_IFCFG_ENAPOLA 0x2U // Polarity of ENABLE(WRITE) signal +#define UPP_IFCFG_WAITPOLA 0x4U // Polarity of WAIT signal. +#define UPP_IFCFG_STARTA 0x8U // Enable Usage of START (SELECT) signal +#define UPP_IFCFG_ENAA 0x10U // Enable Usage of ENABLE (WRITE) signal +#define UPP_IFCFG_WAITA 0x20U // Enable Usage of WAIT signal +#define UPP_IFCFG_CLKDIVA_S 8U +#define UPP_IFCFG_CLKDIVA_M 0xF00U // Clock divider for tx mode +#define UPP_IFCFG_CLKINVA 0x1000U // Clock inversion +#define UPP_IFCFG_TRISENA 0x2000U // Pin Tri-state Control + +//************************************************************************************************* +// +// The following are defines for the bit fields in the IFIVAL register +// +//************************************************************************************************* +#define UPP_IFIVAL_VALA_S 0U +#define UPP_IFIVAL_VALA_M 0x1FFU // Idle Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the THCFG register +// +//************************************************************************************************* +#define UPP_THCFG_RDSIZEI_S 0U +#define UPP_THCFG_RDSIZEI_M 0x3U // DMA Read Threshold for DMA Channel I +#define UPP_THCFG_RDSIZEQ_S 8U +#define UPP_THCFG_RDSIZEQ_M 0x300U // DMA Read Threshold for DMA Channel Q +#define UPP_THCFG_TXSIZEA_S 16U +#define UPP_THCFG_TXSIZEA_M 0x30000U // I/O Transmit Threshold Value + +//************************************************************************************************* +// +// The following are defines for the bit fields in the RAWINTST register +// +//************************************************************************************************* +#define UPP_RAWINTST_DPEI 0x1U // Interrupt raw status for DMA programming error +#define UPP_RAWINTST_UOEI 0x2U // Interrupt raw status for DMA under-run or over-run +#define UPP_RAWINTST_EOWI 0x8U // Interrupt raw status for end-of window condition +#define UPP_RAWINTST_EOLI 0x10U // Interrupt raw status for end-of-line condition +#define UPP_RAWINTST_DPEQ 0x100U // Interrupt raw status for DMA programming error +#define UPP_RAWINTST_UOEQ 0x200U // Interrupt raw status for DMA under-run or over-run +#define UPP_RAWINTST_EOWQ 0x800U // Interrupt raw status for end-of window condition +#define UPP_RAWINTST_EOLQ 0x1000U // Interrupt raw status for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the ENINTST register +// +//************************************************************************************************* +#define UPP_ENINTST_DPEI 0x1U // Interrupt enable status for DMA programming error +#define UPP_ENINTST_UOEI 0x2U // Interrupt enable status for DMA under-run or over-run +#define UPP_ENINTST_EOWI 0x8U // Interrupt enable status for end-of window condition +#define UPP_ENINTST_EOLI 0x10U // Interrupt enable status for end-of-line condition +#define UPP_ENINTST_DPEQ 0x100U // Interrupt enable status for DMA programming error +#define UPP_ENINTST_UOEQ 0x200U // Interrupt enable status for DMA under-run or over-run +#define UPP_ENINTST_EOWQ 0x800U // Interrupt enable status for end-of window condition +#define UPP_ENINTST_EOLQ 0x1000U // Interrupt enable status for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTENSET register +// +//************************************************************************************************* +#define UPP_INTENSET_DPEI 0x1U // Interrupt enable for DMA programming error +#define UPP_INTENSET_UOEI 0x2U // Interrupt enable for DMA under-run or over-run +#define UPP_INTENSET_EOWI 0x8U // Interrupt enable for end-of window condition +#define UPP_INTENSET_EOLI 0x10U // Interrupt enable for end-of-line condition +#define UPP_INTENSET_DPEQ 0x100U // Interrupt enable for DMA programming error +#define UPP_INTENSET_UOEQ 0x200U // Interrupt enable for DMA under-run or over-run +#define UPP_INTENSET_EOWQ 0x800U // Interrupt enable for end-of window condition +#define UPP_INTENSET_EOLQ 0x1000U // Interrupt enable for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the INTENCLR register +// +//************************************************************************************************* +#define UPP_INTENCLR_DPEI 0x1U // Interrupt clear for DMA programming error +#define UPP_INTENCLR_UOEI 0x2U // Interrupt clear for DMA under-run or over-run +#define UPP_INTENCLR_EOWI 0x8U // Interrupt clear for end-of window condition +#define UPP_INTENCLR_EOLI 0x10U // Interrupt clear for end-of-line condition +#define UPP_INTENCLR_DPEQ 0x100U // Interrupt clear for DMA programming error +#define UPP_INTENCLR_UOEQ 0x200U // Interrupt clear for DMA under-run or over-run +#define UPP_INTENCLR_EOWQ 0x800U // Interrupt clear for end-of window condition +#define UPP_INTENCLR_EOLQ 0x1000U // Interrupt clear for end-of-line condition + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIDESC1 register +// +//************************************************************************************************* +#define UPP_CHIDESC1_BCNT_S 0U +#define UPP_CHIDESC1_BCNT_M 0xFFFFU // Number of bytes in a line for DMA Channel I + // transfer. +#define UPP_CHIDESC1_LCNT_S 16U +#define UPP_CHIDESC1_LCNT_M 0xFFFF0000U // Number of lines in a window for DMA Channel I + // transfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIDESC2 register +// +//************************************************************************************************* +#define UPP_CHIDESC2_LOFFSET_S 0U +#define UPP_CHIDESC2_LOFFSET_M 0xFFFFU // Current start address to next start address offset. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIST1 register +// +//************************************************************************************************* +#define UPP_CHIST1_BCNT_S 0U +#define UPP_CHIST1_BCNT_M 0xFFFFU // Current byte number. +#define UPP_CHIST1_LCNT_S 16U +#define UPP_CHIST1_LCNT_M 0xFFFF0000U // Current line number. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHIST2 register +// +//************************************************************************************************* +#define UPP_CHIST2_ACT 0x1U // Status of DMA descriptor. +#define UPP_CHIST2_PEND 0x2U // Status of DMA. +#define UPP_CHIST2_WM_S 4U +#define UPP_CHIST2_WM_M 0xF0U // Watermark for FIFO block count for DMA Channel I tranfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQDESC1 register +// +//************************************************************************************************* +#define UPP_CHQDESC1_BCNT_S 0U +#define UPP_CHQDESC1_BCNT_M 0xFFFFU // Number of bytes in a line for DMA Channel Q + // transfer. +#define UPP_CHQDESC1_LCNT_S 16U +#define UPP_CHQDESC1_LCNT_M 0xFFFF0000U // Number of lines in a window for DMA Channel Q + // transfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQDESC2 register +// +//************************************************************************************************* +#define UPP_CHQDESC2_LOFFSET_S 0U +#define UPP_CHQDESC2_LOFFSET_M 0xFFFFU // Current start address to next start address offset. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQST1 register +// +//************************************************************************************************* +#define UPP_CHQST1_BCNT_S 0U +#define UPP_CHQST1_BCNT_M 0xFFFFU // Current byte number. +#define UPP_CHQST1_LCNT_S 16U +#define UPP_CHQST1_LCNT_M 0xFFFF0000U // Current line number. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the CHQST2 register +// +//************************************************************************************************* +#define UPP_CHQST2_ACT 0x1U // Status of DMA descriptor. +#define UPP_CHQST2_PEND 0x2U // Status of DMA. +#define UPP_CHQST2_WM_S 4U +#define UPP_CHQST2_WM_M 0xF0U // Watermark for FIFO block count for DMA Channel Q tranfer. + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTEN register +// +//************************************************************************************************* +#define UPP_GINTEN_GINTEN 0x1U // Global Interrupt Enable + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTFLG register +// +//************************************************************************************************* +#define UPP_GINTFLG_GINTFLG 0x1U // Global Interrupt Flag + +//************************************************************************************************* +// +// The following are defines for the bit fields in the GINTCLR register +// +//************************************************************************************************* +#define UPP_GINTCLR_GINTCLR 0x1U // Global Interrupt Clear + +//************************************************************************************************* +// +// The following are defines for the bit fields in the DLYCTL register +// +//************************************************************************************************* +#define UPP_DLYCTL_DLYDIS 0x1U // IO dealy control disable. +#define UPP_DLYCTL_DLYCTL_S 1U +#define UPP_DLYCTL_DLYCTL_M 0x6U // IO delay control. + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_usb.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_usb.h new file mode 100644 index 0000000..27907eb --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_usb.h @@ -0,0 +1,4614 @@ +//########################################################################### +// +// FILE: hw_usb.h +// +// TITLE: Definitions for the USB registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_USB_H +#define HW_USB_H + +//***************************************************************************** +// +// The following are defines for the Univeral Serial Bus register offsets. +// +//***************************************************************************** +#define USB_O_FADDR 0x00000000 // USB Device Functional Address +#define USB_O_POWER 0x00000001 // USB Power +#define USB_O_TXIS 0x00000002 // USB Transmit Interrupt Status +#define USB_O_RXIS 0x00000004 // USB Receive Interrupt Status +#define USB_O_TXIE 0x00000006 // USB Transmit Interrupt Enable +#define USB_O_RXIE 0x00000008 // USB Receive Interrupt Enable +#define USB_O_IS 0x0000000A // USB General Interrupt Status +#define USB_O_IE 0x0000000B // USB Interrupt Enable +#define USB_O_FRAME 0x0000000C // USB Frame Value +#define USB_O_EPIDX 0x0000000E // USB Endpoint Index +#define USB_O_TEST 0x0000000F // USB Test Mode +#define USB_O_FIFO0 0x00000020 // USB FIFO Endpoint 0 +#define USB_O_FIFO1 0x00000024 // USB FIFO Endpoint 1 +#define USB_O_FIFO2 0x00000028 // USB FIFO Endpoint 2 +#define USB_O_FIFO3 0x0000002C // USB FIFO Endpoint 3 +#define USB_O_FIFO4 0x00000030 // USB FIFO Endpoint 4 +#define USB_O_FIFO5 0x00000034 // USB FIFO Endpoint 5 +#define USB_O_FIFO6 0x00000038 // USB FIFO Endpoint 6 +#define USB_O_FIFO7 0x0000003C // USB FIFO Endpoint 7 +#define USB_O_FIFO8 0x00000040 // USB FIFO Endpoint 8 +#define USB_O_FIFO9 0x00000044 // USB FIFO Endpoint 9 +#define USB_O_FIFO10 0x00000048 // USB FIFO Endpoint 10 +#define USB_O_FIFO11 0x0000004C // USB FIFO Endpoint 11 +#define USB_O_FIFO12 0x00000050 // USB FIFO Endpoint 12 +#define USB_O_FIFO13 0x00000054 // USB FIFO Endpoint 13 +#define USB_O_FIFO14 0x00000058 // USB FIFO Endpoint 14 +#define USB_O_FIFO15 0x0000005C // USB FIFO Endpoint 15 +#define USB_O_DEVCTL 0x00000060 // USB Device Control +#define USB_O_TXFIFOSZ 0x00000062 // USB Transmit Dynamic FIFO Sizing +#define USB_O_RXFIFOSZ 0x00000063 // USB Receive Dynamic FIFO Sizing +#define USB_O_TXFIFOADD 0x00000064 // USB Transmit FIFO Start Address +#define USB_O_RXFIFOADD 0x00000066 // USB Receive FIFO Start Address +#define USB_O_CONTIM 0x0000007A // USB Connect Timing +#define USB_O_VPLEN 0x0000007B // USB OTG VBUS Pulse Timing +#define USB_O_FSEOF 0x0000007D // USB Full-Speed Last Transaction + // to End of Frame Timing +#define USB_O_LSEOF 0x0000007E // USB Low-Speed Last Transaction + // to End of Frame Timing +#define USB_O_TXFUNCADDR0 0x00000080 // USB Transmit Functional Address + // Endpoint 0 +#define USB_O_TXHUBADDR0 0x00000082 // USB Transmit Hub Address + // Endpoint 0 +#define USB_O_TXHUBPORT0 0x00000083 // USB Transmit Hub Port Endpoint 0 +#define USB_O_TXFUNCADDR1 0x00000088 // USB Transmit Functional Address + // Endpoint 1 +#define USB_O_TXHUBADDR1 0x0000008A // USB Transmit Hub Address + // Endpoint 1 +#define USB_O_TXHUBPORT1 0x0000008B // USB Transmit Hub Port Endpoint 1 +#define USB_O_RXFUNCADDR1 0x0000008C // USB Receive Functional Address + // Endpoint 1 +#define USB_O_RXHUBADDR1 0x0000008E // USB Receive Hub Address Endpoint + // 1 +#define USB_O_RXHUBPORT1 0x0000008F // USB Receive Hub Port Endpoint 1 +#define USB_O_TXFUNCADDR2 0x00000090 // USB Transmit Functional Address + // Endpoint 2 +#define USB_O_TXHUBADDR2 0x00000092 // USB Transmit Hub Address + // Endpoint 2 +#define USB_O_TXHUBPORT2 0x00000093 // USB Transmit Hub Port Endpoint 2 +#define USB_O_RXFUNCADDR2 0x00000094 // USB Receive Functional Address + // Endpoint 2 +#define USB_O_RXHUBADDR2 0x00000096 // USB Receive Hub Address Endpoint + // 2 +#define USB_O_RXHUBPORT2 0x00000097 // USB Receive Hub Port Endpoint 2 +#define USB_O_TXFUNCADDR3 0x00000098 // USB Transmit Functional Address + // Endpoint 3 +#define USB_O_TXHUBADDR3 0x0000009A // USB Transmit Hub Address + // Endpoint 3 +#define USB_O_TXHUBPORT3 0x0000009B // USB Transmit Hub Port Endpoint 3 +#define USB_O_RXFUNCADDR3 0x0000009C // USB Receive Functional Address + // Endpoint 3 +#define USB_O_RXHUBADDR3 0x0000009E // USB Receive Hub Address Endpoint + // 3 +#define USB_O_RXHUBPORT3 0x0000009F // USB Receive Hub Port Endpoint 3 +#define USB_O_TXFUNCADDR4 0x000000A0 // USB Transmit Functional Address + // Endpoint 4 +#define USB_O_TXHUBADDR4 0x000000A2 // USB Transmit Hub Address + // Endpoint 4 +#define USB_O_TXHUBPORT4 0x000000A3 // USB Transmit Hub Port Endpoint 4 +#define USB_O_RXFUNCADDR4 0x000000A4 // USB Receive Functional Address + // Endpoint 4 +#define USB_O_RXHUBADDR4 0x000000A6 // USB Receive Hub Address Endpoint + // 4 +#define USB_O_RXHUBPORT4 0x000000A7 // USB Receive Hub Port Endpoint 4 +#define USB_O_TXFUNCADDR5 0x000000A8 // USB Transmit Functional Address + // Endpoint 5 +#define USB_O_TXHUBADDR5 0x000000AA // USB Transmit Hub Address + // Endpoint 5 +#define USB_O_TXHUBPORT5 0x000000AB // USB Transmit Hub Port Endpoint 5 +#define USB_O_RXFUNCADDR5 0x000000AC // USB Receive Functional Address + // Endpoint 5 +#define USB_O_RXHUBADDR5 0x000000AE // USB Receive Hub Address Endpoint + // 5 +#define USB_O_RXHUBPORT5 0x000000AF // USB Receive Hub Port Endpoint 5 +#define USB_O_TXFUNCADDR6 0x000000B0 // USB Transmit Functional Address + // Endpoint 6 +#define USB_O_TXHUBADDR6 0x000000B2 // USB Transmit Hub Address + // Endpoint 6 +#define USB_O_TXHUBPORT6 0x000000B3 // USB Transmit Hub Port Endpoint 6 +#define USB_O_RXFUNCADDR6 0x000000B4 // USB Receive Functional Address + // Endpoint 6 +#define USB_O_RXHUBADDR6 0x000000B6 // USB Receive Hub Address Endpoint + // 6 +#define USB_O_RXHUBPORT6 0x000000B7 // USB Receive Hub Port Endpoint 6 +#define USB_O_TXFUNCADDR7 0x000000B8 // USB Transmit Functional Address + // Endpoint 7 +#define USB_O_TXHUBADDR7 0x000000BA // USB Transmit Hub Address + // Endpoint 7 +#define USB_O_TXHUBPORT7 0x000000BB // USB Transmit Hub Port Endpoint 7 +#define USB_O_RXFUNCADDR7 0x000000BC // USB Receive Functional Address + // Endpoint 7 +#define USB_O_RXHUBADDR7 0x000000BE // USB Receive Hub Address Endpoint + // 7 +#define USB_O_RXHUBPORT7 0x000000BF // USB Receive Hub Port Endpoint 7 +#define USB_O_TXFUNCADDR8 0x000000C0 // USB Transmit Functional Address + // Endpoint 8 +#define USB_O_TXHUBADDR8 0x000000C2 // USB Transmit Hub Address + // Endpoint 8 +#define USB_O_TXHUBPORT8 0x000000C3 // USB Transmit Hub Port Endpoint 8 +#define USB_O_RXFUNCADDR8 0x000000C4 // USB Receive Functional Address + // Endpoint 8 +#define USB_O_RXHUBADDR8 0x000000C6 // USB Receive Hub Address Endpoint + // 8 +#define USB_O_RXHUBPORT8 0x000000C7 // USB Receive Hub Port Endpoint 8 +#define USB_O_TXFUNCADDR9 0x000000C8 // USB Transmit Functional Address + // Endpoint 9 +#define USB_O_TXHUBADDR9 0x000000CA // USB Transmit Hub Address + // Endpoint 9 +#define USB_O_TXHUBPORT9 0x000000CB // USB Transmit Hub Port Endpoint 9 +#define USB_O_RXFUNCADDR9 0x000000CC // USB Receive Functional Address + // Endpoint 9 +#define USB_O_RXHUBADDR9 0x000000CE // USB Receive Hub Address Endpoint + // 9 +#define USB_O_RXHUBPORT9 0x000000CF // USB Receive Hub Port Endpoint 9 +#define USB_O_TXFUNCADDR10 0x000000D0 // USB Transmit Functional Address + // Endpoint 10 +#define USB_O_TXHUBADDR10 0x000000D2 // USB Transmit Hub Address + // Endpoint 10 +#define USB_O_TXHUBPORT10 0x000000D3 // USB Transmit Hub Port Endpoint + // 10 +#define USB_O_RXFUNCADDR10 0x000000D4 // USB Receive Functional Address + // Endpoint 10 +#define USB_O_RXHUBADDR10 0x000000D6 // USB Receive Hub Address Endpoint + // 10 +#define USB_O_RXHUBPORT10 0x000000D7 // USB Receive Hub Port Endpoint 10 +#define USB_O_TXFUNCADDR11 0x000000D8 // USB Transmit Functional Address + // Endpoint 11 +#define USB_O_TXHUBADDR11 0x000000DA // USB Transmit Hub Address + // Endpoint 11 +#define USB_O_TXHUBPORT11 0x000000DB // USB Transmit Hub Port Endpoint + // 11 +#define USB_O_RXFUNCADDR11 0x000000DC // USB Receive Functional Address + // Endpoint 11 +#define USB_O_RXHUBADDR11 0x000000DE // USB Receive Hub Address Endpoint + // 11 +#define USB_O_RXHUBPORT11 0x000000DF // USB Receive Hub Port Endpoint 11 +#define USB_O_TXFUNCADDR12 0x000000E0 // USB Transmit Functional Address + // Endpoint 12 +#define USB_O_TXHUBADDR12 0x000000E2 // USB Transmit Hub Address + // Endpoint 12 +#define USB_O_TXHUBPORT12 0x000000E3 // USB Transmit Hub Port Endpoint + // 12 +#define USB_O_RXFUNCADDR12 0x000000E4 // USB Receive Functional Address + // Endpoint 12 +#define USB_O_RXHUBADDR12 0x000000E6 // USB Receive Hub Address Endpoint + // 12 +#define USB_O_RXHUBPORT12 0x000000E7 // USB Receive Hub Port Endpoint 12 +#define USB_O_TXFUNCADDR13 0x000000E8 // USB Transmit Functional Address + // Endpoint 13 +#define USB_O_TXHUBADDR13 0x000000EA // USB Transmit Hub Address + // Endpoint 13 +#define USB_O_TXHUBPORT13 0x000000EB // USB Transmit Hub Port Endpoint + // 13 +#define USB_O_RXFUNCADDR13 0x000000EC // USB Receive Functional Address + // Endpoint 13 +#define USB_O_RXHUBADDR13 0x000000EE // USB Receive Hub Address Endpoint + // 13 +#define USB_O_RXHUBPORT13 0x000000EF // USB Receive Hub Port Endpoint 13 +#define USB_O_TXFUNCADDR14 0x000000F0 // USB Transmit Functional Address + // Endpoint 14 +#define USB_O_TXHUBADDR14 0x000000F2 // USB Transmit Hub Address + // Endpoint 14 +#define USB_O_TXHUBPORT14 0x000000F3 // USB Transmit Hub Port Endpoint + // 14 +#define USB_O_RXFUNCADDR14 0x000000F4 // USB Receive Functional Address + // Endpoint 14 +#define USB_O_RXHUBADDR14 0x000000F6 // USB Receive Hub Address Endpoint + // 14 +#define USB_O_RXHUBPORT14 0x000000F7 // USB Receive Hub Port Endpoint 14 +#define USB_O_TXFUNCADDR15 0x000000F8 // USB Transmit Functional Address + // Endpoint 15 +#define USB_O_TXHUBADDR15 0x000000FA // USB Transmit Hub Address + // Endpoint 15 +#define USB_O_TXHUBPORT15 0x000000FB // USB Transmit Hub Port Endpoint + // 15 +#define USB_O_RXFUNCADDR15 0x000000FC // USB Receive Functional Address + // Endpoint 15 +#define USB_O_RXHUBADDR15 0x000000FE // USB Receive Hub Address Endpoint + // 15 +#define USB_O_RXHUBPORT15 0x000000FF // USB Receive Hub Port Endpoint 15 +#define USB_O_CSRL0 0x00000102 // USB Control and Status Endpoint + // 0 Low +#define USB_O_CSRH0 0x00000103 // USB Control and Status Endpoint + // 0 High +#define USB_O_COUNT0 0x00000108 // USB Receive Byte Count Endpoint + // 0 +#define USB_O_TYPE0 0x0000010A // USB Type Endpoint 0 +#define USB_O_NAKLMT 0x0000010B // USB NAK Limit +#define USB_O_TXMAXP1 0x00000110 // USB Maximum Transmit Data + // Endpoint 1 +#define USB_O_TXCSRL1 0x00000112 // USB Transmit Control and Status + // Endpoint 1 Low +#define USB_O_TXCSRH1 0x00000113 // USB Transmit Control and Status + // Endpoint 1 High +#define USB_O_RXMAXP1 0x00000114 // USB Maximum Receive Data + // Endpoint 1 +#define USB_O_RXCSRL1 0x00000116 // USB Receive Control and Status + // Endpoint 1 Low +#define USB_O_RXCSRH1 0x00000117 // USB Receive Control and Status + // Endpoint 1 High +#define USB_O_RXCOUNT1 0x00000118 // USB Receive Byte Count Endpoint + // 1 +#define USB_O_TXTYPE1 0x0000011A // USB Host Transmit Configure Type + // Endpoint 1 +#define USB_O_TXINTERVAL1 0x0000011B // USB Host Transmit Interval + // Endpoint 1 +#define USB_O_RXTYPE1 0x0000011C // USB Host Configure Receive Type + // Endpoint 1 +#define USB_O_RXINTERVAL1 0x0000011D // USB Host Receive Polling + // Interval Endpoint 1 +#define USB_O_TXMAXP2 0x00000120 // USB Maximum Transmit Data + // Endpoint 2 +#define USB_O_TXCSRL2 0x00000122 // USB Transmit Control and Status + // Endpoint 2 Low +#define USB_O_TXCSRH2 0x00000123 // USB Transmit Control and Status + // Endpoint 2 High +#define USB_O_RXMAXP2 0x00000124 // USB Maximum Receive Data + // Endpoint 2 +#define USB_O_RXCSRL2 0x00000126 // USB Receive Control and Status + // Endpoint 2 Low +#define USB_O_RXCSRH2 0x00000127 // USB Receive Control and Status + // Endpoint 2 High +#define USB_O_RXCOUNT2 0x00000128 // USB Receive Byte Count Endpoint + // 2 +#define USB_O_TXTYPE2 0x0000012A // USB Host Transmit Configure Type + // Endpoint 2 +#define USB_O_TXINTERVAL2 0x0000012B // USB Host Transmit Interval + // Endpoint 2 +#define USB_O_RXTYPE2 0x0000012C // USB Host Configure Receive Type + // Endpoint 2 +#define USB_O_RXINTERVAL2 0x0000012D // USB Host Receive Polling + // Interval Endpoint 2 +#define USB_O_TXMAXP3 0x00000130 // USB Maximum Transmit Data + // Endpoint 3 +#define USB_O_TXCSRL3 0x00000132 // USB Transmit Control and Status + // Endpoint 3 Low +#define USB_O_TXCSRH3 0x00000133 // USB Transmit Control and Status + // Endpoint 3 High +#define USB_O_RXMAXP3 0x00000134 // USB Maximum Receive Data + // Endpoint 3 +#define USB_O_RXCSRL3 0x00000136 // USB Receive Control and Status + // Endpoint 3 Low +#define USB_O_RXCSRH3 0x00000137 // USB Receive Control and Status + // Endpoint 3 High +#define USB_O_RXCOUNT3 0x00000138 // USB Receive Byte Count Endpoint + // 3 +#define USB_O_TXTYPE3 0x0000013A // USB Host Transmit Configure Type + // Endpoint 3 +#define USB_O_TXINTERVAL3 0x0000013B // USB Host Transmit Interval + // Endpoint 3 +#define USB_O_RXTYPE3 0x0000013C // USB Host Configure Receive Type + // Endpoint 3 +#define USB_O_RXINTERVAL3 0x0000013D // USB Host Receive Polling + // Interval Endpoint 3 +#define USB_O_TXMAXP4 0x00000140 // USB Maximum Transmit Data + // Endpoint 4 +#define USB_O_TXCSRL4 0x00000142 // USB Transmit Control and Status + // Endpoint 4 Low +#define USB_O_TXCSRH4 0x00000143 // USB Transmit Control and Status + // Endpoint 4 High +#define USB_O_RXMAXP4 0x00000144 // USB Maximum Receive Data + // Endpoint 4 +#define USB_O_RXCSRL4 0x00000146 // USB Receive Control and Status + // Endpoint 4 Low +#define USB_O_RXCSRH4 0x00000147 // USB Receive Control and Status + // Endpoint 4 High +#define USB_O_RXCOUNT4 0x00000148 // USB Receive Byte Count Endpoint + // 4 +#define USB_O_TXTYPE4 0x0000014A // USB Host Transmit Configure Type + // Endpoint 4 +#define USB_O_TXINTERVAL4 0x0000014B // USB Host Transmit Interval + // Endpoint 4 +#define USB_O_RXTYPE4 0x0000014C // USB Host Configure Receive Type + // Endpoint 4 +#define USB_O_RXINTERVAL4 0x0000014D // USB Host Receive Polling + // Interval Endpoint 4 +#define USB_O_TXMAXP5 0x00000150 // USB Maximum Transmit Data + // Endpoint 5 +#define USB_O_TXCSRL5 0x00000152 // USB Transmit Control and Status + // Endpoint 5 Low +#define USB_O_TXCSRH5 0x00000153 // USB Transmit Control and Status + // Endpoint 5 High +#define USB_O_RXMAXP5 0x00000154 // USB Maximum Receive Data + // Endpoint 5 +#define USB_O_RXCSRL5 0x00000156 // USB Receive Control and Status + // Endpoint 5 Low +#define USB_O_RXCSRH5 0x00000157 // USB Receive Control and Status + // Endpoint 5 High +#define USB_O_RXCOUNT5 0x00000158 // USB Receive Byte Count Endpoint + // 5 +#define USB_O_TXTYPE5 0x0000015A // USB Host Transmit Configure Type + // Endpoint 5 +#define USB_O_TXINTERVAL5 0x0000015B // USB Host Transmit Interval + // Endpoint 5 +#define USB_O_RXTYPE5 0x0000015C // USB Host Configure Receive Type + // Endpoint 5 +#define USB_O_RXINTERVAL5 0x0000015D // USB Host Receive Polling + // Interval Endpoint 5 +#define USB_O_TXMAXP6 0x00000160 // USB Maximum Transmit Data + // Endpoint 6 +#define USB_O_TXCSRL6 0x00000162 // USB Transmit Control and Status + // Endpoint 6 Low +#define USB_O_TXCSRH6 0x00000163 // USB Transmit Control and Status + // Endpoint 6 High +#define USB_O_RXMAXP6 0x00000164 // USB Maximum Receive Data + // Endpoint 6 +#define USB_O_RXCSRL6 0x00000166 // USB Receive Control and Status + // Endpoint 6 Low +#define USB_O_RXCSRH6 0x00000167 // USB Receive Control and Status + // Endpoint 6 High +#define USB_O_RXCOUNT6 0x00000168 // USB Receive Byte Count Endpoint + // 6 +#define USB_O_TXTYPE6 0x0000016A // USB Host Transmit Configure Type + // Endpoint 6 +#define USB_O_TXINTERVAL6 0x0000016B // USB Host Transmit Interval + // Endpoint 6 +#define USB_O_RXTYPE6 0x0000016C // USB Host Configure Receive Type + // Endpoint 6 +#define USB_O_RXINTERVAL6 0x0000016D // USB Host Receive Polling + // Interval Endpoint 6 +#define USB_O_TXMAXP7 0x00000170 // USB Maximum Transmit Data + // Endpoint 7 +#define USB_O_TXCSRL7 0x00000172 // USB Transmit Control and Status + // Endpoint 7 Low +#define USB_O_TXCSRH7 0x00000173 // USB Transmit Control and Status + // Endpoint 7 High +#define USB_O_RXMAXP7 0x00000174 // USB Maximum Receive Data + // Endpoint 7 +#define USB_O_RXCSRL7 0x00000176 // USB Receive Control and Status + // Endpoint 7 Low +#define USB_O_RXCSRH7 0x00000177 // USB Receive Control and Status + // Endpoint 7 High +#define USB_O_RXCOUNT7 0x00000178 // USB Receive Byte Count Endpoint + // 7 +#define USB_O_TXTYPE7 0x0000017A // USB Host Transmit Configure Type + // Endpoint 7 +#define USB_O_TXINTERVAL7 0x0000017B // USB Host Transmit Interval + // Endpoint 7 +#define USB_O_RXTYPE7 0x0000017C // USB Host Configure Receive Type + // Endpoint 7 +#define USB_O_RXINTERVAL7 0x0000017D // USB Host Receive Polling + // Interval Endpoint 7 +#define USB_O_TXMAXP8 0x00000180 // USB Maximum Transmit Data + // Endpoint 8 +#define USB_O_TXCSRL8 0x00000182 // USB Transmit Control and Status + // Endpoint 8 Low +#define USB_O_TXCSRH8 0x00000183 // USB Transmit Control and Status + // Endpoint 8 High +#define USB_O_RXMAXP8 0x00000184 // USB Maximum Receive Data + // Endpoint 8 +#define USB_O_RXCSRL8 0x00000186 // USB Receive Control and Status + // Endpoint 8 Low +#define USB_O_RXCSRH8 0x00000187 // USB Receive Control and Status + // Endpoint 8 High +#define USB_O_RXCOUNT8 0x00000188 // USB Receive Byte Count Endpoint + // 8 +#define USB_O_TXTYPE8 0x0000018A // USB Host Transmit Configure Type + // Endpoint 8 +#define USB_O_TXINTERVAL8 0x0000018B // USB Host Transmit Interval + // Endpoint 8 +#define USB_O_RXTYPE8 0x0000018C // USB Host Configure Receive Type + // Endpoint 8 +#define USB_O_RXINTERVAL8 0x0000018D // USB Host Receive Polling + // Interval Endpoint 8 +#define USB_O_TXMAXP9 0x00000190 // USB Maximum Transmit Data + // Endpoint 9 +#define USB_O_TXCSRL9 0x00000192 // USB Transmit Control and Status + // Endpoint 9 Low +#define USB_O_TXCSRH9 0x00000193 // USB Transmit Control and Status + // Endpoint 9 High +#define USB_O_RXMAXP9 0x00000194 // USB Maximum Receive Data + // Endpoint 9 +#define USB_O_RXCSRL9 0x00000196 // USB Receive Control and Status + // Endpoint 9 Low +#define USB_O_RXCSRH9 0x00000197 // USB Receive Control and Status + // Endpoint 9 High +#define USB_O_RXCOUNT9 0x00000198 // USB Receive Byte Count Endpoint + // 9 +#define USB_O_TXTYPE9 0x0000019A // USB Host Transmit Configure Type + // Endpoint 9 +#define USB_O_TXINTERVAL9 0x0000019B // USB Host Transmit Interval + // Endpoint 9 +#define USB_O_RXTYPE9 0x0000019C // USB Host Configure Receive Type + // Endpoint 9 +#define USB_O_RXINTERVAL9 0x0000019D // USB Host Receive Polling + // Interval Endpoint 9 +#define USB_O_TXMAXP10 0x000001A0 // USB Maximum Transmit Data + // Endpoint 10 +#define USB_O_TXCSRL10 0x000001A2 // USB Transmit Control and Status + // Endpoint 10 Low +#define USB_O_TXCSRH10 0x000001A3 // USB Transmit Control and Status + // Endpoint 10 High +#define USB_O_RXMAXP10 0x000001A4 // USB Maximum Receive Data + // Endpoint 10 +#define USB_O_RXCSRL10 0x000001A6 // USB Receive Control and Status + // Endpoint 10 Low +#define USB_O_RXCSRH10 0x000001A7 // USB Receive Control and Status + // Endpoint 10 High +#define USB_O_RXCOUNT10 0x000001A8 // USB Receive Byte Count Endpoint + // 10 +#define USB_O_TXTYPE10 0x000001AA // USB Host Transmit Configure Type + // Endpoint 10 +#define USB_O_TXINTERVAL10 0x000001AB // USB Host Transmit Interval + // Endpoint 10 +#define USB_O_RXTYPE10 0x000001AC // USB Host Configure Receive Type + // Endpoint 10 +#define USB_O_RXINTERVAL10 0x000001AD // USB Host Receive Polling + // Interval Endpoint 10 +#define USB_O_TXMAXP11 0x000001B0 // USB Maximum Transmit Data + // Endpoint 11 +#define USB_O_TXCSRL11 0x000001B2 // USB Transmit Control and Status + // Endpoint 11 Low +#define USB_O_TXCSRH11 0x000001B3 // USB Transmit Control and Status + // Endpoint 11 High +#define USB_O_RXMAXP11 0x000001B4 // USB Maximum Receive Data + // Endpoint 11 +#define USB_O_RXCSRL11 0x000001B6 // USB Receive Control and Status + // Endpoint 11 Low +#define USB_O_RXCSRH11 0x000001B7 // USB Receive Control and Status + // Endpoint 11 High +#define USB_O_RXCOUNT11 0x000001B8 // USB Receive Byte Count Endpoint + // 11 +#define USB_O_TXTYPE11 0x000001BA // USB Host Transmit Configure Type + // Endpoint 11 +#define USB_O_TXINTERVAL11 0x000001BB // USB Host Transmit Interval + // Endpoint 11 +#define USB_O_RXTYPE11 0x000001BC // USB Host Configure Receive Type + // Endpoint 11 +#define USB_O_RXINTERVAL11 0x000001BD // USB Host Receive Polling + // Interval Endpoint 11 +#define USB_O_TXMAXP12 0x000001C0 // USB Maximum Transmit Data + // Endpoint 12 +#define USB_O_TXCSRL12 0x000001C2 // USB Transmit Control and Status + // Endpoint 12 Low +#define USB_O_TXCSRH12 0x000001C3 // USB Transmit Control and Status + // Endpoint 12 High +#define USB_O_RXMAXP12 0x000001C4 // USB Maximum Receive Data + // Endpoint 12 +#define USB_O_RXCSRL12 0x000001C6 // USB Receive Control and Status + // Endpoint 12 Low +#define USB_O_RXCSRH12 0x000001C7 // USB Receive Control and Status + // Endpoint 12 High +#define USB_O_RXCOUNT12 0x000001C8 // USB Receive Byte Count Endpoint + // 12 +#define USB_O_TXTYPE12 0x000001CA // USB Host Transmit Configure Type + // Endpoint 12 +#define USB_O_TXINTERVAL12 0x000001CB // USB Host Transmit Interval + // Endpoint 12 +#define USB_O_RXTYPE12 0x000001CC // USB Host Configure Receive Type + // Endpoint 12 +#define USB_O_RXINTERVAL12 0x000001CD // USB Host Receive Polling + // Interval Endpoint 12 +#define USB_O_TXMAXP13 0x000001D0 // USB Maximum Transmit Data + // Endpoint 13 +#define USB_O_TXCSRL13 0x000001D2 // USB Transmit Control and Status + // Endpoint 13 Low +#define USB_O_TXCSRH13 0x000001D3 // USB Transmit Control and Status + // Endpoint 13 High +#define USB_O_RXMAXP13 0x000001D4 // USB Maximum Receive Data + // Endpoint 13 +#define USB_O_RXCSRL13 0x000001D6 // USB Receive Control and Status + // Endpoint 13 Low +#define USB_O_RXCSRH13 0x000001D7 // USB Receive Control and Status + // Endpoint 13 High +#define USB_O_RXCOUNT13 0x000001D8 // USB Receive Byte Count Endpoint + // 13 +#define USB_O_TXTYPE13 0x000001DA // USB Host Transmit Configure Type + // Endpoint 13 +#define USB_O_TXINTERVAL13 0x000001DB // USB Host Transmit Interval + // Endpoint 13 +#define USB_O_RXTYPE13 0x000001DC // USB Host Configure Receive Type + // Endpoint 13 +#define USB_O_RXINTERVAL13 0x000001DD // USB Host Receive Polling + // Interval Endpoint 13 +#define USB_O_TXMAXP14 0x000001E0 // USB Maximum Transmit Data + // Endpoint 14 +#define USB_O_TXCSRL14 0x000001E2 // USB Transmit Control and Status + // Endpoint 14 Low +#define USB_O_TXCSRH14 0x000001E3 // USB Transmit Control and Status + // Endpoint 14 High +#define USB_O_RXMAXP14 0x000001E4 // USB Maximum Receive Data + // Endpoint 14 +#define USB_O_RXCSRL14 0x000001E6 // USB Receive Control and Status + // Endpoint 14 Low +#define USB_O_RXCSRH14 0x000001E7 // USB Receive Control and Status + // Endpoint 14 High +#define USB_O_RXCOUNT14 0x000001E8 // USB Receive Byte Count Endpoint + // 14 +#define USB_O_TXTYPE14 0x000001EA // USB Host Transmit Configure Type + // Endpoint 14 +#define USB_O_TXINTERVAL14 0x000001EB // USB Host Transmit Interval + // Endpoint 14 +#define USB_O_RXTYPE14 0x000001EC // USB Host Configure Receive Type + // Endpoint 14 +#define USB_O_RXINTERVAL14 0x000001ED // USB Host Receive Polling + // Interval Endpoint 14 +#define USB_O_TXMAXP15 0x000001F0 // USB Maximum Transmit Data + // Endpoint 15 +#define USB_O_TXCSRL15 0x000001F2 // USB Transmit Control and Status + // Endpoint 15 Low +#define USB_O_TXCSRH15 0x000001F3 // USB Transmit Control and Status + // Endpoint 15 High +#define USB_O_RXMAXP15 0x000001F4 // USB Maximum Receive Data + // Endpoint 15 +#define USB_O_RXCSRL15 0x000001F6 // USB Receive Control and Status + // Endpoint 15 Low +#define USB_O_RXCSRH15 0x000001F7 // USB Receive Control and Status + // Endpoint 15 High +#define USB_O_RXCOUNT15 0x000001F8 // USB Receive Byte Count Endpoint + // 15 +#define USB_O_TXTYPE15 0x000001FA // USB Host Transmit Configure Type + // Endpoint 15 +#define USB_O_TXINTERVAL15 0x000001FB // USB Host Transmit Interval + // Endpoint 15 +#define USB_O_RXTYPE15 0x000001FC // USB Host Configure Receive Type + // Endpoint 15 +#define USB_O_RXINTERVAL15 0x000001FD // USB Host Receive Polling + // Interval Endpoint 15 +#define USB_O_RQPKTCOUNT1 0x00000304 // USB Request Packet Count in + // Block Transfer Endpoint 1 +#define USB_O_RQPKTCOUNT2 0x00000308 // USB Request Packet Count in + // Block Transfer Endpoint 2 +#define USB_O_RQPKTCOUNT3 0x0000030C // USB Request Packet Count in + // Block Transfer Endpoint 3 +#define USB_O_RQPKTCOUNT4 0x00000310 // USB Request Packet Count in + // Block Transfer Endpoint 4 +#define USB_O_RQPKTCOUNT5 0x00000314 // USB Request Packet Count in + // Block Transfer Endpoint 5 +#define USB_O_RQPKTCOUNT6 0x00000318 // USB Request Packet Count in + // Block Transfer Endpoint 6 +#define USB_O_RQPKTCOUNT7 0x0000031C // USB Request Packet Count in + // Block Transfer Endpoint 7 +#define USB_O_RQPKTCOUNT8 0x00000320 // USB Request Packet Count in + // Block Transfer Endpoint 8 +#define USB_O_RQPKTCOUNT9 0x00000324 // USB Request Packet Count in + // Block Transfer Endpoint 9 +#define USB_O_RQPKTCOUNT10 0x00000328 // USB Request Packet Count in + // Block Transfer Endpoint 10 +#define USB_O_RQPKTCOUNT11 0x0000032C // USB Request Packet Count in + // Block Transfer Endpoint 11 +#define USB_O_RQPKTCOUNT12 0x00000330 // USB Request Packet Count in + // Block Transfer Endpoint 12 +#define USB_O_RQPKTCOUNT13 0x00000334 // USB Request Packet Count in + // Block Transfer Endpoint 13 +#define USB_O_RQPKTCOUNT14 0x00000338 // USB Request Packet Count in + // Block Transfer Endpoint 14 +#define USB_O_RQPKTCOUNT15 0x0000033C // USB Request Packet Count in + // Block Transfer Endpoint 15 +#define USB_O_RXDPKTBUFDIS 0x00000340 // USB Receive Double Packet Buffer + // Disable +#define USB_O_TXDPKTBUFDIS 0x00000342 // USB Transmit Double Packet + // Buffer Disable +#define USB_O_EPC 0x00000400 // USB External Power Control +#define USB_O_EPCRIS 0x00000404 // USB External Power Control Raw + // Interrupt Status +#define USB_O_EPCIM 0x00000408 // USB External Power Control + // Interrupt Mask +#define USB_O_EPCISC 0x0000040C // USB External Power Control + // Interrupt Status and Clear +#define USB_O_DRRIS 0x00000410 // USB Device RESUME Raw Interrupt + // Status +#define USB_O_DRIM 0x00000414 // USB Device RESUME Interrupt Mask +#define USB_O_DRISC 0x00000418 // USB Device RESUME Interrupt + // Status and Clear +#define USB_O_GPCS 0x0000041C // USB General-Purpose Control and + // Status +#define USB_O_VDC 0x00000430 // USB VBUS Droop Control +#define USB_O_VDCRIS 0x00000434 // USB VBUS Droop Control Raw + // Interrupt Status +#define USB_O_VDCIM 0x00000438 // USB VBUS Droop Control Interrupt + // Mask +#define USB_O_VDCISC 0x0000043C // USB VBUS Droop Control Interrupt + // Status and Clear +#define USB_O_IDVRIS 0x00000444 // USB ID Valid Detect Raw + // Interrupt Status +#define USB_O_IDVIM 0x00000448 // USB ID Valid Detect Interrupt + // Mask +#define USB_O_IDVISC 0x0000044C // USB ID Valid Detect Interrupt + // Status and Clear +#define USB_O_DMASEL 0x00000450 // USB DMA Select +#define USB_O_PP 0x00000FC0 // USB Peripheral Properties + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FADDR register. +// +//***************************************************************************** +#define USB_FADDR_M 0x0000007F // Function Address +#define USB_FADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_POWER register. +// +//***************************************************************************** +#define USB_POWER_ISOUP 0x00000080 // Isochronous Update +#define USB_POWER_SOFTCONN 0x00000040 // Soft Connect/Disconnect +#define USB_POWER_RESET 0x00000008 // RESET Signaling +#define USB_POWER_RESUME 0x00000004 // RESUME Signaling +#define USB_POWER_SUSPEND 0x00000002 // SUSPEND Mode +#define USB_POWER_PWRDNPHY 0x00000001 // Power Down PHY + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIS register. +// +//***************************************************************************** +#define USB_TXIS_EP15 0x00008000 // TX Endpoint 15 Interrupt +#define USB_TXIS_EP14 0x00004000 // TX Endpoint 14 Interrupt +#define USB_TXIS_EP13 0x00002000 // TX Endpoint 13 Interrupt +#define USB_TXIS_EP12 0x00001000 // TX Endpoint 12 Interrupt +#define USB_TXIS_EP11 0x00000800 // TX Endpoint 11 Interrupt +#define USB_TXIS_EP10 0x00000400 // TX Endpoint 10 Interrupt +#define USB_TXIS_EP9 0x00000200 // TX Endpoint 9 Interrupt +#define USB_TXIS_EP8 0x00000100 // TX Endpoint 8 Interrupt +#define USB_TXIS_EP7 0x00000080 // TX Endpoint 7 Interrupt +#define USB_TXIS_EP6 0x00000040 // TX Endpoint 6 Interrupt +#define USB_TXIS_EP5 0x00000020 // TX Endpoint 5 Interrupt +#define USB_TXIS_EP4 0x00000010 // TX Endpoint 4 Interrupt +#define USB_TXIS_EP3 0x00000008 // TX Endpoint 3 Interrupt +#define USB_TXIS_EP2 0x00000004 // TX Endpoint 2 Interrupt +#define USB_TXIS_EP1 0x00000002 // TX Endpoint 1 Interrupt +#define USB_TXIS_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIS register. +// +//***************************************************************************** +#define USB_RXIS_EP15 0x00008000 // RX Endpoint 15 Interrupt +#define USB_RXIS_EP14 0x00004000 // RX Endpoint 14 Interrupt +#define USB_RXIS_EP13 0x00002000 // RX Endpoint 13 Interrupt +#define USB_RXIS_EP12 0x00001000 // RX Endpoint 12 Interrupt +#define USB_RXIS_EP11 0x00000800 // RX Endpoint 11 Interrupt +#define USB_RXIS_EP10 0x00000400 // RX Endpoint 10 Interrupt +#define USB_RXIS_EP9 0x00000200 // RX Endpoint 9 Interrupt +#define USB_RXIS_EP8 0x00000100 // RX Endpoint 8 Interrupt +#define USB_RXIS_EP7 0x00000080 // RX Endpoint 7 Interrupt +#define USB_RXIS_EP6 0x00000040 // RX Endpoint 6 Interrupt +#define USB_RXIS_EP5 0x00000020 // RX Endpoint 5 Interrupt +#define USB_RXIS_EP4 0x00000010 // RX Endpoint 4 Interrupt +#define USB_RXIS_EP3 0x00000008 // RX Endpoint 3 Interrupt +#define USB_RXIS_EP2 0x00000004 // RX Endpoint 2 Interrupt +#define USB_RXIS_EP1 0x00000002 // RX Endpoint 1 Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXIE register. +// +//***************************************************************************** +#define USB_TXIE_EP15 0x00008000 // TX Endpoint 15 Interrupt Enable +#define USB_TXIE_EP14 0x00004000 // TX Endpoint 14 Interrupt Enable +#define USB_TXIE_EP13 0x00002000 // TX Endpoint 13 Interrupt Enable +#define USB_TXIE_EP12 0x00001000 // TX Endpoint 12 Interrupt Enable +#define USB_TXIE_EP11 0x00000800 // TX Endpoint 11 Interrupt Enable +#define USB_TXIE_EP10 0x00000400 // TX Endpoint 10 Interrupt Enable +#define USB_TXIE_EP9 0x00000200 // TX Endpoint 9 Interrupt Enable +#define USB_TXIE_EP8 0x00000100 // TX Endpoint 8 Interrupt Enable +#define USB_TXIE_EP7 0x00000080 // TX Endpoint 7 Interrupt Enable +#define USB_TXIE_EP6 0x00000040 // TX Endpoint 6 Interrupt Enable +#define USB_TXIE_EP5 0x00000020 // TX Endpoint 5 Interrupt Enable +#define USB_TXIE_EP4 0x00000010 // TX Endpoint 4 Interrupt Enable +#define USB_TXIE_EP3 0x00000008 // TX Endpoint 3 Interrupt Enable +#define USB_TXIE_EP2 0x00000004 // TX Endpoint 2 Interrupt Enable +#define USB_TXIE_EP1 0x00000002 // TX Endpoint 1 Interrupt Enable +#define USB_TXIE_EP0 0x00000001 // TX and RX Endpoint 0 Interrupt + // Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXIE register. +// +//***************************************************************************** +#define USB_RXIE_EP15 0x00008000 // RX Endpoint 15 Interrupt Enable +#define USB_RXIE_EP14 0x00004000 // RX Endpoint 14 Interrupt Enable +#define USB_RXIE_EP13 0x00002000 // RX Endpoint 13 Interrupt Enable +#define USB_RXIE_EP12 0x00001000 // RX Endpoint 12 Interrupt Enable +#define USB_RXIE_EP11 0x00000800 // RX Endpoint 11 Interrupt Enable +#define USB_RXIE_EP10 0x00000400 // RX Endpoint 10 Interrupt Enable +#define USB_RXIE_EP9 0x00000200 // RX Endpoint 9 Interrupt Enable +#define USB_RXIE_EP8 0x00000100 // RX Endpoint 8 Interrupt Enable +#define USB_RXIE_EP7 0x00000080 // RX Endpoint 7 Interrupt Enable +#define USB_RXIE_EP6 0x00000040 // RX Endpoint 6 Interrupt Enable +#define USB_RXIE_EP5 0x00000020 // RX Endpoint 5 Interrupt Enable +#define USB_RXIE_EP4 0x00000010 // RX Endpoint 4 Interrupt Enable +#define USB_RXIE_EP3 0x00000008 // RX Endpoint 3 Interrupt Enable +#define USB_RXIE_EP2 0x00000004 // RX Endpoint 2 Interrupt Enable +#define USB_RXIE_EP1 0x00000002 // RX Endpoint 1 Interrupt Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IS register. +// +//***************************************************************************** +#define USB_IS_VBUSERR 0x00000080 // VBUS Error +#define USB_IS_SESREQ 0x00000040 // SESSION REQUEST +#define USB_IS_DISCON 0x00000020 // Session Disconnect +#define USB_IS_CONN 0x00000010 // Session Connect +#define USB_IS_SOF 0x00000008 // Start of Frame +#define USB_IS_BABBLE 0x00000004 // Babble Detected +#define USB_IS_RESET 0x00000004 // RESET Signaling Detected +#define USB_IS_RESUME 0x00000002 // RESUME Signaling Detected +#define USB_IS_SUSPEND 0x00000001 // SUSPEND Signaling Detected + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IE register. +// +//***************************************************************************** +#define USB_IE_VBUSERR 0x00000080 // Enable VBUS Error Interrupt +#define USB_IE_SESREQ 0x00000040 // Enable Session Request +#define USB_IE_DISCON 0x00000020 // Enable Disconnect Interrupt +#define USB_IE_CONN 0x00000010 // Enable Connect Interrupt +#define USB_IE_SOF 0x00000008 // Enable Start-of-Frame Interrupt +#define USB_IE_BABBLE 0x00000004 // Enable Babble Interrupt +#define USB_IE_RESET 0x00000004 // Enable RESET Interrupt +#define USB_IE_RESUME 0x00000002 // Enable RESUME Interrupt +#define USB_IE_SUSPND 0x00000001 // Enable SUSPEND Interrupt + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FRAME register. +// +//***************************************************************************** +#define USB_FRAME_M 0x000007FF // Frame Number +#define USB_FRAME_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPIDX register. +// +//***************************************************************************** +#define USB_EPIDX_EPIDX_M 0x0000000F // Endpoint Index +#define USB_EPIDX_EPIDX_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TEST register. +// +//***************************************************************************** +#define USB_TEST_FORCEH 0x00000080 // Force Host Mode +#define USB_TEST_FIFOACC 0x00000040 // FIFO Access +#define USB_TEST_FORCEFS 0x00000020 // Force Full-Speed Mode + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO0 register. +// +//***************************************************************************** +#define USB_FIFO0_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO0_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO1 register. +// +//***************************************************************************** +#define USB_FIFO1_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO1_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO2 register. +// +//***************************************************************************** +#define USB_FIFO2_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO2_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO3 register. +// +//***************************************************************************** +#define USB_FIFO3_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO3_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO4 register. +// +//***************************************************************************** +#define USB_FIFO4_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO4_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO5 register. +// +//***************************************************************************** +#define USB_FIFO5_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO5_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO6 register. +// +//***************************************************************************** +#define USB_FIFO6_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO6_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO7 register. +// +//***************************************************************************** +#define USB_FIFO7_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO7_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO8 register. +// +//***************************************************************************** +#define USB_FIFO8_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO8_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO9 register. +// +//***************************************************************************** +#define USB_FIFO9_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO9_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO10 register. +// +//***************************************************************************** +#define USB_FIFO10_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO10_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO11 register. +// +//***************************************************************************** +#define USB_FIFO11_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO11_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO12 register. +// +//***************************************************************************** +#define USB_FIFO12_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO12_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO13 register. +// +//***************************************************************************** +#define USB_FIFO13_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO13_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO14 register. +// +//***************************************************************************** +#define USB_FIFO14_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO14_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FIFO15 register. +// +//***************************************************************************** +#define USB_FIFO15_EPDATA_M 0xFFFFFFFF // Endpoint Data +#define USB_FIFO15_EPDATA_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DEVCTL register. +// +//***************************************************************************** +#define USB_DEVCTL_DEV 0x00000080 // Device Mode +#define USB_DEVCTL_FSDEV 0x00000040 // Full-Speed Device Detected +#define USB_DEVCTL_LSDEV 0x00000020 // Low-Speed Device Detected +#define USB_DEVCTL_VBUS_M 0x00000018 // VBUS Level +#define USB_DEVCTL_VBUS_NONE 0x00000000 // Below SessionEnd +#define USB_DEVCTL_VBUS_SEND 0x00000008 // Above SessionEnd, below AValid +#define USB_DEVCTL_VBUS_AVALID 0x00000010 // Above AValid, below VBUSValid +#define USB_DEVCTL_VBUS_VALID 0x00000018 // Above VBUSValid +#define USB_DEVCTL_HOST 0x00000004 // Host Mode +#define USB_DEVCTL_HOSTREQ 0x00000002 // Host Request +#define USB_DEVCTL_SESSION 0x00000001 // Session Start/End + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOSZ register. +// +//***************************************************************************** +#define USB_TXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_TXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_TXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_TXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_TXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_TXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_TXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_TXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_TXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_TXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_TXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOSZ register. +// +//***************************************************************************** +#define USB_RXFIFOSZ_DPB 0x00000010 // Double Packet Buffer Support +#define USB_RXFIFOSZ_SIZE_M 0x0000000F // Max Packet Size +#define USB_RXFIFOSZ_SIZE_8 0x00000000 // 8 +#define USB_RXFIFOSZ_SIZE_16 0x00000001 // 16 +#define USB_RXFIFOSZ_SIZE_32 0x00000002 // 32 +#define USB_RXFIFOSZ_SIZE_64 0x00000003 // 64 +#define USB_RXFIFOSZ_SIZE_128 0x00000004 // 128 +#define USB_RXFIFOSZ_SIZE_256 0x00000005 // 256 +#define USB_RXFIFOSZ_SIZE_512 0x00000006 // 512 +#define USB_RXFIFOSZ_SIZE_1024 0x00000007 // 1024 +#define USB_RXFIFOSZ_SIZE_2048 0x00000008 // 2048 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFIFOADD +// register. +// +//***************************************************************************** +#define USB_TXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_TXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFIFOADD +// register. +// +//***************************************************************************** +#define USB_RXFIFOADD_ADDR_M 0x000001FF // Transmit/Receive Start Address +#define USB_RXFIFOADD_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CONTIM register. +// +//***************************************************************************** +#define USB_CONTIM_WTCON_M 0x000000F0 // Connect Wait +#define USB_CONTIM_WTID_M 0x0000000F // Wait ID +#define USB_CONTIM_WTCON_S 4 +#define USB_CONTIM_WTID_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VPLEN register. +// +//***************************************************************************** +#define USB_VPLEN_VPLEN_M 0x000000FF // VBUS Pulse Length +#define USB_VPLEN_VPLEN_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_FSEOF register. +// +//***************************************************************************** +#define USB_FSEOF_FSEOFG_M 0x000000FF // Full-Speed End-of-Frame Gap +#define USB_FSEOF_FSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_LSEOF register. +// +//***************************************************************************** +#define USB_LSEOF_LSEOFG_M 0x000000FF // Low-Speed End-of-Frame Gap +#define USB_LSEOF_LSEOFG_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR0 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR0_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR0 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR0_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR0_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT0 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT0_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT0_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR1 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR1_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR1 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR1_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR1_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT1 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT1_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT1_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR2 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR2_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR2 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR2_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR2_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT2 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT2_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT2_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR3 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR3_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR3 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR3_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR3_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT3 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT3_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT3_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR4 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR4_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR4 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR4_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR4_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT4 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT4_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT4_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR5 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR5_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR5 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR5_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR5_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT5 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT5_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT5_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR6 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR6_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR6 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR6_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR6_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT6 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT6_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT6_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR7 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR7_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR7 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR7_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR7_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT7 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT7_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT7_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR8 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR8_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR8 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR8_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT8 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT8_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT8_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR8 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR8_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR8 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR8_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR8_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT8 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT8_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT8_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR9 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR9_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR9 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR9_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT9 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT9_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT9_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR9 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR9_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR9 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR9_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR9_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT9 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT9_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT9_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR10 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR10_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR10 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR10_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT10 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT10_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT10_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR10 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR10_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR10 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR10_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR10_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT10 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT10_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT10_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR11 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR11_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR11 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR11_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT11 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT11_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT11_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR11 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR11_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR11 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR11_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR11_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT11 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT11_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT11_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR12 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR12_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR12 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR12_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT12 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT12_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT12_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR12 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR12_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR12 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR12_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR12_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT12 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT12_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT12_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR13 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR13_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR13 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR13_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT13 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT13_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT13_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR13 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR13_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR13 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR13_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR13_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT13 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT13_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT13_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR14 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR14_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR14 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR14_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT14 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT14_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT14_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR14 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR14_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR14 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR14_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR14_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT14 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT14_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT14_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXFUNCADDR15 +// register. +// +//***************************************************************************** +#define USB_TXFUNCADDR15_ADDR_M 0x0000007F // Device Address +#define USB_TXFUNCADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBADDR15 +// register. +// +//***************************************************************************** +#define USB_TXHUBADDR15_ADDR_M 0x0000007F // Hub Address +#define USB_TXHUBADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXHUBPORT15 +// register. +// +//***************************************************************************** +#define USB_TXHUBPORT15_PORT_M 0x0000007F // Hub Port +#define USB_TXHUBPORT15_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXFUNCADDR15 +// register. +// +//***************************************************************************** +#define USB_RXFUNCADDR15_ADDR_M 0x0000007F // Device Address +#define USB_RXFUNCADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBADDR15 +// register. +// +//***************************************************************************** +#define USB_RXHUBADDR15_ADDR_M 0x0000007F // Hub Address +#define USB_RXHUBADDR15_ADDR_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXHUBPORT15 +// register. +// +//***************************************************************************** +#define USB_RXHUBPORT15_PORT_M 0x0000007F // Hub Port +#define USB_RXHUBPORT15_PORT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRL0 register. +// +//***************************************************************************** +#define USB_CSRL0_NAKTO 0x00000080 // NAK Timeout +#define USB_CSRL0_SETENDC 0x00000080 // Setup End Clear +#define USB_CSRL0_STATUS 0x00000040 // STATUS Packet +#define USB_CSRL0_RXRDYC 0x00000040 // RXRDY Clear +#define USB_CSRL0_REQPKT 0x00000020 // Request Packet +#define USB_CSRL0_STALL 0x00000020 // Send Stall +#define USB_CSRL0_SETEND 0x00000010 // Setup End +#define USB_CSRL0_ERROR 0x00000010 // Error +#define USB_CSRL0_DATAEND 0x00000008 // Data End +#define USB_CSRL0_SETUP 0x00000008 // Setup Packet +#define USB_CSRL0_STALLED 0x00000004 // Endpoint Stalled +#define USB_CSRL0_TXRDY 0x00000002 // Transmit Packet Ready +#define USB_CSRL0_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_CSRH0 register. +// +//***************************************************************************** +#define USB_CSRH0_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_CSRH0_DT 0x00000002 // Data Toggle +#define USB_CSRH0_FLUSH 0x00000001 // Flush FIFO + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_COUNT0 register. +// +//***************************************************************************** +#define USB_COUNT0_COUNT_M 0x0000007F // FIFO Count +#define USB_COUNT0_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TYPE0 register. +// +//***************************************************************************** +#define USB_TYPE0_SPEED_M 0x000000C0 // Operating Speed +#define USB_TYPE0_SPEED_FULL 0x00000080 // Full +#define USB_TYPE0_SPEED_LOW 0x000000C0 // Low + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_NAKLMT register. +// +//***************************************************************************** +#define USB_NAKLMT_NAKLMT_M 0x0000001F // EP0 NAK Limit +#define USB_NAKLMT_NAKLMT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP1 register. +// +//***************************************************************************** +#define USB_TXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL1 register. +// +//***************************************************************************** +#define USB_TXCSRL1_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL1_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL1_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL1_STALL 0x00000010 // Send STALL +#define USB_TXCSRL1_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL1_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL1_ERROR 0x00000004 // Error +#define USB_TXCSRL1_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL1_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL1_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH1 register. +// +//***************************************************************************** +#define USB_TXCSRH1_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH1_MODE 0x00000020 // Mode +#define USB_TXCSRH1_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH1_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH1_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH1_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH1_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP1 register. +// +//***************************************************************************** +#define USB_RXMAXP1_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP1_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL1 register. +// +//***************************************************************************** +#define USB_RXCSRL1_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL1_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL1_STALL 0x00000020 // Send STALL +#define USB_RXCSRL1_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL1_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL1_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL1_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL1_OVER 0x00000004 // Overrun +#define USB_RXCSRL1_ERROR 0x00000004 // Error +#define USB_RXCSRL1_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL1_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH1 register. +// +//***************************************************************************** +#define USB_RXCSRH1_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH1_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH1_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH1_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH1_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH1_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH1_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH1_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH1_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT1 register. +// +//***************************************************************************** +#define USB_RXCOUNT1_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT1_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE1 register. +// +//***************************************************************************** +#define USB_TXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL1_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL1_TXPOLL_S \ + 0 +#define USB_TXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE1 register. +// +//***************************************************************************** +#define USB_RXTYPE1_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE1_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE1_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE1_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE1_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE1_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE1_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE1_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE1_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE1_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE1_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL1 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL1_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL1_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL1_TXPOLL_S \ + 0 +#define USB_RXINTERVAL1_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP2 register. +// +//***************************************************************************** +#define USB_TXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL2 register. +// +//***************************************************************************** +#define USB_TXCSRL2_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL2_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL2_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL2_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL2_STALL 0x00000010 // Send STALL +#define USB_TXCSRL2_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL2_ERROR 0x00000004 // Error +#define USB_TXCSRL2_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL2_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL2_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH2 register. +// +//***************************************************************************** +#define USB_TXCSRH2_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH2_MODE 0x00000020 // Mode +#define USB_TXCSRH2_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH2_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH2_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH2_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH2_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP2 register. +// +//***************************************************************************** +#define USB_RXMAXP2_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP2_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL2 register. +// +//***************************************************************************** +#define USB_RXCSRL2_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL2_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL2_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL2_STALL 0x00000020 // Send STALL +#define USB_RXCSRL2_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL2_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL2_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL2_ERROR 0x00000004 // Error +#define USB_RXCSRL2_OVER 0x00000004 // Overrun +#define USB_RXCSRL2_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL2_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH2 register. +// +//***************************************************************************** +#define USB_RXCSRH2_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH2_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH2_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH2_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH2_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH2_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH2_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH2_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH2_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT2 register. +// +//***************************************************************************** +#define USB_RXCOUNT2_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT2_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE2 register. +// +//***************************************************************************** +#define USB_TXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL2_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL2_NAKLMT_S \ + 0 +#define USB_TXINTERVAL2_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE2 register. +// +//***************************************************************************** +#define USB_RXTYPE2_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE2_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE2_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE2_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE2_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE2_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE2_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE2_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE2_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE2_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE2_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL2 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL2_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL2_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL2_TXPOLL_S \ + 0 +#define USB_RXINTERVAL2_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP3 register. +// +//***************************************************************************** +#define USB_TXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL3 register. +// +//***************************************************************************** +#define USB_TXCSRL3_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL3_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL3_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL3_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL3_STALL 0x00000010 // Send STALL +#define USB_TXCSRL3_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL3_ERROR 0x00000004 // Error +#define USB_TXCSRL3_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL3_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL3_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH3 register. +// +//***************************************************************************** +#define USB_TXCSRH3_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH3_MODE 0x00000020 // Mode +#define USB_TXCSRH3_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH3_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH3_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH3_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH3_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP3 register. +// +//***************************************************************************** +#define USB_RXMAXP3_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP3_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL3 register. +// +//***************************************************************************** +#define USB_RXCSRL3_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL3_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL3_STALL 0x00000020 // Send STALL +#define USB_RXCSRL3_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL3_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL3_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL3_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL3_ERROR 0x00000004 // Error +#define USB_RXCSRL3_OVER 0x00000004 // Overrun +#define USB_RXCSRL3_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL3_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH3 register. +// +//***************************************************************************** +#define USB_RXCSRH3_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH3_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH3_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH3_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH3_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH3_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH3_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH3_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH3_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT3 register. +// +//***************************************************************************** +#define USB_RXCOUNT3_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT3_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE3 register. +// +//***************************************************************************** +#define USB_TXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL3_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL3_TXPOLL_S \ + 0 +#define USB_TXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE3 register. +// +//***************************************************************************** +#define USB_RXTYPE3_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE3_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE3_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE3_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE3_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE3_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE3_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE3_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE3_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE3_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE3_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL3 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL3_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL3_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL3_TXPOLL_S \ + 0 +#define USB_RXINTERVAL3_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP4 register. +// +//***************************************************************************** +#define USB_TXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL4 register. +// +//***************************************************************************** +#define USB_TXCSRL4_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL4_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL4_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL4_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL4_STALL 0x00000010 // Send STALL +#define USB_TXCSRL4_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL4_ERROR 0x00000004 // Error +#define USB_TXCSRL4_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL4_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL4_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH4 register. +// +//***************************************************************************** +#define USB_TXCSRH4_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH4_MODE 0x00000020 // Mode +#define USB_TXCSRH4_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH4_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH4_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH4_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH4_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP4 register. +// +//***************************************************************************** +#define USB_RXMAXP4_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP4_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL4 register. +// +//***************************************************************************** +#define USB_RXCSRL4_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL4_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL4_STALL 0x00000020 // Send STALL +#define USB_RXCSRL4_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL4_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL4_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL4_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL4_OVER 0x00000004 // Overrun +#define USB_RXCSRL4_ERROR 0x00000004 // Error +#define USB_RXCSRL4_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL4_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH4 register. +// +//***************************************************************************** +#define USB_RXCSRH4_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH4_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH4_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH4_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH4_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH4_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH4_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH4_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH4_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT4 register. +// +//***************************************************************************** +#define USB_RXCOUNT4_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE4 register. +// +//***************************************************************************** +#define USB_TXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL4_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL4_NAKLMT_S \ + 0 +#define USB_TXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE4 register. +// +//***************************************************************************** +#define USB_RXTYPE4_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE4_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE4_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE4_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE4_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE4_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE4_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE4_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE4_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE4_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE4_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL4 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL4_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL4_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL4_NAKLMT_S \ + 0 +#define USB_RXINTERVAL4_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP5 register. +// +//***************************************************************************** +#define USB_TXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL5 register. +// +//***************************************************************************** +#define USB_TXCSRL5_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL5_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL5_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL5_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL5_STALL 0x00000010 // Send STALL +#define USB_TXCSRL5_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL5_ERROR 0x00000004 // Error +#define USB_TXCSRL5_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL5_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL5_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH5 register. +// +//***************************************************************************** +#define USB_TXCSRH5_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH5_MODE 0x00000020 // Mode +#define USB_TXCSRH5_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH5_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH5_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH5_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH5_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP5 register. +// +//***************************************************************************** +#define USB_RXMAXP5_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP5_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL5 register. +// +//***************************************************************************** +#define USB_RXCSRL5_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL5_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL5_STALL 0x00000020 // Send STALL +#define USB_RXCSRL5_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL5_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL5_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL5_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL5_ERROR 0x00000004 // Error +#define USB_RXCSRL5_OVER 0x00000004 // Overrun +#define USB_RXCSRL5_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL5_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH5 register. +// +//***************************************************************************** +#define USB_RXCSRH5_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH5_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH5_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH5_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH5_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH5_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH5_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH5_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH5_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT5 register. +// +//***************************************************************************** +#define USB_RXCOUNT5_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE5 register. +// +//***************************************************************************** +#define USB_TXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL5_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL5_NAKLMT_S \ + 0 +#define USB_TXINTERVAL5_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE5 register. +// +//***************************************************************************** +#define USB_RXTYPE5_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE5_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE5_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE5_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE5_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE5_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE5_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE5_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE5_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE5_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE5_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL5 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL5_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL5_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL5_TXPOLL_S \ + 0 +#define USB_RXINTERVAL5_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP6 register. +// +//***************************************************************************** +#define USB_TXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL6 register. +// +//***************************************************************************** +#define USB_TXCSRL6_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL6_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL6_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL6_STALL 0x00000010 // Send STALL +#define USB_TXCSRL6_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL6_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL6_ERROR 0x00000004 // Error +#define USB_TXCSRL6_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL6_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL6_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH6 register. +// +//***************************************************************************** +#define USB_TXCSRH6_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH6_MODE 0x00000020 // Mode +#define USB_TXCSRH6_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH6_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH6_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH6_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH6_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP6 register. +// +//***************************************************************************** +#define USB_RXMAXP6_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP6_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL6 register. +// +//***************************************************************************** +#define USB_RXCSRL6_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL6_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL6_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL6_STALL 0x00000020 // Send STALL +#define USB_RXCSRL6_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL6_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL6_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL6_ERROR 0x00000004 // Error +#define USB_RXCSRL6_OVER 0x00000004 // Overrun +#define USB_RXCSRL6_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL6_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH6 register. +// +//***************************************************************************** +#define USB_RXCSRH6_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH6_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH6_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH6_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH6_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH6_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH6_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH6_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH6_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT6 register. +// +//***************************************************************************** +#define USB_RXCOUNT6_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE6 register. +// +//***************************************************************************** +#define USB_TXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL6_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL6_TXPOLL_S \ + 0 +#define USB_TXINTERVAL6_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE6 register. +// +//***************************************************************************** +#define USB_RXTYPE6_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE6_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE6_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE6_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE6_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE6_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE6_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE6_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE6_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE6_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE6_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL6 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL6_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL6_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL6_NAKLMT_S \ + 0 +#define USB_RXINTERVAL6_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP7 register. +// +//***************************************************************************** +#define USB_TXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL7 register. +// +//***************************************************************************** +#define USB_TXCSRL7_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL7_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL7_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL7_STALL 0x00000010 // Send STALL +#define USB_TXCSRL7_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL7_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL7_ERROR 0x00000004 // Error +#define USB_TXCSRL7_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL7_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL7_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH7 register. +// +//***************************************************************************** +#define USB_TXCSRH7_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH7_MODE 0x00000020 // Mode +#define USB_TXCSRH7_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH7_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH7_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH7_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH7_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP7 register. +// +//***************************************************************************** +#define USB_RXMAXP7_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP7_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL7 register. +// +//***************************************************************************** +#define USB_RXCSRL7_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL7_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL7_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL7_STALL 0x00000020 // Send STALL +#define USB_RXCSRL7_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL7_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL7_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL7_ERROR 0x00000004 // Error +#define USB_RXCSRL7_OVER 0x00000004 // Overrun +#define USB_RXCSRL7_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL7_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH7 register. +// +//***************************************************************************** +#define USB_RXCSRH7_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH7_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH7_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH7_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH7_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH7_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH7_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH7_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH7_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT7 register. +// +//***************************************************************************** +#define USB_RXCOUNT7_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE7 register. +// +//***************************************************************************** +#define USB_TXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL7_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL7_NAKLMT_S \ + 0 +#define USB_TXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE7 register. +// +//***************************************************************************** +#define USB_RXTYPE7_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE7_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE7_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE7_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE7_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE7_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE7_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE7_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE7_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE7_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE7_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL7 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL7_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL7_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL7_NAKLMT_S \ + 0 +#define USB_RXINTERVAL7_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP8 register. +// +//***************************************************************************** +#define USB_TXMAXP8_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP8_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL8 register. +// +//***************************************************************************** +#define USB_TXCSRL8_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL8_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL8_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL8_STALL 0x00000010 // Send STALL +#define USB_TXCSRL8_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL8_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL8_ERROR 0x00000004 // Error +#define USB_TXCSRL8_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL8_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL8_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH8 register. +// +//***************************************************************************** +#define USB_TXCSRH8_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH8_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH8_MODE 0x00000020 // Mode +#define USB_TXCSRH8_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH8_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH8_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH8_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH8_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP8 register. +// +//***************************************************************************** +#define USB_RXMAXP8_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP8_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL8 register. +// +//***************************************************************************** +#define USB_RXCSRL8_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL8_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL8_STALL 0x00000020 // Send STALL +#define USB_RXCSRL8_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL8_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL8_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL8_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL8_OVER 0x00000004 // Overrun +#define USB_RXCSRL8_ERROR 0x00000004 // Error +#define USB_RXCSRL8_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL8_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH8 register. +// +//***************************************************************************** +#define USB_RXCSRH8_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH8_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH8_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH8_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH8_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH8_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH8_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH8_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH8_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT8 register. +// +//***************************************************************************** +#define USB_RXCOUNT8_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT8_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE8 register. +// +//***************************************************************************** +#define USB_TXTYPE8_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE8_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE8_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE8_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE8_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE8_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE8_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE8_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE8_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE8_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE8_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL8 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL8_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL8_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL8_NAKLMT_S \ + 0 +#define USB_TXINTERVAL8_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE8 register. +// +//***************************************************************************** +#define USB_RXTYPE8_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE8_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE8_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE8_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE8_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE8_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE8_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE8_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE8_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE8_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE8_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL8 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL8_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL8_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL8_NAKLMT_S \ + 0 +#define USB_RXINTERVAL8_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP9 register. +// +//***************************************************************************** +#define USB_TXMAXP9_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP9_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL9 register. +// +//***************************************************************************** +#define USB_TXCSRL9_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL9_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL9_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL9_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL9_STALL 0x00000010 // Send STALL +#define USB_TXCSRL9_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL9_ERROR 0x00000004 // Error +#define USB_TXCSRL9_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL9_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL9_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH9 register. +// +//***************************************************************************** +#define USB_TXCSRH9_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH9_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH9_MODE 0x00000020 // Mode +#define USB_TXCSRH9_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH9_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH9_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH9_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH9_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP9 register. +// +//***************************************************************************** +#define USB_RXMAXP9_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP9_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL9 register. +// +//***************************************************************************** +#define USB_RXCSRL9_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL9_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL9_STALL 0x00000020 // Send STALL +#define USB_RXCSRL9_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL9_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL9_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL9_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL9_ERROR 0x00000004 // Error +#define USB_RXCSRL9_OVER 0x00000004 // Overrun +#define USB_RXCSRL9_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL9_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH9 register. +// +//***************************************************************************** +#define USB_RXCSRH9_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH9_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH9_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH9_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH9_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH9_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH9_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH9_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH9_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT9 register. +// +//***************************************************************************** +#define USB_RXCOUNT9_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT9_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE9 register. +// +//***************************************************************************** +#define USB_TXTYPE9_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE9_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE9_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE9_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE9_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE9_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE9_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE9_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE9_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE9_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE9_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL9 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL9_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL9_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL9_TXPOLL_S \ + 0 +#define USB_TXINTERVAL9_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE9 register. +// +//***************************************************************************** +#define USB_RXTYPE9_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE9_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE9_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE9_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE9_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE9_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE9_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE9_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE9_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE9_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE9_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL9 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL9_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL9_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL9_NAKLMT_S \ + 0 +#define USB_RXINTERVAL9_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP10 register. +// +//***************************************************************************** +#define USB_TXMAXP10_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP10_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL10 register. +// +//***************************************************************************** +#define USB_TXCSRL10_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL10_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL10_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL10_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL10_STALL 0x00000010 // Send STALL +#define USB_TXCSRL10_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL10_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL10_ERROR 0x00000004 // Error +#define USB_TXCSRL10_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL10_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH10 register. +// +//***************************************************************************** +#define USB_TXCSRH10_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH10_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH10_MODE 0x00000020 // Mode +#define USB_TXCSRH10_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH10_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH10_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH10_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH10_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP10 register. +// +//***************************************************************************** +#define USB_RXMAXP10_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP10_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL10 register. +// +//***************************************************************************** +#define USB_RXCSRL10_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL10_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL10_STALL 0x00000020 // Send STALL +#define USB_RXCSRL10_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL10_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL10_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL10_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL10_OVER 0x00000004 // Overrun +#define USB_RXCSRL10_ERROR 0x00000004 // Error +#define USB_RXCSRL10_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL10_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH10 register. +// +//***************************************************************************** +#define USB_RXCSRH10_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH10_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH10_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH10_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH10_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH10_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH10_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH10_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH10_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT10 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT10_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT10_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE10 register. +// +//***************************************************************************** +#define USB_TXTYPE10_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE10_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE10_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE10_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE10_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE10_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE10_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE10_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE10_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE10_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE10_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL10 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL10_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL10_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL10_TXPOLL_S \ + 0 +#define USB_TXINTERVAL10_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE10 register. +// +//***************************************************************************** +#define USB_RXTYPE10_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE10_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE10_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE10_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE10_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE10_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE10_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE10_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE10_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE10_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE10_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL10 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL10_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL10_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL10_TXPOLL_S \ + 0 +#define USB_RXINTERVAL10_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP11 register. +// +//***************************************************************************** +#define USB_TXMAXP11_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP11_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL11 register. +// +//***************************************************************************** +#define USB_TXCSRL11_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL11_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL11_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL11_STALL 0x00000010 // Send STALL +#define USB_TXCSRL11_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL11_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL11_ERROR 0x00000004 // Error +#define USB_TXCSRL11_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL11_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL11_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH11 register. +// +//***************************************************************************** +#define USB_TXCSRH11_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH11_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH11_MODE 0x00000020 // Mode +#define USB_TXCSRH11_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH11_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH11_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH11_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH11_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP11 register. +// +//***************************************************************************** +#define USB_RXMAXP11_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP11_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL11 register. +// +//***************************************************************************** +#define USB_RXCSRL11_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL11_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL11_STALL 0x00000020 // Send STALL +#define USB_RXCSRL11_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL11_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL11_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL11_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL11_OVER 0x00000004 // Overrun +#define USB_RXCSRL11_ERROR 0x00000004 // Error +#define USB_RXCSRL11_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL11_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH11 register. +// +//***************************************************************************** +#define USB_RXCSRH11_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH11_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH11_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH11_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH11_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH11_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH11_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH11_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH11_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT11 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT11_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT11_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE11 register. +// +//***************************************************************************** +#define USB_TXTYPE11_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE11_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE11_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE11_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE11_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE11_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE11_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE11_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE11_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE11_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE11_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL11 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL11_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL11_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL11_NAKLMT_S \ + 0 +#define USB_TXINTERVAL11_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE11 register. +// +//***************************************************************************** +#define USB_RXTYPE11_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE11_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE11_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE11_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE11_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE11_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE11_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE11_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE11_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE11_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE11_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL11 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL11_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL11_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL11_TXPOLL_S \ + 0 +#define USB_RXINTERVAL11_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP12 register. +// +//***************************************************************************** +#define USB_TXMAXP12_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP12_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL12 register. +// +//***************************************************************************** +#define USB_TXCSRL12_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL12_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL12_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL12_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL12_STALL 0x00000010 // Send STALL +#define USB_TXCSRL12_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL12_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL12_ERROR 0x00000004 // Error +#define USB_TXCSRL12_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL12_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH12 register. +// +//***************************************************************************** +#define USB_TXCSRH12_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH12_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH12_MODE 0x00000020 // Mode +#define USB_TXCSRH12_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH12_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH12_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH12_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH12_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP12 register. +// +//***************************************************************************** +#define USB_RXMAXP12_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP12_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL12 register. +// +//***************************************************************************** +#define USB_RXCSRL12_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL12_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL12_STALL 0x00000020 // Send STALL +#define USB_RXCSRL12_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL12_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL12_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL12_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL12_ERROR 0x00000004 // Error +#define USB_RXCSRL12_OVER 0x00000004 // Overrun +#define USB_RXCSRL12_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL12_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH12 register. +// +//***************************************************************************** +#define USB_RXCSRH12_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH12_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH12_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH12_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH12_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH12_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH12_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH12_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH12_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT12 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT12_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT12_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE12 register. +// +//***************************************************************************** +#define USB_TXTYPE12_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE12_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE12_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE12_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE12_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE12_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE12_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE12_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE12_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE12_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE12_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL12 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL12_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL12_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL12_TXPOLL_S \ + 0 +#define USB_TXINTERVAL12_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE12 register. +// +//***************************************************************************** +#define USB_RXTYPE12_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE12_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE12_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE12_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE12_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE12_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE12_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE12_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE12_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE12_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE12_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL12 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL12_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL12_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL12_NAKLMT_S \ + 0 +#define USB_RXINTERVAL12_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP13 register. +// +//***************************************************************************** +#define USB_TXMAXP13_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP13_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL13 register. +// +//***************************************************************************** +#define USB_TXCSRL13_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL13_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL13_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL13_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL13_STALL 0x00000010 // Send STALL +#define USB_TXCSRL13_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL13_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL13_ERROR 0x00000004 // Error +#define USB_TXCSRL13_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL13_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH13 register. +// +//***************************************************************************** +#define USB_TXCSRH13_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH13_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH13_MODE 0x00000020 // Mode +#define USB_TXCSRH13_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH13_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH13_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH13_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH13_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP13 register. +// +//***************************************************************************** +#define USB_RXMAXP13_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP13_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL13 register. +// +//***************************************************************************** +#define USB_RXCSRL13_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL13_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL13_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL13_STALL 0x00000020 // Send STALL +#define USB_RXCSRL13_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL13_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL13_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL13_OVER 0x00000004 // Overrun +#define USB_RXCSRL13_ERROR 0x00000004 // Error +#define USB_RXCSRL13_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL13_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH13 register. +// +//***************************************************************************** +#define USB_RXCSRH13_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH13_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH13_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH13_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH13_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH13_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH13_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH13_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH13_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT13 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT13_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT13_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE13 register. +// +//***************************************************************************** +#define USB_TXTYPE13_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE13_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE13_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE13_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE13_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE13_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE13_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE13_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE13_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE13_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE13_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL13 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL13_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL13_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL13_TXPOLL_S \ + 0 +#define USB_TXINTERVAL13_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE13 register. +// +//***************************************************************************** +#define USB_RXTYPE13_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE13_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE13_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE13_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE13_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE13_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE13_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE13_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE13_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE13_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE13_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL13 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL13_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL13_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL13_TXPOLL_S \ + 0 +#define USB_RXINTERVAL13_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP14 register. +// +//***************************************************************************** +#define USB_TXMAXP14_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP14_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL14 register. +// +//***************************************************************************** +#define USB_TXCSRL14_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL14_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL14_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL14_STALL 0x00000010 // Send STALL +#define USB_TXCSRL14_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL14_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL14_ERROR 0x00000004 // Error +#define USB_TXCSRL14_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL14_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL14_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH14 register. +// +//***************************************************************************** +#define USB_TXCSRH14_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH14_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH14_MODE 0x00000020 // Mode +#define USB_TXCSRH14_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH14_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH14_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH14_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH14_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP14 register. +// +//***************************************************************************** +#define USB_RXMAXP14_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP14_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL14 register. +// +//***************************************************************************** +#define USB_RXCSRL14_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL14_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL14_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL14_STALL 0x00000020 // Send STALL +#define USB_RXCSRL14_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL14_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL14_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL14_OVER 0x00000004 // Overrun +#define USB_RXCSRL14_ERROR 0x00000004 // Error +#define USB_RXCSRL14_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL14_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH14 register. +// +//***************************************************************************** +#define USB_RXCSRH14_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH14_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH14_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH14_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH14_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH14_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH14_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH14_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH14_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT14 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT14_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT14_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE14 register. +// +//***************************************************************************** +#define USB_TXTYPE14_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE14_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE14_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE14_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE14_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE14_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE14_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE14_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE14_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE14_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE14_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL14 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL14_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL14_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL14_TXPOLL_S \ + 0 +#define USB_TXINTERVAL14_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE14 register. +// +//***************************************************************************** +#define USB_RXTYPE14_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE14_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE14_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE14_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE14_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE14_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE14_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE14_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE14_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE14_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE14_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL14 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL14_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL14_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL14_TXPOLL_S \ + 0 +#define USB_RXINTERVAL14_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXMAXP15 register. +// +//***************************************************************************** +#define USB_TXMAXP15_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_TXMAXP15_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRL15 register. +// +//***************************************************************************** +#define USB_TXCSRL15_NAKTO 0x00000080 // NAK Timeout +#define USB_TXCSRL15_CLRDT 0x00000040 // Clear Data Toggle +#define USB_TXCSRL15_STALLED 0x00000020 // Endpoint Stalled +#define USB_TXCSRL15_SETUP 0x00000010 // Setup Packet +#define USB_TXCSRL15_STALL 0x00000010 // Send STALL +#define USB_TXCSRL15_FLUSH 0x00000008 // Flush FIFO +#define USB_TXCSRL15_UNDRN 0x00000004 // Underrun +#define USB_TXCSRL15_ERROR 0x00000004 // Error +#define USB_TXCSRL15_FIFONE 0x00000002 // FIFO Not Empty +#define USB_TXCSRL15_TXRDY 0x00000001 // Transmit Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXCSRH15 register. +// +//***************************************************************************** +#define USB_TXCSRH15_AUTOSET 0x00000080 // Auto Set +#define USB_TXCSRH15_ISO 0x00000040 // Isochronous Transfers +#define USB_TXCSRH15_MODE 0x00000020 // Mode +#define USB_TXCSRH15_DMAEN 0x00000010 // DMA Request Enable +#define USB_TXCSRH15_FDT 0x00000008 // Force Data Toggle +#define USB_TXCSRH15_DMAMOD 0x00000004 // DMA Request Mode +#define USB_TXCSRH15_DTWE 0x00000002 // Data Toggle Write Enable +#define USB_TXCSRH15_DT 0x00000001 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXMAXP15 register. +// +//***************************************************************************** +#define USB_RXMAXP15_MAXLOAD_M 0x000007FF // Maximum Payload +#define USB_RXMAXP15_MAXLOAD_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRL15 register. +// +//***************************************************************************** +#define USB_RXCSRL15_CLRDT 0x00000080 // Clear Data Toggle +#define USB_RXCSRL15_STALLED 0x00000040 // Endpoint Stalled +#define USB_RXCSRL15_STALL 0x00000020 // Send STALL +#define USB_RXCSRL15_REQPKT 0x00000020 // Request Packet +#define USB_RXCSRL15_FLUSH 0x00000010 // Flush FIFO +#define USB_RXCSRL15_DATAERR 0x00000008 // Data Error +#define USB_RXCSRL15_NAKTO 0x00000008 // NAK Timeout +#define USB_RXCSRL15_ERROR 0x00000004 // Error +#define USB_RXCSRL15_OVER 0x00000004 // Overrun +#define USB_RXCSRL15_FULL 0x00000002 // FIFO Full +#define USB_RXCSRL15_RXRDY 0x00000001 // Receive Packet Ready + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCSRH15 register. +// +//***************************************************************************** +#define USB_RXCSRH15_AUTOCL 0x00000080 // Auto Clear +#define USB_RXCSRH15_AUTORQ 0x00000040 // Auto Request +#define USB_RXCSRH15_ISO 0x00000040 // Isochronous Transfers +#define USB_RXCSRH15_DMAEN 0x00000020 // DMA Request Enable +#define USB_RXCSRH15_PIDERR 0x00000010 // PID Error +#define USB_RXCSRH15_DISNYET 0x00000010 // Disable NYET +#define USB_RXCSRH15_DMAMOD 0x00000008 // DMA Request Mode +#define USB_RXCSRH15_DTWE 0x00000004 // Data Toggle Write Enable +#define USB_RXCSRH15_DT 0x00000002 // Data Toggle + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXCOUNT15 +// register. +// +//***************************************************************************** +#define USB_RXCOUNT15_COUNT_M 0x00001FFF // Receive Packet Count +#define USB_RXCOUNT15_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXTYPE15 register. +// +//***************************************************************************** +#define USB_TXTYPE15_SPEED_M 0x000000C0 // Operating Speed +#define USB_TXTYPE15_SPEED_DFLT 0x00000000 // Default +#define USB_TXTYPE15_SPEED_FULL 0x00000080 // Full +#define USB_TXTYPE15_SPEED_LOW 0x000000C0 // Low +#define USB_TXTYPE15_PROTO_M 0x00000030 // Protocol +#define USB_TXTYPE15_PROTO_CTRL 0x00000000 // Control +#define USB_TXTYPE15_PROTO_ISOC 0x00000010 // Isochronous +#define USB_TXTYPE15_PROTO_BULK 0x00000020 // Bulk +#define USB_TXTYPE15_PROTO_INT 0x00000030 // Interrupt +#define USB_TXTYPE15_TEP_M 0x0000000F // Target Endpoint Number +#define USB_TXTYPE15_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXINTERVAL15 +// register. +// +//***************************************************************************** +#define USB_TXINTERVAL15_TXPOLL_M \ + 0x000000FF // TX Polling +#define USB_TXINTERVAL15_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_TXINTERVAL15_NAKLMT_S \ + 0 +#define USB_TXINTERVAL15_TXPOLL_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXTYPE15 register. +// +//***************************************************************************** +#define USB_RXTYPE15_SPEED_M 0x000000C0 // Operating Speed +#define USB_RXTYPE15_SPEED_DFLT 0x00000000 // Default +#define USB_RXTYPE15_SPEED_FULL 0x00000080 // Full +#define USB_RXTYPE15_SPEED_LOW 0x000000C0 // Low +#define USB_RXTYPE15_PROTO_M 0x00000030 // Protocol +#define USB_RXTYPE15_PROTO_CTRL 0x00000000 // Control +#define USB_RXTYPE15_PROTO_ISOC 0x00000010 // Isochronous +#define USB_RXTYPE15_PROTO_BULK 0x00000020 // Bulk +#define USB_RXTYPE15_PROTO_INT 0x00000030 // Interrupt +#define USB_RXTYPE15_TEP_M 0x0000000F // Target Endpoint Number +#define USB_RXTYPE15_TEP_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXINTERVAL15 +// register. +// +//***************************************************************************** +#define USB_RXINTERVAL15_TXPOLL_M \ + 0x000000FF // RX Polling +#define USB_RXINTERVAL15_NAKLMT_M \ + 0x000000FF // NAK Limit +#define USB_RXINTERVAL15_TXPOLL_S \ + 0 +#define USB_RXINTERVAL15_NAKLMT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT1 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT1_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT1_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT2 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT2_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT2_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT3 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT3_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT3_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT4 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT4_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT4_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT5 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT5_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT5_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT6 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT6_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT6_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT7 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT7_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT7_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT8 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT8_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT8_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT9 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT9_COUNT_M 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT9_COUNT_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT10 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT10_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT10_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT11 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT11_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT11_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT12 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT12_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT12_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT13 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT13_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT13_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT14 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT14_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT14_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RQPKTCOUNT15 +// register. +// +//***************************************************************************** +#define USB_RQPKTCOUNT15_COUNT_M \ + 0x0000FFFF // Block Transfer Packet Count +#define USB_RQPKTCOUNT15_COUNT_S \ + 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_RXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_RXDPKTBUFDIS_EP15 0x00008000 // EP15 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP14 0x00004000 // EP14 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP13 0x00002000 // EP13 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP12 0x00001000 // EP12 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP11 0x00000800 // EP11 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP10 0x00000400 // EP10 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP9 0x00000200 // EP9 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP8 0x00000100 // EP8 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP7 0x00000080 // EP7 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP6 0x00000040 // EP6 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP5 0x00000020 // EP5 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP4 0x00000010 // EP4 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP3 0x00000008 // EP3 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP2 0x00000004 // EP2 RX Double-Packet Buffer + // Disable +#define USB_RXDPKTBUFDIS_EP1 0x00000002 // EP1 RX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_TXDPKTBUFDIS +// register. +// +//***************************************************************************** +#define USB_TXDPKTBUFDIS_EP15 0x00008000 // EP15 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP14 0x00004000 // EP14 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP13 0x00002000 // EP13 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP12 0x00001000 // EP12 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP11 0x00000800 // EP11 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP10 0x00000400 // EP10 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP9 0x00000200 // EP9 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP8 0x00000100 // EP8 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP7 0x00000080 // EP7 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP6 0x00000040 // EP6 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP5 0x00000020 // EP5 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP4 0x00000010 // EP4 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP3 0x00000008 // EP3 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP2 0x00000004 // EP2 TX Double-Packet Buffer + // Disable +#define USB_TXDPKTBUFDIS_EP1 0x00000002 // EP1 TX Double-Packet Buffer + // Disable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPC register. +// +//***************************************************************************** +#define USB_EPC_PFLTACT_M 0x00000300 // Power Fault Action +#define USB_EPC_PFLTACT_UNCHG 0x00000000 // Unchanged +#define USB_EPC_PFLTACT_TRIS 0x00000100 // Tristate +#define USB_EPC_PFLTACT_LOW 0x00000200 // Low +#define USB_EPC_PFLTACT_HIGH 0x00000300 // High +#define USB_EPC_PFLTAEN 0x00000040 // Power Fault Action Enable +#define USB_EPC_PFLTSEN_HIGH 0x00000020 // Power Fault Sense +#define USB_EPC_PFLTEN 0x00000010 // Power Fault Input Enable +#define USB_EPC_EPENDE 0x00000004 // EPEN Drive Enable +#define USB_EPC_EPEN_M 0x00000003 // External Power Supply Enable + // Configuration +#define USB_EPC_EPEN_LOW 0x00000000 // Power Enable Active Low +#define USB_EPC_EPEN_HIGH 0x00000001 // Power Enable Active High +#define USB_EPC_EPEN_VBLOW 0x00000002 // Power Enable High if VBUS Low +#define USB_EPC_EPEN_VBHIGH 0x00000003 // Power Enable High if VBUS High + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCRIS register. +// +//***************************************************************************** +#define USB_EPCRIS_PF 0x00000001 // USB Power Fault Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCIM register. +// +//***************************************************************************** +#define USB_EPCIM_PF 0x00000001 // USB Power Fault Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_EPCISC register. +// +//***************************************************************************** +#define USB_EPCISC_PF 0x00000001 // USB Power Fault Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRRIS register. +// +//***************************************************************************** +#define USB_DRRIS_RESUME 0x00000001 // RESUME Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRIM register. +// +//***************************************************************************** +#define USB_DRIM_RESUME 0x00000001 // RESUME Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DRISC register. +// +//***************************************************************************** +#define USB_DRISC_RESUME 0x00000001 // RESUME Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_GPCS register. +// +//***************************************************************************** +#define USB_GPCS_DEVMODOTG 0x00000002 // Enable Device Mode +#define USB_GPCS_DEVMOD 0x00000001 // Device Mode + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDC register. +// +//***************************************************************************** +#define USB_VDC_VBDEN 0x00000001 // VBUS Droop Enable + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCRIS register. +// +//***************************************************************************** +#define USB_VDCRIS_VD 0x00000001 // VBUS Droop Raw Interrupt Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCIM register. +// +//***************************************************************************** +#define USB_VDCIM_VD 0x00000001 // VBUS Droop Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_VDCISC register. +// +//***************************************************************************** +#define USB_VDCISC_VD 0x00000001 // VBUS Droop Interrupt Status and + // Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVRIS register. +// +//***************************************************************************** +#define USB_IDVRIS_ID 0x00000001 // ID Valid Detect Raw Interrupt + // Status + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVIM register. +// +//***************************************************************************** +#define USB_IDVIM_ID 0x00000001 // ID Valid Detect Interrupt Mask + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_IDVISC register. +// +//***************************************************************************** +#define USB_IDVISC_ID 0x00000001 // ID Valid Detect Interrupt Status + // and Clear + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_DMASEL register. +// +//***************************************************************************** +#define USB_DMASEL_DMACTX_M 0x00F00000 // DMA C TX Select +#define USB_DMASEL_DMACRX_M 0x000F0000 // DMA C RX Select +#define USB_DMASEL_DMABTX_M 0x0000F000 // DMA B TX Select +#define USB_DMASEL_DMABRX_M 0x00000F00 // DMA B RX Select +#define USB_DMASEL_DMAATX_M 0x000000F0 // DMA A TX Select +#define USB_DMASEL_DMAARX_M 0x0000000F // DMA A RX Select +#define USB_DMASEL_DMACTX_S 20 +#define USB_DMASEL_DMACRX_S 16 +#define USB_DMASEL_DMABTX_S 12 +#define USB_DMASEL_DMABRX_S 8 +#define USB_DMASEL_DMAATX_S 4 +#define USB_DMASEL_DMAARX_S 0 + +//***************************************************************************** +// +// The following are defines for the bit fields in the USB_O_PP register. +// +//***************************************************************************** +#define USB_PP_ECNT_M 0x0000FF00 // Endpoint Count +#define USB_PP_USB_M 0x000000C0 // USB Capability +#define USB_PP_USB_DEVICE 0x00000040 // DEVICE +#define USB_PP_USB_HOSTDEVICE 0x00000080 // HOST +#define USB_PP_USB_OTG 0x000000C0 // OTG +#define USB_PP_PHY 0x00000010 // PHY Present +#define USB_PP_TYPE_M 0x0000000F // Controller Type +#define USB_PP_TYPE_0 0x00000000 // The first-generation USB + // controller +#define USB_PP_ECNT_S 8 + +//***************************************************************************** +// +// The following definitions are deprecated. +// +//***************************************************************************** +#ifndef DEPRECATED + +//***************************************************************************** +// +// The following are deprecated defines for the bit fields in the +// USB_O_TXFIFOADD register. +// +//***************************************************************************** +#define USB_TXFIFOADD_ADDR_2048 0x00000009 // 2048 +#define USB_TXFIFOADD_ADDR_1024 0x00000008 // 1024 +#define USB_TXFIFOADD_ADDR_512 0x00000007 // 512 +#define USB_TXFIFOADD_ADDR_256 0x00000006 // 256 +#define USB_TXFIFOADD_ADDR_128 0x00000005 // 128 +#define USB_TXFIFOADD_ADDR_64 0x00000004 // 64 +#define USB_TXFIFOADD_ADDR_32 0x00000003 // 32 +#define USB_TXFIFOADD_ADDR_16 0x00000002 // 16 +#define USB_TXFIFOADD_ADDR_8 0x00000001 // 8 +#define USB_TXFIFOADD_ADDR_0 0x00000000 // 0 + +//***************************************************************************** +// +// The following are deprecated defines for the bit fields in the +// USB_O_RXFIFOADD register. +// +//***************************************************************************** +#define USB_RXFIFOADD_ADDR_2048 0x00000009 // 2048 +#define USB_RXFIFOADD_ADDR_1024 0x00000008 // 1024 +#define USB_RXFIFOADD_ADDR_512 0x00000007 // 512 +#define USB_RXFIFOADD_ADDR_256 0x00000006 // 256 +#define USB_RXFIFOADD_ADDR_128 0x00000005 // 128 +#define USB_RXFIFOADD_ADDR_64 0x00000004 // 64 +#define USB_RXFIFOADD_ADDR_32 0x00000003 // 32 +#define USB_RXFIFOADD_ADDR_16 0x00000002 // 16 +#define USB_RXFIFOADD_ADDR_8 0x00000001 // 8 +#define USB_RXFIFOADD_ADDR_0 0x00000000 // 0 + +#endif + +#endif // __HW_USB_H__ diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_xbar.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_xbar.h new file mode 100644 index 0000000..7869257 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_xbar.h @@ -0,0 +1,271 @@ +//########################################################################### +// +// FILE: hw_xbar.h +// +// TITLE: Definitions for the XBAR registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_XBAR_H +#define HW_XBAR_H + +//************************************************************************************************* +// +// The following are defines for the XBAR register offsets +// +//************************************************************************************************* +#define XBAR_O_FLG1 0x0U // X-Bar Input Flag Register 1 +#define XBAR_O_FLG2 0x2U // X-Bar Input Flag Register 2 +#define XBAR_O_FLG3 0x4U // X-Bar Input Flag Register 3 +#define XBAR_O_CLR1 0x8U // X-Bar Input Flag Clear Register 1 +#define XBAR_O_CLR2 0xAU // X-Bar Input Flag Clear Register 2 +#define XBAR_O_CLR3 0xCU // X-Bar Input Flag Clear Register 3 + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG1 register +// +//************************************************************************************************* +#define XBAR_FLG1_CMPSS1_CTRIPL 0x1U // Input Flag for CMPSS1.CTRIPL Signal +#define XBAR_FLG1_CMPSS1_CTRIPH 0x2U // Input Flag for CMPSS1.CTRIPH Signal +#define XBAR_FLG1_CMPSS2_CTRIPL 0x4U // Input Flag for CMPSS2.CTRIPL Signal +#define XBAR_FLG1_CMPSS2_CTRIPH 0x8U // Input Flag for CMPSS2.CTRIPH Signal +#define XBAR_FLG1_CMPSS3_CTRIPL 0x10U // Input Flag for CMPSS3.CTRIPL Signal +#define XBAR_FLG1_CMPSS3_CTRIPH 0x20U // Input Flag for CMPSS3.CTRIPH Signal +#define XBAR_FLG1_CMPSS4_CTRIPL 0x40U // Input Flag for CMPSS4.CTRIPL Signal +#define XBAR_FLG1_CMPSS4_CTRIPH 0x80U // Input Flag for CMPSS4.CTRIPH Signal +#define XBAR_FLG1_CMPSS5_CTRIPL 0x100U // Input Flag for CMPSS5.CTRIPL Signal +#define XBAR_FLG1_CMPSS5_CTRIPH 0x200U // Input Flag for CMPSS5.CTRIPH Signal +#define XBAR_FLG1_CMPSS6_CTRIPL 0x400U // Input Flag for CMPSS6.CTRIPL Signal +#define XBAR_FLG1_CMPSS6_CTRIPH 0x800U // Input Flag for CMPSS6.CTRIPH Signal +#define XBAR_FLG1_CMPSS7_CTRIPL 0x1000U // Input Flag for CMPSS7.CTRIPL Signal +#define XBAR_FLG1_CMPSS7_CTRIPH 0x2000U // Input Flag for CMPSS7.CTRIPH Signal +#define XBAR_FLG1_CMPSS8_CTRIPL 0x4000U // Input Flag for CMPSS8.CTRIPL Signal +#define XBAR_FLG1_CMPSS8_CTRIPH 0x8000U // Input Flag for CMPSS8.CTRIPH Signal +#define XBAR_FLG1_CMPSS1_CTRIPOUTL 0x10000U // Input Flag for CMPSS1.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS1_CTRIPOUTH 0x20000U // Input Flag for CMPSS1.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS2_CTRIPOUTL 0x40000U // Input Flag for CMPSS2.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS2_CTRIPOUTH 0x80000U // Input Flag for CMPSS2.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS3_CTRIPOUTL 0x100000U // Input Flag for CMPSS3.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS3_CTRIPOUTH 0x200000U // Input Flag for CMPSS3.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS4_CTRIPOUTL 0x400000U // Input Flag for CMPSS4.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS4_CTRIPOUTH 0x800000U // Input Flag for CMPSS4.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS5_CTRIPOUTL 0x1000000U // Input Flag for CMPSS5.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS5_CTRIPOUTH 0x2000000U // Input Flag for CMPSS5.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS6_CTRIPOUTL 0x4000000U // Input Flag for CMPSS6.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS6_CTRIPOUTH 0x8000000U // Input Flag for CMPSS6.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS7_CTRIPOUTL 0x10000000U // Input Flag for CMPSS7.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS7_CTRIPOUTH 0x20000000U // Input Flag for CMPSS7.CTRIPOUTH Signal +#define XBAR_FLG1_CMPSS8_CTRIPOUTL 0x40000000U // Input Flag for CMPSS8.CTRIPOUTL Signal +#define XBAR_FLG1_CMPSS8_CTRIPOUTH 0x80000000U // Input Flag for CMPSS8.CTRIPOUTH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG2 register +// +//************************************************************************************************* +#define XBAR_FLG2_INPUT1 0x1U // Input Flag for INPUT1 Signal +#define XBAR_FLG2_INPUT2 0x2U // Input Flag for INPUT2 Signal +#define XBAR_FLG2_INPUT3 0x4U // Input Flag for INPUT3 Signal +#define XBAR_FLG2_INPUT4 0x8U // Input Flag for INPUT4 Signal +#define XBAR_FLG2_INPUT5 0x10U // Input Flag for INPUT5 Signal +#define XBAR_FLG2_INPUT6 0x20U // Input Flag for INPUT6 Signal +#define XBAR_FLG2_ADCSOCAO 0x40U // Input Flag for ADCSOCAO Signal +#define XBAR_FLG2_ADCSOCBO 0x80U // Input Flag for ADCSOCBO Signal +#define XBAR_FLG2_CLB1_OUT4 0x100U // Input Flag for CLB1_OUT4 Signal +#define XBAR_FLG2_CLB1_OUT5 0x200U // Input Flag for CLB1_OUT5 Signal +#define XBAR_FLG2_CLB2_OUT4 0x400U // Input Flag for CLB2_OUT4 Signal +#define XBAR_FLG2_CLB2_OUT5 0x800U // Input Flag for CLB2_OUT5 Signal +#define XBAR_FLG2_CLB3_OUT4 0x1000U // Input Flag for CLB3_OUT4 Signal +#define XBAR_FLG2_CLB3_OUT5 0x2000U // Input Flag for CLB3_OUT5 Signal +#define XBAR_FLG2_CLB4_OUT4 0x4000U // Input Flag for CLB4_OUT4 Signal +#define XBAR_FLG2_CLB4_OUT5 0x8000U // Input Flag for CLB4_OUT5 Signal +#define XBAR_FLG2_ECAP1_OUT 0x10000U // Input Flag for ECAP1.OUT Signal +#define XBAR_FLG2_ECAP2_OUT 0x20000U // Input Flag for ECAP2.OUT Signal +#define XBAR_FLG2_ECAP3_OUT 0x40000U // Input Flag for ECAP3.OUT Signal +#define XBAR_FLG2_ECAP4_OUT 0x80000U // Input Flag for ECAP4.OUT Signal +#define XBAR_FLG2_ECAP5_OUT 0x100000U // Input Flag for ECAP5.OUT Signal +#define XBAR_FLG2_ECAP6_OUT 0x200000U // Input Flag for ECAP6.OUT Signal +#define XBAR_FLG2_EXTSYNCOUT 0x400000U // Input Flag for EXTSYNCOUT Signal +#define XBAR_FLG2_ADCAEVT1 0x800000U // Input Flag for ADCAEVT1 Signal +#define XBAR_FLG2_ADCAEVT2 0x1000000U // Input Flag for ADCAEVT2 Signal +#define XBAR_FLG2_ADCAEVT3 0x2000000U // Input Flag for ADCAEVT3 Signal +#define XBAR_FLG2_ADCAEVT4 0x4000000U // Input Flag for ADCAEVT4 Signal +#define XBAR_FLG2_ADCBEVT1 0x8000000U // Input Flag for ADCBEVT1 Signal +#define XBAR_FLG2_ADCBEVT2 0x10000000U // Input Flag for ADCBEVT2 Signal +#define XBAR_FLG2_ADCBEVT3 0x20000000U // Input Flag for ADCBEVT3 Signal +#define XBAR_FLG2_ADCBEVT4 0x40000000U // Input Flag for ADCBEVT4 Signal +#define XBAR_FLG2_ADCCEVT1 0x80000000U // Input Flag for ADCCEVT1 Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARFLG3 register +// +//************************************************************************************************* +#define XBAR_FLG3_ADCCEVT2 0x1U // Input Flag for ADCCEVT2 Signal +#define XBAR_FLG3_ADCCEVT3 0x2U // Input Flag for ADCCEVT3 Signal +#define XBAR_FLG3_ADCCEVT4 0x4U // Input Flag for ADCCEVT4 Signal +#define XBAR_FLG3_ADCDEVT1 0x8U // Input Flag for ADCDEVT1 Signal +#define XBAR_FLG3_ADCDEVT2 0x10U // Input Flag for ADCDEVT2 Signal +#define XBAR_FLG3_ADCDEVT3 0x20U // Input Flag for ADCDEVT3 Signal +#define XBAR_FLG3_ADCDEVT4 0x40U // Input Flag for ADCDEVT4 Signal +#define XBAR_FLG3_SD1FLT1_COMPL 0x80U // Input Flag for SD1FLT1.COMPL Signal +#define XBAR_FLG3_SD1FLT1_COMPH 0x100U // Input Flag for SD1FLT1.COMPH Signal +#define XBAR_FLG3_SD1FLT2_COMPL 0x200U // Input Flag for SD1FLT2.COMPL Signal +#define XBAR_FLG3_SD1FLT2_COMPH 0x400U // Input Flag for SD1FLT2.COMPH Signal +#define XBAR_FLG3_SD1FLT3_COMPL 0x800U // Input Flag for SD1FLT3.COMPL Signal +#define XBAR_FLG3_SD1FLT3_COMPH 0x1000U // Input Flag for SD1FLT3.COMPH Signal +#define XBAR_FLG3_SD1FLT4_COMPL 0x2000U // Input Flag for SD1FLT4.COMPL Signal +#define XBAR_FLG3_SD1FLT4_COMPH 0x4000U // Input Flag for SD1FLT4.COMPH Signal +#define XBAR_FLG3_SD2FLT1_COMPL 0x8000U // Input Flag for SD2FLT1.COMPL Signal +#define XBAR_FLG3_SD2FLT1_COMPH 0x10000U // Input Flag for SD2FLT1.COMPH Signal +#define XBAR_FLG3_SD2FLT2_COMPL 0x20000U // Input Flag for SD2FLT2.COMPL Signal +#define XBAR_FLG3_SD2FLT2_COMPH 0x40000U // Input Flag for SD2FLT2.COMPH Signal +#define XBAR_FLG3_SD2FLT3_COMPL 0x80000U // Input Flag for SD2FLT3.COMPL Signal +#define XBAR_FLG3_SD2FLT3_COMPH 0x100000U // Input Flag for SD2FLT3.COMPH Signal +#define XBAR_FLG3_SD2FLT4_COMPL 0x200000U // Input Flag for SD2FLT4.COMPL Signal +#define XBAR_FLG3_SD2FLT4_COMPH 0x400000U // Input Flag for SD2FLT4.COMPH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR1 register +// +//************************************************************************************************* +#define XBAR_CLR1_CMPSS1_CTRIPL 0x1U // Input Flag Clear for CMPSS1.CTRIPL Signal +#define XBAR_CLR1_CMPSS1_CTRIPH 0x2U // Input Flag Clear for CMPSS1.CTRIPH Signal +#define XBAR_CLR1_CMPSS2_CTRIPL 0x4U // Input Flag Clear for CMPSS2.CTRIPL Signal +#define XBAR_CLR1_CMPSS2_CTRIPH 0x8U // Input Flag Clear for CMPSS2.CTRIPH Signal +#define XBAR_CLR1_CMPSS3_CTRIPL 0x10U // Input Flag Clear for CMPSS3.CTRIPL Signal +#define XBAR_CLR1_CMPSS3_CTRIPH 0x20U // Input Flag Clear for CMPSS3.CTRIPH Signal +#define XBAR_CLR1_CMPSS4_CTRIPL 0x40U // Input Flag Clear for CMPSS4.CTRIPL Signal +#define XBAR_CLR1_CMPSS4_CTRIPH 0x80U // Input Flag Clear for CMPSS4.CTRIPH Signal +#define XBAR_CLR1_CMPSS5_CTRIPL 0x100U // Input Flag Clear for CMPSS5.CTRIPL Signal +#define XBAR_CLR1_CMPSS5_CTRIPH 0x200U // Input Flag Clear for CMPSS5.CTRIPH Signal +#define XBAR_CLR1_CMPSS6_CTRIPL 0x400U // Input Flag Clear for CMPSS6.CTRIPL Signal +#define XBAR_CLR1_CMPSS6_CTRIPH 0x800U // Input Flag Clear for CMPSS6.CTRIPH Signal +#define XBAR_CLR1_CMPSS7_CTRIPL 0x1000U // Input Flag Clear for CMPSS7.CTRIPL Signal +#define XBAR_CLR1_CMPSS7_CTRIPH 0x2000U // Input Flag Clear for CMPSS7.CTRIPH Signal +#define XBAR_CLR1_CMPSS8_CTRIPL 0x4000U // Input Flag Clear for CMPSS8.CTRIPL Signal +#define XBAR_CLR1_CMPSS8_CTRIPH 0x8000U // Input Flag Clear for CMPSS8.CTRIPH Signal +#define XBAR_CLR1_CMPSS1_CTRIPOUTL 0x10000U // Input Flag Clear for CMPSS1.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS1_CTRIPOUTH 0x20000U // Input Flag Clear for CMPSS1.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS2_CTRIPOUTL 0x40000U // Input Flag Clear for CMPSS2.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS2_CTRIPOUTH 0x80000U // Input Flag Clear for CMPSS2.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS3_CTRIPOUTL 0x100000U // Input Flag Clear for CMPSS3.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS3_CTRIPOUTH 0x200000U // Input Flag Clear for CMPSS3.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS4_CTRIPOUTL 0x400000U // Input Flag Clear for CMPSS4.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS4_CTRIPOUTH 0x800000U // Input Flag Clear for CMPSS4.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS5_CTRIPOUTL 0x1000000U // Input Flag Clear for CMPSS5.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS5_CTRIPOUTH 0x2000000U // Input Flag Clear for CMPSS5.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS6_CTRIPOUTL 0x4000000U // Input Flag Clear for CMPSS6.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS6_CTRIPOUTH 0x8000000U // Input Flag Clear for CMPSS6.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS7_CTRIPOUTL 0x10000000U // Input Flag Clear for CMPSS7.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS7_CTRIPOUTH 0x20000000U // Input Flag Clear for CMPSS7.CTRIPOUTH Signal +#define XBAR_CLR1_CMPSS8_CTRIPOUTL 0x40000000U // Input Flag Clear for CMPSS8.CTRIPOUTL Signal +#define XBAR_CLR1_CMPSS8_CTRIPOUTH 0x80000000U // Input Flag Clear for CMPSS8.CTRIPOUTH Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR2 register +// +//************************************************************************************************* +#define XBAR_CLR2_INPUT1 0x1U // Input Flag Clear for INPUT1 Signal +#define XBAR_CLR2_INPUT2 0x2U // Input Flag Clear for INPUT2 Signal +#define XBAR_CLR2_INPUT3 0x4U // Input Flag Clear for INPUT3 Signal +#define XBAR_CLR2_INPUT4 0x8U // Input Flag Clear for INPUT4 Signal +#define XBAR_CLR2_INPUT5 0x10U // Input Flag Clear for INPUT5 Signal +#define XBAR_CLR2_INPUT7 0x20U // Input Flag Clear for INPUT7 Signal +#define XBAR_CLR2_ADCSOCAO 0x40U // Input Flag Clear for ADCSOCAO Signal +#define XBAR_CLR2_ADCSOCBO 0x80U // Input Flag Clear for ADCSOCBO Signal +#define XBAR_CLR2_CLB1_OUT4 0x100U // Input Flag Clear for CLB1_OUT4 Signal +#define XBAR_CLR2_CLB1_OUT5 0x200U // Input Flag Clear for CLB1_OUT5 Signal +#define XBAR_CLR2_CLB2_OUT4 0x400U // Input Flag Clear for CLB2_OUT4 Signal +#define XBAR_CLR2_CLB2_OUT5 0x800U // Input Flag Clear for CLB2_OUT5 Signal +#define XBAR_CLR2_CLB3_OUT4 0x1000U // Input Flag Clear for CLB3_OUT4 Signal +#define XBAR_CLR2_CLB3_OUT5 0x2000U // Input Flag Clear for CLB3_OUT5 Signal +#define XBAR_CLR2_CLB4_OUT4 0x4000U // Input Flag Clear for CLB4_OUT4 Signal +#define XBAR_CLR2_CLB4_OUT5 0x8000U // Input Flag Clear for CLB4_OUT5 Signal +#define XBAR_CLR2_ECAP1_OUT 0x10000U // Input Flag Clear for ECAP1.OUT Signal +#define XBAR_CLR2_ECAP2_OUT 0x20000U // Input Flag Clear for ECAP2.OUT Signal +#define XBAR_CLR2_ECAP3_OUT 0x40000U // Input Flag Clear for ECAP3.OUT Signal +#define XBAR_CLR2_ECAP4_OUT 0x80000U // Input Flag Clear for ECAP4.OUT Signal +#define XBAR_CLR2_ECAP5_OUT 0x100000U // Input Flag Clear for ECAP5.OUT Signal +#define XBAR_CLR2_ECAP6_OUT 0x200000U // Input Flag Clear for ECAP6.OUT Signal +#define XBAR_CLR2_EXTSYNCOUT 0x400000U // Input Flag Clear for EXTSYNCOUT Signal +#define XBAR_CLR2_ADCAEVT1 0x800000U // Input Flag Clear for ADCAEVT1 Signal +#define XBAR_CLR2_ADCAEVT2 0x1000000U // Input Flag Clear for ADCAEVT2 Signal +#define XBAR_CLR2_ADCAEVT3 0x2000000U // Input Flag Clear for ADCAEVT3 Signal +#define XBAR_CLR2_ADCAEVT4 0x4000000U // Input Flag Clear for ADCAEVT4 Signal +#define XBAR_CLR2_ADCBEVT1 0x8000000U // Input Flag Clear for ADCBEVT1 Signal +#define XBAR_CLR2_ADCBEVT2 0x10000000U // Input Flag Clear for ADCBEVT2 Signal +#define XBAR_CLR2_ADCBEVT3 0x20000000U // Input Flag Clear for ADCBEVT3 Signal +#define XBAR_CLR2_ADCBEVT4 0x40000000U // Input Flag Clear for ADCBEVT4 Signal +#define XBAR_CLR2_ADCCEVT1 0x80000000U // Input Flag Clear for ADCCEVT1 Signal + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XBARCLR3 register +// +//************************************************************************************************* +#define XBAR_CLR3_ADCCEVT2 0x1U // Input Flag Clear for ADCCEVT2 Signal +#define XBAR_CLR3_ADCCEVT3 0x2U // Input Flag Clear for ADCCEVT3 Signal +#define XBAR_CLR3_ADCCEVT4 0x4U // Input Flag Clear for ADCCEVT4 Signal +#define XBAR_CLR3_ADCDEVT1 0x8U // Input Flag Clear for ADCDEVT1 Signal +#define XBAR_CLR3_ADCDEVT2 0x10U // Input Flag Clear for ADCDEVT2 Signal +#define XBAR_CLR3_ADCDEVT3 0x20U // Input Flag Clear for ADCDEVT3 Signal +#define XBAR_CLR3_ADCDEVT4 0x40U // Input Flag Clear for ADCDEVT4 Signal +#define XBAR_CLR3_SD1FLT1_COMPL 0x80U // Input Flag Clear for SD1FLT1.COMPL Signal +#define XBAR_CLR3_SD1FLT1_COMPH 0x100U // Input Flag Clear for SD1FLT1.COMPH Signal +#define XBAR_CLR3_SD1FLT2_COMPL 0x200U // Input Flag Clear for SD1FLT2.COMPL Signal +#define XBAR_CLR3_SD1FLT2_COMPH 0x400U // Input Flag Clear for SD1FLT2.COMPH Signal +#define XBAR_CLR3_SD1FLT3_COMPL 0x800U // Input Flag Clear for SD1FLT3.COMPL Signal +#define XBAR_CLR3_SD1FLT3_COMPH 0x1000U // Input Flag Clear for SD1FLT3.COMPH Signal +#define XBAR_CLR3_SD1FLT4_COMPL 0x2000U // Input Flag Clear for SD1FLT4.COMPL Signal +#define XBAR_CLR3_SD1FLT4_COMPH 0x4000U // Input Flag Clear for SD1FLT4.COMPH Signal +#define XBAR_CLR3_SD2FLT1_COMPL 0x8000U // Input Flag Clear for SD2FLT1.COMPL Signal +#define XBAR_CLR3_SD2FLT1_COMPH 0x10000U // Input Flag Clear for SD2FLT1.COMPH Signal +#define XBAR_CLR3_SD2FLT2_COMPL 0x20000U // Input Flag Clear for SD2FLT2.COMPL Signal +#define XBAR_CLR3_SD2FLT2_COMPH 0x40000U // Input Flag Clear for SD2FLT2.COMPH Signal +#define XBAR_CLR3_SD2FLT3_COMPL 0x80000U // Input Flag Clear for SD2FLT3.COMPL Signal +#define XBAR_CLR3_SD2FLT3_COMPH 0x100000U // Input Flag Clear for SD2FLT3.COMPH Signal +#define XBAR_CLR3_SD2FLT4_COMPL 0x200000U // Input Flag Clear for SD2FLT4.COMPL Signal +#define XBAR_CLR3_SD2FLT4_COMPH 0x400000U // Input Flag Clear for SD2FLT4.COMPH Signal + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/inc/hw_xint.h b/gpio_driverlib_cpu1/device/driverlib/inc/hw_xint.h new file mode 100644 index 0000000..677c2f9 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/inc/hw_xint.h @@ -0,0 +1,108 @@ +//########################################################################### +// +// FILE: hw_xint.h +// +// TITLE: Definitions for the XINT registers. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef HW_XINT_H +#define HW_XINT_H + +//************************************************************************************************* +// +// The following are defines for the XINT register offsets +// +//************************************************************************************************* +#define XINT_O_1CR 0x0U // XINT1 configuration register +#define XINT_O_2CR 0x1U // XINT2 configuration register +#define XINT_O_3CR 0x2U // XINT3 configuration register +#define XINT_O_4CR 0x3U // XINT4 configuration register +#define XINT_O_5CR 0x4U // XINT5 configuration register +#define XINT_O_1CTR 0x8U // XINT1 counter register +#define XINT_O_2CTR 0x9U // XINT2 counter register +#define XINT_O_3CTR 0xAU // XINT3 counter register + + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT1CR register +// +//************************************************************************************************* +#define XINT_1CR_ENABLE 0x1U // XINT1 Enable +#define XINT_1CR_POLARITY_S 2U +#define XINT_1CR_POLARITY_M 0xCU // XINT1 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT2CR register +// +//************************************************************************************************* +#define XINT_2CR_ENABLE 0x1U // XINT2 Enable +#define XINT_2CR_POLARITY_S 2U +#define XINT_2CR_POLARITY_M 0xCU // XINT2 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT3CR register +// +//************************************************************************************************* +#define XINT_3CR_ENABLE 0x1U // XINT3 Enable +#define XINT_3CR_POLARITY_S 2U +#define XINT_3CR_POLARITY_M 0xCU // XINT3 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT4CR register +// +//************************************************************************************************* +#define XINT_4CR_ENABLE 0x1U // XINT4 Enable +#define XINT_4CR_POLARITY_S 2U +#define XINT_4CR_POLARITY_M 0xCU // XINT4 Polarity + +//************************************************************************************************* +// +// The following are defines for the bit fields in the XINT5CR register +// +//************************************************************************************************* +#define XINT_5CR_ENABLE 0x1U // XINT5 Enable +#define XINT_5CR_POLARITY_S 2U +#define XINT_5CR_POLARITY_M 0xCU // XINT5 Polarity + + + +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/interrupt.c b/gpio_driverlib_cpu1/device/driverlib/interrupt.c new file mode 100644 index 0000000..4d628ce --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/interrupt.c @@ -0,0 +1,425 @@ +//########################################################################### +// +// FILE: interrupt.c +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "interrupt.h" + +//***************************************************************************** +// +//! \internal +//! Clears the IFR flag in the CPU. +//! +//! \param group specifies the interrupt group to be cleared. +//! +//! This function clears the IFR flag. This switch is needed because the +//! clearing of the IFR can only be done with a constant. +// +//***************************************************************************** +static void Interrupt_clearIFR(uint16_t group) +{ + switch(group) + { + case 0x0001U: + IFR &= ~(uint16_t)0x0001U; + break; + case 0x0002U: + IFR &= ~(uint16_t)0x0002U; + break; + case 0x0004U: + IFR &= ~(uint16_t)0x0004U; + break; + case 0x0008U: + IFR &= ~(uint16_t)0x0008U; + break; + case 0x0010U: + IFR &= ~(uint16_t)0x0010U; + break; + case 0x0020U: + IFR &= ~(uint16_t)0x0020U; + break; + case 0x0040U: + IFR &= ~(uint16_t)0x0040U; + break; + case 0x0080U: + IFR &= ~(uint16_t)0x0080U; + break; + case 0x0100U: + IFR &= ~(uint16_t)0x0100U; + break; + case 0x0200U: + IFR &= ~(uint16_t)0x0200U; + break; + case 0x0400U: + IFR &= ~(uint16_t)0x0400U; + break; + case 0x0800U: + IFR &= ~(uint16_t)0x0800U; + break; + case 0x1000U: + IFR &= ~(uint16_t)0x1000U; + break; + case 0x2000U: + IFR &= ~(uint16_t)0x2000U; + break; + case 0x4000U: + IFR &= ~(uint16_t)0x4000U; + break; + case 0x8000U: + IFR &= ~(uint16_t)0x8000U; + break; + default: + // + // Invalid group mask. + // + ASSERT((bool)false); + break; + } +} + +//***************************************************************************** +// +// Interrupt_initModule +// +//***************************************************************************** +void +Interrupt_initModule(void) +{ + // + // Disable and clear all interrupts at the CPU + // + (void)Interrupt_disableGlobal(); + IER = 0x0000U; + IFR = 0x0000U; + + // + // Clear all PIEIER registers + // + HWREGH(PIECTRL_BASE + PIE_O_IER1) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER2) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER3) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER4) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER5) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER6) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER7) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER8) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER9) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER10) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER11) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IER12) = 0U; + + // + // Clear all PIEIFR registers + // + HWREGH(PIECTRL_BASE + PIE_O_IFR1) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR2) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR3) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR4) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR5) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR6) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR7) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR8) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR9) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR10) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR11) = 0U; + HWREGH(PIECTRL_BASE + PIE_O_IFR12) = 0U; + + // + // Enable vector fetching from PIE block + // + HWREGH(PIECTRL_BASE + PIE_O_CTRL) |= PIE_CTRL_ENPIE; + +} + +//***************************************************************************** +// +//! The default interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_defaultHandler(void) +{ + uint16_t pieVect; + uint16_t vectID; + + // + // Calculate the vector ID. If the vector is in the lower PIE, it's the + // offset of the vector that was fetched (bits 7:1 of PIECTRL.PIEVECT) + // divided by two. + // + pieVect = HWREGH(PIECTRL_BASE + PIE_O_CTRL); + vectID = (pieVect & 0xFEU) >> 1U; + + // + // If the vector is in the upper PIE, the vector ID is 128 or higher. + // + if(pieVect >= 0x0E00U) + { + vectID += 128U; + } + + // + // Something has gone wrong. An interrupt without a proper registered + // handler function has occurred. To help you debug the issue, local + // variable vectID contains the vector ID of the interrupt that occurred. + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +//! The default illegal instruction trap interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_illegalOperationHandler(void) +{ + // + // Something has gone wrong. The CPU has tried to execute an illegal + // instruction, generating an illegal instruction trap (ITRAP). + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +//! The default non-maskable interrupt handler. +//! +//! \return None. +// +//***************************************************************************** +__interrupt void Interrupt_nmiHandler(void) +{ + // + // A non-maskable interrupt has occurred, indicating that a hardware error + // has occurred in the system. You can use SysCtl_getNMIFlagStatus() to + // to read the NMIFLG register and determine what caused the NMI. + // + ESTOP0; + for(;;) + { + ; + } +} + +//***************************************************************************** +// +// Interrupt_initVectorTable +// +//***************************************************************************** +void +Interrupt_initVectorTable(void) +{ + uint16_t i; + + EALLOW; + + // + // We skip the first three locations because they are initialized by Boot + // ROM with boot variables. + // + for(i = 3U; i < 224U; i++) + { + HWREG(PIEVECTTABLE_BASE + (2U * i)) = + (uint32_t)Interrupt_defaultHandler; + } + + // + // NMI and ITRAP get their own handlers. + // + HWREG(PIEVECTTABLE_BASE + ((INT_NMI >> 16U) * 2U)) = + (uint32_t)Interrupt_nmiHandler; + HWREG(PIEVECTTABLE_BASE + ((INT_ILLEGAL >> 16U) * 2U)) = + (uint32_t)Interrupt_illegalOperationHandler; + + EDIS; +} + +//***************************************************************************** +// +//Interrupt_enable +// +//***************************************************************************** +void +Interrupt_enable(uint32_t interruptNumber) +{ + bool intsDisabled; + uint16_t intGroup; + uint16_t groupMask; + uint16_t vectID; + + vectID = (uint16_t)(interruptNumber >> 16U); + + // + // Globally disable interrupts but save status + // + intsDisabled = Interrupt_disableGlobal(); + + // + // PIE Interrupts + // + if(vectID >= 0x20U) + { + intGroup = (uint16_t)(((interruptNumber & 0xFF00UL) >> 8U) - 1U); + groupMask = (uint16_t)1U << intGroup; + + HWREGH((PIECTRL_BASE + PIE_O_IER1 + (intGroup * 2U))) |= + (uint16_t)1U << ((interruptNumber & 0xFFU) - 1U); + + // + // Enable PIE Group Interrupt + // + IER |= groupMask; + } + + // + // INT13, INT14, DLOGINT, & RTOSINT + // + else if((vectID >= 0x0DU) && (vectID <= 0x10U)) + { + IER |= (uint16_t)1U << (vectID - 1U); + } + else + { + // + // Other interrupts + // + } + + // + // Re-enable interrupts if they were enabled + // + if(!intsDisabled) + { + (void)Interrupt_enableGlobal(); + } +} + +//***************************************************************************** +// +// Interrupt_disable +// +//***************************************************************************** +void +Interrupt_disable(uint32_t interruptNumber) +{ + bool intsDisabled; + uint16_t intGroup; + uint16_t groupMask; + uint16_t vectID; + + vectID = (uint16_t)(interruptNumber >> 16U); + + intsDisabled = Interrupt_disableGlobal(); + + // + // PIE Interrupts + // + if(vectID >= 0x20U) + { + intGroup = (uint16_t)(((interruptNumber & 0xFF00UL) >> 8U) - 1U); + groupMask = (uint16_t)1U << intGroup; + + // + // Disable individual PIE interrupt + // + HWREGH((PIECTRL_BASE + PIE_O_IER1 + (intGroup * 2U))) &= + ~(1U << ((interruptNumber & 0xFFUL) - 1U)); + + // + // Wait for any pending interrupts to get to the CPU + // + NOP; + NOP; + NOP; + NOP; + NOP; + + Interrupt_clearIFR(groupMask); + + // + // Acknowledge any interrupts + // + HWREGH(PIECTRL_BASE + PIE_O_ACK) = groupMask; + } + + // + // INT13, INT14, DLOGINT, & RTOSINT + // + else if((vectID >= 0x0DU) && (vectID <= 0x10U)) + { + IER &= ~((uint16_t)1U << (vectID - 1U)); + + // + // Wait for any pending interrupts to get to the CPU + // + NOP; + NOP; + NOP; + NOP; + NOP; + + Interrupt_clearIFR((uint16_t)1U << (vectID - 1U)); + } + else + { + // + // Other interrupts + // + } + + // + // Re-enable interrupts if they were enabled + // + if(!intsDisabled) + { + (void)Interrupt_enableGlobal(); + } +} diff --git a/gpio_driverlib_cpu1/device/driverlib/interrupt.h b/gpio_driverlib_cpu1/device/driverlib/interrupt.h new file mode 100644 index 0000000..05a555a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/interrupt.h @@ -0,0 +1,497 @@ +//########################################################################### +// +// FILE: interrupt.h +// +// TITLE: C28x Interrupt (PIE) driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef INTERRUPT_H +#define INTERRUPT_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __TMS320C28XX__ + +//***************************************************************************** +// +//! \addtogroup interrupt_api Interrupt +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_pie.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following are values that can be passed to the Interrupt_enableInCPU() +// and Interrupt_disableInCPU() functions as the cpuInterrupt parameter. +// +//***************************************************************************** +#define INTERRUPT_CPU_INT1 0x1U //!< CPU Interrupt Number 1 +#define INTERRUPT_CPU_INT2 0x2U //!< CPU Interrupt Number 2 +#define INTERRUPT_CPU_INT3 0x4U //!< CPU Interrupt Number 3 +#define INTERRUPT_CPU_INT4 0x8U //!< CPU Interrupt Number 4 +#define INTERRUPT_CPU_INT5 0x10U //!< CPU Interrupt Number 5 +#define INTERRUPT_CPU_INT6 0x20U //!< CPU Interrupt Number 6 +#define INTERRUPT_CPU_INT7 0x40U //!< CPU Interrupt Number 7 +#define INTERRUPT_CPU_INT8 0x80U //!< CPU Interrupt Number 8 +#define INTERRUPT_CPU_INT9 0x100U //!< CPU Interrupt Number 9 +#define INTERRUPT_CPU_INT10 0x200U //!< CPU Interrupt Number 10 +#define INTERRUPT_CPU_INT11 0x400U //!< CPU Interrupt Number 11 +#define INTERRUPT_CPU_INT12 0x800U //!< CPU Interrupt Number 12 +#define INTERRUPT_CPU_INT13 0x1000U //!< CPU Interrupt Number 13 +#define INTERRUPT_CPU_INT14 0x2000U //!< CPU Interrupt Number 14 +#define INTERRUPT_CPU_DLOGINT 0x4000U //!< CPU Data Log Interrupt +#define INTERRUPT_CPU_RTOSINT 0x8000U //!< CPU RTOS Interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the Interrupt_clearACKGroup() +// function as the group parameter. +// +//***************************************************************************** +#define INTERRUPT_ACK_GROUP1 0x1U //!< Acknowledge PIE Interrupt Group 1 +#define INTERRUPT_ACK_GROUP2 0x2U //!< Acknowledge PIE Interrupt Group 2 +#define INTERRUPT_ACK_GROUP3 0x4U //!< Acknowledge PIE Interrupt Group 3 +#define INTERRUPT_ACK_GROUP4 0x8U //!< Acknowledge PIE Interrupt Group 4 +#define INTERRUPT_ACK_GROUP5 0x10U //!< Acknowledge PIE Interrupt Group 5 +#define INTERRUPT_ACK_GROUP6 0x20U //!< Acknowledge PIE Interrupt Group 6 +#define INTERRUPT_ACK_GROUP7 0x40U //!< Acknowledge PIE Interrupt Group 7 +#define INTERRUPT_ACK_GROUP8 0x80U //!< Acknowledge PIE Interrupt Group 8 +#define INTERRUPT_ACK_GROUP9 0x100U //!< Acknowledge PIE Interrupt Group 9 +#define INTERRUPT_ACK_GROUP10 0x200U //!< Acknowledge PIE Interrupt Group 10 +#define INTERRUPT_ACK_GROUP11 0x400U //!< Acknowledge PIE Interrupt Group 11 +#define INTERRUPT_ACK_GROUP12 0x800U //!< Acknowledge PIE Interrupt Group 12 +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! The default interrupt handler. +//! +//! This is the default interrupt handler. The Interrupt_initVectorTable() +//! function sets all vectors to this function. Also, when an interrupt is +//! unregistered using the Interrupt_unregister() function, this handler takes +//! its place. This should never be called during normal operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with an +//! appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_defaultHandler(void); + +//***************************************************************************** +// +//! \internal +//! The default illegal instruction trap interrupt handler. +//! +//! This is the default interrupt handler for an illegal instruction trap +//! (ITRAP). The Interrupt_initVectorTable() function sets the appropriate +//! vector to this function. This should never be called during normal +//! operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with +//! an appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_illegalOperationHandler(void); + +//***************************************************************************** +// +//! \internal +//! The default non-maskable interrupt handler. +//! +//! This is the default interrupt handler for a non-maskable interrupt (NMI). +//! The Interrupt_initVectorTable() function sets the appropriate vector to +//! this function. This should never be called during normal operation. +//! +//! The ESTOP0 statement is for debug purposes only. Remove and replace with an +//! appropriate error handling routine for your program. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_nmiHandler(void); + +//***************************************************************************** +// +//! Allows the CPU to process interrupts. +//! +//! This function clears the global interrupt mask bit (INTM) in the CPU, +//! allowing the processor to respond to interrupts. +//! +//! \return Returns \b true if interrupts were disabled when the function was +//! called or \b false if they were initially enabled. +// +//***************************************************************************** +static inline bool +Interrupt_enableGlobal(void) +{ + // + // Enable processor interrupts. + // + return(((__enable_interrupts() & 0x1U) != 0U) ? true : false); +} + +//***************************************************************************** +// +//! Stops the CPU from processing interrupts. +//! +//! This function sets the global interrupt mask bit (INTM) in the CPU, +//! preventing the processor from receiving maskable interrupts. +//! +//! \return Returns \b true if interrupts were already disabled when the +//! function was called or \b false if they were initially enabled. +// +//***************************************************************************** +static inline bool +Interrupt_disableGlobal(void) +{ + // + // Disable processor interrupts. + // + return(((__disable_interrupts() & 0x1U) != 0U) ? true : false); +} + +//***************************************************************************** +// +//! Registers a function to be called when an interrupt occurs. +//! +//! \param interruptNumber specifies the interrupt in question. +//! \param handler is a pointer to the function to be called. +//! +//! This function is used to specify the handler function to be called when the +//! given interrupt is asserted to the processor. When the interrupt occurs, +//! if it is enabled (via Interrupt_enable()), the handler function will be +//! called in interrupt context. Since the handler function can preempt other +//! code, care must be taken to protect memory or peripherals that are accessed +//! by the handler and other non-handler code. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \note This function assumes that the PIE has been enabled. See +//! Interrupt_initModule(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_register(uint32_t interruptNumber, void (*handler)(void)) +{ + uint32_t address; + + // + // Calculate appropriate address for the interrupt number + // + address = (uint32_t)PIEVECTTABLE_BASE + + (((interruptNumber & 0xFFFF0000U) >> 16U) * 2U); + + // + // Copy ISR address into PIE table + // + EALLOW; + HWREG(address) = (uint32_t)handler; + EDIS; +} + +//***************************************************************************** +// +//! Unregisters the function to be called when an interrupt occurs. +//! +//! \param interruptNumber specifies the interrupt in question. +//! +//! This function is used to indicate that a default handler +//! Interrupt_defaultHandler() should be called when the given interrupt is +//! asserted to the processor. Call Interrupt_disable() to disable +//! the interrupt before calling this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \sa Interrupt_register() for important information about registering +//! interrupt handlers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_unregister(uint32_t interruptNumber) +{ + uint32_t address; + + // + // Calculate appropriate address for the interrupt number + // + address = (uint32_t)PIEVECTTABLE_BASE + + (((interruptNumber & 0xFFFF0000U) >> 16U) * 2U); + + // + // Copy default ISR address into PIE table + // + EALLOW; + HWREG(address) = (uint32_t)Interrupt_defaultHandler; + EDIS; +} + +//***************************************************************************** +// +//! Enables CPU interrupt channels +//! +//! \param cpuInterrupt specifies the CPU interrupts to be enabled. +//! +//! This function enables the specified interrupts in the CPU. The +//! \e cpuInterrupt parameter is a logical OR of the values +//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14, +//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT. +//! +//! \note Note that interrupts 1-12 correspond to the PIE groups with those +//! same numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_enableInCPU(uint16_t cpuInterrupt) +{ + // + // Set the interrupt bits in the CPU. + // + IER |= cpuInterrupt; +} + +//***************************************************************************** +// +//! Disables CPU interrupt channels +//! +//! \param cpuInterrupt specifies the CPU interrupts to be disabled. +//! +//! This function disables the specified interrupts in the CPU. The +//! \e cpuInterrupt parameter is a logical OR of the values +//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14, +//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT. +//! +//! \note Note that interrupts 1-12 correspond to the PIE groups with those +//! same numbers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_disableInCPU(uint16_t cpuInterrupt) +{ + // + // Clear the interrupt bits in the CPU. + // + IER &= ~cpuInterrupt; +} + +//***************************************************************************** +// +//! Acknowledges PIE Interrupt Group +//! +//! \param group specifies the interrupt group to be acknowledged. +//! +//! The specified interrupt group is acknowledged and clears any interrupt +//! flag within that respective group. +//! +//! The \e group parameter must be a logical OR of the following: +//! \b INTERRUPT_ACK_GROUP1, \b INTERRUPT_ACK_GROUP2, \b INTERRUPT_ACK_GROUP3 +//! \b INTERRUPT_ACK_GROUP4, \b INTERRUPT_ACK_GROUP5, \b INTERRUPT_ACK_GROUP6 +//! \b INTERRUPT_ACK_GROUP7, \b INTERRUPT_ACK_GROUP8, \b INTERRUPT_ACK_GROUP9 +//! \b INTERRUPT_ACK_GROUP10, \b INTERRUPT_ACK_GROUP11, +//! \b INTERRUPT_ACK_GROUP12. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_clearACKGroup(uint16_t group) +{ + // + // Set interrupt group acknowledge bits + // + HWREGH(PIECTRL_BASE + PIE_O_ACK) = group; +} + +//***************************************************************************** +// +//! Enables the PIE block. +//! +//! This function enables the vector fetching for the peripheral interrupts by +//! enabling the PIE block. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_enablePIE(void) +{ + HWREGH(PIECTRL_BASE + PIE_O_CTRL) |= PIE_CTRL_ENPIE; +} + +//***************************************************************************** +// +//! Disables the PIE block. +//! +//! This function disables the vector fetching for the peripheral interrupts by +//! disabling the PIE block. PIEACK, PIEIFR, and PIEIER registers can be +//! accessed even when the PIE block is disabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +Interrupt_disablePIE(void) +{ + HWREGH(PIECTRL_BASE + PIE_O_CTRL) &= ~PIE_CTRL_ENPIE; +} + +//***************************************************************************** +// +//! Initializes the PIE control registers by setting them to a known state. +//! +//! This function initializes the PIE control registers. After globally +//! disabling interrupts and enabling the PIE, it clears all of the PIE +//! interrupt enable bits and interrupt flags. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_initModule(void); + +//***************************************************************************** +// +//! Initializes the PIE vector table by setting all vectors to a default +//! handler function. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_initVectorTable(void); + +//***************************************************************************** +// +//! Enables an interrupt. +//! +//! \param interruptNumber specifies the interrupt to be enabled. +//! +//! The specified interrupt is enabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_enable(uint32_t interruptNumber); + +//***************************************************************************** +// +//! Disables an interrupt. +//! +//! \param interruptNumber specifies the interrupt to be disabled. +//! +//! The specified interrupt is disabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! The available \e interruptNumber values are supplied in +//! inc/hw_ints.h. +//! +//! \return None. +// +//***************************************************************************** +extern void +Interrupt_disable(uint32_t interruptNumber); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // #ifdef __TMS320C28XX__ + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // INTERRUPT_H diff --git a/gpio_driverlib_cpu1/device/driverlib/ipc.c b/gpio_driverlib_cpu1/device/driverlib/ipc.c new file mode 100644 index 0000000..8d6982e --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/ipc.c @@ -0,0 +1,445 @@ +//########################################################################### +// +// FILE: ipc.c +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "ipc.h" + +// +// Macros internal to the IPC driver +// + +#define IPC_ADDR_OFFSET_NOCHANGE 2U +#define IPC_ADDR_OFFSET_MUL2 4U +#define IPC_ADDR_OFFSET_DIV2 1U + +#define IPC_ADDR_OFFSET_CORR(addr, corr) (((addr) * (corr)) / 2U) + +#if IPC_MSGQ_SUPPORT == 1U + +// +// Global Circular Buffer Definitions +// + + +#pragma DATA_SECTION(IPC_CPU1_To_CPU2_PutBuffer, "MSGRAM_CPU1_TO_CPU2") +#pragma DATA_SECTION(IPC_CPU1_To_CPU2_GetBuffer, "MSGRAM_CPU2_TO_CPU1") + +// +// IPC_CPU1_To_CPU2_PutBuffer acts as IPC_CPU2_To_CPU1_GetBuffer and +// IPC_CPU1_To_CPU2_GetBuffer acts as IPC_CPU2_To_CPU1_PutBuffer +// +IPC_PutBuffer_t IPC_CPU1_To_CPU2_PutBuffer; +IPC_GetBuffer_t IPC_CPU1_To_CPU2_GetBuffer; +#endif + +const IPC_Instance_t IPC_Instance[IPC_TOTAL_NUM] = { + + /* IPC_CPU1_L_CPU2_R */ + { + .IPC_Flag_Ctr_Reg = (volatile IPC_Flag_Ctr_Reg_t *) IPC_BASE, + .IPC_SendCmd_Reg = (volatile IPC_SendCmd_Reg_t *) + (IPC_BASE + 0x10U), + .IPC_RecvCmd_Reg = (volatile IPC_RecvCmd_Reg_t *) + (IPC_BASE + 0x18U), + .IPC_Boot_Pump_Reg = (volatile IPC_Boot_Pump_Reg_t *) + (IPC_BASE + 0x20U), + .IPC_IntNum = {INT_IPC_0, INT_IPC_1, INT_IPC_2, INT_IPC_3, + 0U, 0U, 0U, 0U}, + .IPC_MsgRam_LtoR = CPU1_TO_CPU2_MSG_RAM_BASE, + .IPC_MsgRam_RtoL = CPU2_TO_CPU1_MSG_RAM_BASE, + .IPC_Offset_Corr = IPC_ADDR_OFFSET_NOCHANGE +#if IPC_MSGQ_SUPPORT == 1U + , + .IPC_PutBuffer = &IPC_CPU1_To_CPU2_PutBuffer, + .IPC_GetBuffer = &IPC_CPU1_To_CPU2_GetBuffer +#endif + }, + + /* IPC_CPU2_L_CPU1_R */ + { + .IPC_Flag_Ctr_Reg = (volatile IPC_Flag_Ctr_Reg_t *) IPC_BASE, + .IPC_SendCmd_Reg = (volatile IPC_SendCmd_Reg_t *) + (IPC_BASE + 0x18U), + .IPC_RecvCmd_Reg = (volatile IPC_RecvCmd_Reg_t *) + (IPC_BASE + 0x10U), + .IPC_Boot_Pump_Reg = (volatile IPC_Boot_Pump_Reg_t *) + (IPC_BASE + 0x20U), + .IPC_IntNum = {INT_IPC_0, INT_IPC_1, INT_IPC_2, INT_IPC_3, + 0U, 0U, 0U, 0U}, + .IPC_MsgRam_LtoR = CPU2_TO_CPU1_MSG_RAM_BASE, + .IPC_MsgRam_RtoL = CPU1_TO_CPU2_MSG_RAM_BASE, + .IPC_Offset_Corr = IPC_ADDR_OFFSET_NOCHANGE +#if IPC_MSGQ_SUPPORT == 1U + , + .IPC_PutBuffer = (IPC_PutBuffer_t *)&IPC_CPU1_To_CPU2_GetBuffer, + .IPC_GetBuffer = (IPC_GetBuffer_t *)&IPC_CPU1_To_CPU2_PutBuffer +#endif + } +}; + +//***************************************************************************** +// +// IPC_sendCommand +// +//***************************************************************************** +bool IPC_sendCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t command, uint32_t addr, uint32_t data) +{ + bool ret; + + // + // Check whether the flags are not busy + // + if((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flags) == 0U) + { + ret = true; + + if(addrCorrEnable) + { + // + // Update the command registers. ADDR register holds the offset + // from the base address of the MSG RAM + // + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDCOM = command; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDDATA = data; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDADDR = + addr - IPC_Instance[ipcType].IPC_MsgRam_LtoR; + } + else + { + // + // Update the command registers. addr param remains as is. + // + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDCOM = command; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDDATA = data; + IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_SENDADDR = addr; + } + + // + // Set the flags to indicate the remote core + // + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_SET = flags; + } + else + { + ret = false; + } + + return(ret); +} + +//***************************************************************************** +// +// IPC_readCommand +// +//***************************************************************************** +bool IPC_readCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t *command, uint32_t *addr, uint32_t *data) +{ + bool ret; + uint32_t addrReg; + + // + // Check whether the flags are not empty + // + if((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flags) != 0U) + { + ret = true; + + // + // Read the command registers + // + *command = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVCOM; + addrReg = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVADDR; + *data = IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_RECVDATA; + + if(addrCorrEnable) + { + // + // Calculate the address form the offset + // + *addr = IPC_Instance[ipcType].IPC_MsgRam_RtoL + + IPC_ADDR_OFFSET_CORR(addrReg, + IPC_Instance[ipcType].IPC_Offset_Corr); + + } + else + { + *addr = addrReg; + } + + } + else + { + ret = false; + } + + return(ret); +} + + +//***************************************************************************** +// +// IPC_registerInterrupt +// +//***************************************************************************** +void IPC_registerInterrupt(IPC_Type_t ipcType, uint32_t ipcInt, + void (*pfnHandler)(void)) +{ + // + // Check for arguments + // + + ASSERT(ipcInt <= IPC_INT3); + + // + // Get the corresponding interrupt number + // + uint32_t intNum = IPC_Instance[ipcType].IPC_IntNum[ipcInt]; + + // + // Register the interrupt handler + // + + Interrupt_register(intNum, pfnHandler); + + // + // Enable the interrupt + // + Interrupt_enable(intNum); +} + +//***************************************************************************** +// +// IPC_unregisterInterrupt +// +//***************************************************************************** +void IPC_unregisterInterrupt(IPC_Type_t ipcType, uint32_t ipcInt) +{ + // + // Check for arguments + // + + ASSERT(ipcInt <= IPC_INT3); + + // + // Get the corresponding interrupt number + // + uint32_t intNum = IPC_Instance[ipcType].IPC_IntNum[ipcInt]; + + // + // Disable the interrupt. + // + Interrupt_disable(intNum); + + // + // Unregister the interrupt handler. + // + + Interrupt_unregister(intNum); +} + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +// IPCinitMessageQueue +// +//***************************************************************************** +void IPC_initMessageQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + uint32_t ipcInt_L, uint32_t ipcInt_R) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(ipcInt_L < IPC_NUM_OF_INTERRUPTS); + ASSERT(ipcInt_R < IPC_NUM_OF_INTERRUPTS); + + IPC_PutBuffer_t *putBuffer = IPC_Instance[ipcType].IPC_PutBuffer; + IPC_GetBuffer_t *getBuffer = IPC_Instance[ipcType].IPC_GetBuffer; + + // + // L->R Put Buffer and Index Initialization + // + msgQueue->PutBuffer = putBuffer->Buffer[ipcInt_R]; + msgQueue->PutWriteIndex = &(putBuffer->PutWriteIndex[ipcInt_R]); + msgQueue->GetReadIndex = &(putBuffer->GetReadIndex[ipcInt_L]); + msgQueue->PutFlag = (uint32_t)1U << ipcInt_R; + + // + // L->R Get Buffer and Index Initialization + // + msgQueue->GetBuffer = getBuffer->Buffer[ipcInt_L]; + msgQueue->GetWriteIndex = &(getBuffer->GetWriteIndex[ipcInt_L]); + msgQueue->PutReadIndex = &(getBuffer->PutReadIndex[ipcInt_R]); + + // + // Initialize PutBuffer WriteIndex = 0 and GetBuffer ReadIndex = 0 + // + *(msgQueue->PutWriteIndex) = 0U; + *(msgQueue->GetReadIndex) = 0U; +} + +//***************************************************************************** +// +// IPC_sendMessageToQueue +// +//***************************************************************************** +bool IPC_sendMessageToQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(msg != NULL); + + uint16_t writeIndex; + uint16_t readIndex; + bool ret = true; + + writeIndex = *(msgQueue->PutWriteIndex); + readIndex = *(msgQueue->PutReadIndex); + + // + // Wait until Put Buffer slot is free + // + while(((writeIndex + 1U) & IPC_MAX_BUFFER_INDEX) == readIndex) + { + // + // If designated as a "Blocking" function, and Put buffer is full, + // return immediately with fail status. + // + if(!block) + { + ret = false; + break; + } + + readIndex = *(msgQueue->PutReadIndex); + } + + if(ret != false) + { + // + // When slot is free, Write Message to PutBuffer, update PutWriteIndex, + // and set the CPU IPC INT Flag + // + msgQueue->PutBuffer[writeIndex] = *msg; + + if(addrCorrEnable) + { + msgQueue->PutBuffer[writeIndex].address -= + IPC_Instance[ipcType].IPC_MsgRam_LtoR; + } + + writeIndex = (writeIndex + 1U) & IPC_MAX_BUFFER_INDEX; + *(msgQueue->PutWriteIndex) = writeIndex; + + IPC_setFlagLtoR(ipcType, msgQueue->PutFlag); + } + + return(ret); +} + +//***************************************************************************** +// +// IPC_readMessageFromQueue +// +//***************************************************************************** +bool IPC_readMessageFromQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block) +{ + // + // Check for arguments + // + ASSERT(msgQueue != NULL); + ASSERT(msg != NULL); + + uint16_t writeIndex; + uint16_t readIndex; + bool ret = true; + + writeIndex = *(msgQueue->GetWriteIndex); + readIndex = *(msgQueue->GetReadIndex); + + // + // Loop while GetBuffer is empty + // + while(writeIndex == readIndex) + { + // + // If designated as a "Blocking" function, and Get buffer is empty, + // return immediately with fail status. + // + if(!block) + { + ret = false; + break; + } + + writeIndex = *(msgQueue->GetWriteIndex); + } + + if(ret != false) + { + // + // If there is a message in GetBuffer, Read Message and update + // the ReadIndex + // + *msg = msgQueue->GetBuffer[readIndex]; + if(addrCorrEnable) + { + msg->address = IPC_Instance[ipcType].IPC_MsgRam_RtoL + + IPC_ADDR_OFFSET_CORR(msg->address, + IPC_Instance[ipcType].IPC_Offset_Corr); + } + + readIndex = (readIndex + 1U) & IPC_MAX_BUFFER_INDEX; + *(msgQueue->GetReadIndex) = readIndex; + } + + return(ret); +} +#endif diff --git a/gpio_driverlib_cpu1/device/driverlib/ipc.h b/gpio_driverlib_cpu1/device/driverlib/ipc.h new file mode 100644 index 0000000..8da7688 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/ipc.h @@ -0,0 +1,880 @@ +//########################################################################### +// +// FILE: ipc.h +// +// TITLE: C28x IPC driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef IPC_H +#define IPC_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup ipc_api IPC +//! \brief This module is used for inter-processor communications. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "debug.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_ipc.h" +#include "inc/hw_ints.h" +#include "interrupt.h" + +//***************************************************************************** +// +// Defines for the APIs +// +//***************************************************************************** +//***************************************************************************** +// +// Driver configuration macros +// +//***************************************************************************** +#define IPC_MSGQ_SUPPORT 1U + +// +// Number of IPC messages in circular buffer (must be interval of 2) +// +#define IPC_BUFFER_SIZE 4U + +// +// Number of IPC interrupts using circular buffer (must be same number on both +// CPUs) +// +#define IPC_NUM_OF_INTERRUPTS 4U + +//***************************************************************************** +// +// Values that can be passed as parameter flags in all the IPC API functions. +// +//***************************************************************************** +#ifndef IPC_FLAGS_DEFINED +#define IPC_FLAGS_DEFINED +#define IPC_NO_FLAG 0x00000000U //!< NO FLAG +#define IPC_FLAG0 0x00000001U //!< IPC FLAG 0 +#define IPC_FLAG1 0x00000002U //!< IPC FLAG 1 +#define IPC_FLAG2 0x00000004U //!< IPC FLAG 2 +#define IPC_FLAG3 0x00000008U //!< IPC FLAG 3 +#define IPC_FLAG4 0x00000010U //!< IPC FLAG 4 +#define IPC_FLAG5 0x00000020U //!< IPC FLAG 5 +#define IPC_FLAG6 0x00000040U //!< IPC FLAG 6 +#define IPC_FLAG7 0x00000080U //!< IPC FLAG 7 +#define IPC_FLAG8 0x00000100U //!< IPC FLAG 8 +#define IPC_FLAG9 0x00000200U //!< IPC FLAG 9 +#define IPC_FLAG10 0x00000400U //!< IPC FLAG 10 +#define IPC_FLAG11 0x00000800U //!< IPC FLAG 11 +#define IPC_FLAG12 0x00001000U //!< IPC FLAG 12 +#define IPC_FLAG13 0x00002000U //!< IPC FLAG 13 +#define IPC_FLAG14 0x00004000U //!< IPC FLAG 14 +#define IPC_FLAG15 0x00008000U //!< IPC FLAG 15 +#define IPC_FLAG16 0x00010000U //!< IPC FLAG 16 +#define IPC_FLAG17 0x00020000U //!< IPC FLAG 17 +#define IPC_FLAG18 0x00040000U //!< IPC FLAG 18 +#define IPC_FLAG19 0x00080000U //!< IPC FLAG 19 +#define IPC_FLAG20 0x00100000U //!< IPC FLAG 20 +#define IPC_FLAG21 0x00200000U //!< IPC FLAG 21 +#define IPC_FLAG22 0x00400000U //!< IPC FLAG 22 +#define IPC_FLAG23 0x00800000U //!< IPC FLAG 23 +#define IPC_FLAG24 0x01000000U //!< IPC FLAG 24 +#define IPC_FLAG25 0x02000000U //!< IPC FLAG 25 +#define IPC_FLAG26 0x04000000U //!< IPC FLAG 26 +#define IPC_FLAG27 0x08000000U //!< IPC FLAG 27 +#define IPC_FLAG28 0x10000000U //!< IPC FLAG 28 +#define IPC_FLAG29 0x20000000U //!< IPC FLAG 29 +#define IPC_FLAG30 0x40000000U //!< IPC FLAG 30 +#define IPC_FLAG31 0x80000000U //!< IPC FLAG 31 +#define IPC_FLAG_ALL 0xFFFFFFFFU //!< All IPC flags +#endif + +//***************************************************************************** +// +// Values that can be passed as parameter ipcInt in +// IPC_registerInterrupt and IPC_unregisterInterrupt functions. +// Please refer to the datasheet for the actual number of interrupts available +// for each IPC instance +// +//***************************************************************************** +#define IPC_INT0 0x0U //!< IPC Interrupt 0 +#define IPC_INT1 0x1U //!< IPC Interrupt 1 +#define IPC_INT2 0x2U //!< IPC Interrupt 2 +#define IPC_INT3 0x3U //!< IPC Interrupt 3 +#define IPC_INT4 0x4U //!< IPC Interrupt 4 +#define IPC_INT5 0x5U //!< IPC Interrupt 5 +#define IPC_INT6 0x6U //!< IPC Interrupt 6 +#define IPC_INT7 0x7U //!< IPC Interrupt 7 + +//***************************************************************************** +// +// Values that can be passed as parameter addrCorrEnable in +// IPC_sendCommand, IPC_readCommand, IPC_sendMessageToQueue and +// IPC_readMessageFromQueue functions. +// +//***************************************************************************** +#define IPC_ADDR_CORRECTION_ENABLE true +#define IPC_ADDR_CORRECTION_DISABLE false + +//***************************************************************************** +// +// Values that can be passed as parameter block in +// IPC_sendMessageToQueue and IPC_readMessageFromQueue functions. +// +//***************************************************************************** +#define IPC_BLOCKING_CALL true +#define IPC_NONBLOCKING_CALL false + + + +//***************************************************************************** +// +// Internal macros used for message queue implementation +// +//***************************************************************************** +#define IPC_MAX_BUFFER_INDEX (IPC_BUFFER_SIZE - 1U) + +//***************************************************************************** +// +// Enums for the APIs +// +//***************************************************************************** + +//***************************************************************************** +// +//! Values that can be passed as parameter \e ipcType in all the driver +//! functions +// +//***************************************************************************** +typedef enum +{ + IPC_CPU1_L_CPU2_R, //!< CPU1 - Local core, CPU2 - Remote core + IPC_CPU2_L_CPU1_R, //!< CPU2 - Local core, CPU1 - Remote core + IPC_TOTAL_NUM +}IPC_Type_t; + +//***************************************************************************** +// +// Internal structs for register and messaage queue accesses +// +//***************************************************************************** +typedef struct +{ + uint32_t IPC_ACK; + uint32_t IPC_STS; + uint32_t IPC_SET; + uint32_t IPC_CLR; + uint32_t IPC_FLG; + uint32_t IPC_RSVDREG; + uint32_t IPC_COUNTERL; + uint32_t IPC_COUNTERH; +}IPC_Flag_Ctr_Reg_t; + +typedef struct +{ + uint32_t IPC_SENDCOM; + uint32_t IPC_SENDADDR; + uint32_t IPC_SENDDATA; + uint32_t IPC_REMOTEREPLY; +}IPC_SendCmd_Reg_t; + +typedef struct +{ + uint32_t IPC_RECVCOM; + uint32_t IPC_RECVADDR; + uint32_t IPC_RECVDATA; + uint32_t IPC_LOCALREPLY; +}IPC_RecvCmd_Reg_t; + +typedef struct +{ + uint32_t IPC_BOOTSTS; + uint32_t IPC_BOOTMODE; +}IPC_Boot_Pump_Reg_t; + +#if IPC_MSGQ_SUPPORT == 1U +typedef struct +{ + uint32_t command; + uint32_t address; + uint32_t dataw1; + uint32_t dataw2; +}IPC_Message_t; + +typedef struct +{ + IPC_Message_t Buffer[IPC_NUM_OF_INTERRUPTS][IPC_BUFFER_SIZE]; + uint16_t PutWriteIndex[IPC_NUM_OF_INTERRUPTS]; + uint16_t GetReadIndex[IPC_NUM_OF_INTERRUPTS]; +}IPC_PutBuffer_t; + +typedef struct +{ + IPC_Message_t Buffer[IPC_NUM_OF_INTERRUPTS][IPC_BUFFER_SIZE]; + uint16_t GetWriteIndex[IPC_NUM_OF_INTERRUPTS]; + uint16_t PutReadIndex[IPC_NUM_OF_INTERRUPTS]; +}IPC_GetBuffer_t; +#endif + +//***************************************************************************** +// +// Internal struct used to store the required information regarding an IPC +// instance +// +//***************************************************************************** +typedef struct +{ + volatile IPC_Flag_Ctr_Reg_t *IPC_Flag_Ctr_Reg; + volatile IPC_SendCmd_Reg_t *IPC_SendCmd_Reg; + volatile IPC_RecvCmd_Reg_t *IPC_RecvCmd_Reg; + volatile IPC_Boot_Pump_Reg_t *IPC_Boot_Pump_Reg; + uint32_t IPC_IntNum[8U]; + uint32_t IPC_MsgRam_LtoR; + uint32_t IPC_MsgRam_RtoL; + uint32_t IPC_Offset_Corr; +#if IPC_MSGQ_SUPPORT == 1U + IPC_PutBuffer_t *IPC_PutBuffer; + IPC_GetBuffer_t *IPC_GetBuffer; +#endif +}IPC_Instance_t; + +extern const IPC_Instance_t IPC_Instance[IPC_TOTAL_NUM]; + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +// A structure that defines an IPC message queue. These +// fields are used by the IPC drivers, and normally it is not necessary for +// user software to directly read or write fields in the table. +// +//***************************************************************************** + +typedef struct +{ + IPC_Message_t * PutBuffer; + uint32_t PutFlag; + uint16_t * PutWriteIndex; + uint16_t * PutReadIndex; + IPC_Message_t * GetBuffer; + uint16_t * GetWriteIndex; + uint16_t * GetReadIndex; +} IPC_MessageQueue_t; +#endif + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** + +//***************************************************************************** +// +//! Local core sets Local to Remote IPC Flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being set +//! +//! This function will allow the Local core system to set the designated IPC +//! flags to send to the Remote core system. The \e flags parameter can be any +//! of the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_setFlagLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_SET = flags; +} + +//***************************************************************************** +// +//! Local core clears Local to Remote IPC Flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being cleared +//! +//! This function will allow the Local core system to clear the designated IPC +//! flags sent to the Remote core system. The \e flags parameter can be any +//! of the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_clearFlagLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_CLR = flags; +} + +//***************************************************************************** +// +//! Local core acknowledges Remote to Local IPC Flag. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags being acknowledged. +//! +//! This function will allow the Local core system to acknowledge/clear the IPC +//! flag set by the Remote core system. The \e flags parameter can be any of +//! the IPC flag values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_ackFlagRtoL(IPC_Type_t ipcType, uint32_t flags) +{ + IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_ACK = flags; +} + +//***************************************************************************** +// +//! Determines whether the given IPC flags are busy or not. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the Local to Remote IPC flag masks to check the status of +//! +//! Allows the caller to determine whether the designated Local to Remote +//! IPC flags are pending. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return Returns \b true if the any of the designated IPC flags are busy +//! or \b false if all the designated IPC flags are free. +// +//***************************************************************************** +static inline bool +IPC_isFlagBusyLtoR(IPC_Type_t ipcType, uint32_t flags) +{ + return((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flags) != 0U); +} + +//***************************************************************************** +// +//! Determines whether the given Remote to Local IPC flags are busy or not. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the Remote to Local IPC Flag masks to check the status of +//! +//! Allows the caller to determine whether the designated Remote to Local +//! IPC flags are pending. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return Returns \b true if the any of the designated IPC flags are busy +//! or \b false if all the designated IPC flags are free. +// +//***************************************************************************** +static inline bool +IPC_isFlagBusyRtoL(IPC_Type_t ipcType, uint32_t flags) +{ + return((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flags) != 0U); +} + +//***************************************************************************** +// +//! Wait for the remote core to send a flag +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the Remote to Local IPC flag mask to wait for +//! +//! Allows the caller to wait for the Remote to Local flag to be send by +//! the remote core. The \e flags parameter can be any of the IPC flag +//! values: \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_waitForFlag(IPC_Type_t ipcType, uint32_t flag) +{ + while((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_STS & flag) == 0U) + { + } +} + +//***************************************************************************** +// +//! Wait for the IPC flag to be acknowledged +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the IPC flag mask for which ack is pending +//! +//! Allows the caller to wait for the IPC flag to be acknowledged by the +//! remote core. The \e flagsparameter can be any of the IPC flag values: +//! \b IPC_FLAG0 - \b IPC_FLAG31. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_waitForAck(IPC_Type_t ipcType, uint32_t flag) +{ + while((IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_FLG & flag) != 0U) + { + } +} + +//***************************************************************************** +// +//! Synchronises the two cores +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flag is the IPC flag mask with which synchronisation is done +//! +//! Allows the local and remote cores to synchronise. Neither core will return +//! from this function call before the other core enters it. +//! +//! \note Must be called with same flag mask on both the cores +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_sync(IPC_Type_t ipcType, uint32_t flag) +{ + IPC_setFlagLtoR(ipcType, flag); + IPC_waitForFlag(ipcType, flag); + IPC_ackFlagRtoL(ipcType, flag); + IPC_waitForAck(ipcType, flag); +} + +//***************************************************************************** +// +//! Initialize IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +// +//! This function initializes IPC by clearing all the flags +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_init(IPC_Type_t ipcType) +{ + IPC_clearFlagLtoR(ipcType, IPC_FLAG_ALL); +} + +//***************************************************************************** +// +//! Sends a command to the Remote core +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags to be set +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param command is the 32-bit command value +//! \param addr is the 32-bit address to be sent as part of command +//! \param data is the 32-bit data to be sent as part of command +//! +//! Allows the caller to send a command to the remote core. A command consists +//! of a unique command value, a 32-bit address and a 32-bit data. The function +//! also sends the designated flags to the remote core. +//! There may be differences in the address spaces of Local and Remote core. +//! For example in case of F2838X device, the address spaces of C28x core and +//! CM core are different. In case the \e addr refers to an address in the IPC +//! MSG RAM, \e addrCorrEnable param may be used to correct the address mismatch +//! +//! The \e flags parameter can be any of the IPC flag values: \b IPC_FLAG0 - +//! \b IPC_FLAG31. +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! +//! The application shall use the function IPC_getResponse to read the response +//! sent by the remote core. +//! +//! \note The application is expected to wait until the the response is +//! received before sending another command. +//! +//! \note \e addrCorrEnable parameter must be kept same on the sending and +//! receiving cores +//! +//! \return Returns \b true if the command is sent properly and \b false if +//! the designated flags were busy and hence command was not sent. +// +//***************************************************************************** +extern bool +IPC_sendCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t command, uint32_t addr, uint32_t data); + +//***************************************************************************** +// +//! Reads a command sent by the Remote core +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param flags is the IPC flag mask for the flags sent by the remote core +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param command is the 32-bit pointer at which the command value is read to +//! \param addr is the 32-bit pointer at which address value is read to +//! \param data is the 32-bit pointer at which the data is read to +//! +//! Allows the caller to read a command sent by the remote core. A command +//! consists of a unique command value, a 32-bit address and a 32-bit data. +//! There may be differences in the address spaces of Local and Remote core. +//! For example in case of F2838X device, the address spaces of C28x core and +//! CM core are different. In case the \e addr refers to an address in the IPC +//! MSG RAM, \e addrCorrEnable param may be used to correct the address mismatch +//! +//! The \e flags parameter can be any of the IPC flag values: \b IPC_FLAG0 - +//! \b IPC_FLAG31. +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! +//! \note The application is expected to acknowledge the flag and send a +//! response (if needed) after reading the command +//! +//! \note \e addrCorrEnable parameter must be kept same on the sending and +//! receiving cores +//! +//! \return Returns \b true if the command is read properly and \b false if +//! the designated flags were empty and hence command was not read. +// +//***************************************************************************** +extern bool +IPC_readCommand(IPC_Type_t ipcType, uint32_t flags, bool addrCorrEnable, + uint32_t *command, uint32_t *addr, uint32_t *data); + +//***************************************************************************** +// +//! Sends the response to the command sent by remote core. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param data is the 32-bit value of the response to be sent +//! +//! Allows the caller to send a response to the command previously sent by the +//! remote core +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_sendResponse(IPC_Type_t ipcType, uint32_t data) +{ + IPC_Instance[ipcType].IPC_RecvCmd_Reg->IPC_LOCALREPLY = data; +} + +//***************************************************************************** +// +//! Reads the response from the remote core. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the response sent by the remote core to the +//! command previously sent by the local core +//! +//! \return the 32-bit value of the response. +// +//***************************************************************************** +static inline uint32_t +IPC_getResponse(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_SendCmd_Reg->IPC_REMOTEREPLY); +} + +//***************************************************************************** +// +//! Sets the BOOTMODE register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param mode is the 32-bit value to be set +//! +//! Allows the caller to set the BOOTMODE register. +//! +//! \note This function shall be called by CPU1 only. +//! +//! \return None +// +//***************************************************************************** +static inline void +IPC_setBootMode(IPC_Type_t ipcType, uint32_t mode) +{ + ASSERT(ipcType == IPC_CPU1_L_CPU2_R); + + IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTMODE = mode; +} + +//***************************************************************************** +// +//! Reads the BOOTMODE register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the BOOTMODE register. +//! +//! +//! \return 32-bit value of the BOOOTMODE register +// +//***************************************************************************** +static inline uint32_t +IPC_getBootMode(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTMODE); +} + +//***************************************************************************** +// +//! Sets the BOOTSTS register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param status is the 32-bit value to be set +//! +//! Allows the caller to set the BOOTSTS register. +//! +//! \note This function shall be called by CPU2 and CM only +//! +//! \note This function shall be called by CPU2 only. +//! +//! \return None. +// +//***************************************************************************** +static inline void +IPC_setBootStatus(IPC_Type_t ipcType, uint32_t status) +{ + ASSERT(ipcType == IPC_CPU2_L_CPU1_R); + + IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTSTS = status; +} + +//***************************************************************************** +// +//! Reads the BOOTSTS register. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to set the BOOTMODE register. +//! +//! +//! \return 32-bit value of the BOOOTSTS register +// +//***************************************************************************** +static inline uint32_t +IPC_getBootStatus(IPC_Type_t ipcType) +{ + return(IPC_Instance[ipcType].IPC_Boot_Pump_Reg->IPC_BOOTSTS); +} + +//***************************************************************************** +// +//! Reads the timestamp counter value. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! +//! Allows the caller to read the IPC timestamp counter value. +//! +//! \return 64-bit counter value. +// +//***************************************************************************** +static inline uint64_t +IPC_getCounter(IPC_Type_t ipcType) +{ + // + // Get the Counter High and Low values. Read to the Counter low register + // saves the value of Counter High register. + // + uint32_t ctrL = IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_COUNTERL; + uint32_t ctrH = IPC_Instance[ipcType].IPC_Flag_Ctr_Reg->IPC_COUNTERH; + + // + // Return the 64-bit value of the counter + // + return(((uint64_t)ctrH << 32) | ((uint64_t)ctrL)); +} + +//***************************************************************************** +// +//! Registers an interrupt handler for IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param ipcInt is the Flag number for which interrupt is being registered +//! \param pfnHandler is the pointer to ISR function +//! +//! This function registers the handler to be called when an IPC interrupt +//! occurs. This function enables the global interrupt in the interrupt +//! controller. +//! The \e ipcInt parameter can be any of the IPC flag values:\b IPC_INT0 - +//! \b IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on. +// +//***************************************************************************** +extern void +IPC_registerInterrupt(IPC_Type_t ipcType, uint32_t ipcInt, + void (*pfnHandler)(void)); + +//***************************************************************************** +// +//! Unregisters an interrupt handler for IPC +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param ipcInt is the Flag number for which interrupt is being unregistered +//! +//! This function clears the handler to be called when an IPC interrupt +//! occurs. This function also masks off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! The \e ipcInt parameter can be any of the IPC flag values:\b IPC_INT0 - +//! \b IPC_INT7. IPC_INT0 corresponds to IPC Flag 0 interrupt and so on. +// +//***************************************************************************** +extern void +IPC_unregisterInterrupt(IPC_Type_t ipcType, uint32_t ipcInt); + +#if IPC_MSGQ_SUPPORT == 1U +//***************************************************************************** +// +//! Initializes the IPC message queue +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param ipcInt_L specifies the interrupt number on the local core used by +//! the message queue . +//! \param ipcInt_R specifies the interrupt number on the remote core used by +//! the message queue. +//! +//! This function initializes the IPC message queue with circular buffer +//! and index addresses for an IPC interrupt pair. The +//! \e ipcInt_L and \e ipcInt_R parameters can be one of the following values: +//! \b IPC_INT0, \b IPC_INT1, \b IPC_INT2, \b IPC_INT3. +//! +//! \note If an interrupt is currently in use by an \e IPC_MessageQueue_t +//! instance, that particular interrupt should not be tied to a second +//! \e IPC_MessageQueue_t instance. +//! +//! \note For a particular ipcInt_L - ipcInt_R pair, there must be an instance +//! of IPC_MessageQueue_t defined and initialized on both the locakl and remote +//! systems. +//! +//! \return None. +// +//***************************************************************************** +extern void +IPC_initMessageQueue(IPC_Type_t ipcType, volatile IPC_MessageQueue_t *msgQueue, + uint32_t ipcInt_L, uint32_t ipcInt_R); + +//***************************************************************************** +// +//! Sends a message into the messageQueue. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param msg specifies the address of the \e IPC_Message_t instance to be +//! sent to message queue. +//! \param block specifies whether to allow function to block until the buffer +//! has a free slot +//! +//! This function checks if there is a free slot in the message queue. If so, it +//! puts the message pointed to by \e msg into the free and sets the +//! appropriate IPC interrupt flag +//! +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! The \e block parameter can be one of the following values: +//! \b IPC_BLOCKING_CALL or \b IPC_NONBLOCKING_CALL. +//! +//! \return \b false if the queue is full. \b true if the message is +//! successfully sent. +// +//***************************************************************************** +extern bool +IPC_sendMessageToQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block); + +//***************************************************************************** +// +//! Reads a message from the messageQueue. +//! +//! \param ipcType is the enum corresponding to the IPC instance used +//! \param msgQueue specifies the address of a \e IPC_MessageQueue_t instance +//! \param addrCorrEnable is the flag used to determine whether or not to +//! convert the addr parameter to remote core's address space +//! \param msg specifies the address of the \e IPC_Message_t instance to which +//! the message needs to be read +//! \param block specifies whether to allow function to block until a message +//! is available in the message queue +//! +//! This function checks if there is a message in the message queue. If so, it +//! reads the message and writes to the address pointed to by \e msg into. +//! +//! The \e addrCorrEnable parameter can take values IPC_ADDR_CORRECTION_ENABLE +//! (converts the address to remote core's address space) or +//! IPC_ADDR_CORRECTION_DISABLE(does not modify the addr parmeter) +//! The \e block parameter can be one of the following values: +//! \b IPC_BLOCKING_CALL or \b IPC_NONBLOCKING_CALL. +//! +//! \return \b false if the queue is empty. \b true if the message successfully +//! read. +// +//***************************************************************************** +extern bool +IPC_readMessageFromQueue(IPC_Type_t ipcType, + volatile IPC_MessageQueue_t *msgQueue, + bool addrCorrEnable, IPC_Message_t *msg, bool block); +#endif +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // IPC_H diff --git a/gpio_driverlib_cpu1/device/driverlib/mcbsp.c b/gpio_driverlib_cpu1/device/driverlib/mcbsp.c new file mode 100644 index 0000000..4b23940 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/mcbsp.c @@ -0,0 +1,1621 @@ +//########################################################################### +// +// FILE: mcbsp.c +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "mcbsp.h" + +//***************************************************************************** +// +// McBSP_transmit16BitdataNonBlocking +// +//***************************************************************************** +void +McBSP_transmit16BitDataNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write data. + // + McBSP_write16bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit16BitdataBlocking +// +//***************************************************************************** +void +McBSP_transmit16BitDataBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Check if Transmitter buffer is ready. + // + while(!McBSP_isTxReady(base)) + { + } + + // + // Write data. + // + McBSP_write16bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit32BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_transmit32BitDataNonBlocking(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write data. + // + McBSP_write32bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_transmit32BitdataBlocking +// +//***************************************************************************** +void +McBSP_transmit32BitDataBlocking(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Check if Transmitter buffer is ready. + // + while(!McBSP_isTxReady(base)) + { + } + + // + // Write data. + // + McBSP_write32bitData(base, data); +} + +//***************************************************************************** +// +// McBSP_receive16BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_receive16BitDataNonBlocking(uint32_t base, uint16_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read the data. + // + *receiveData = McBSP_read16bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive16BitDataBlocking +// +//***************************************************************************** +void +McBSP_receive16BitDataBlocking(uint32_t base, uint16_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Wait until new data arrives. + // + while(!McBSP_isRxReady(base)) + { + } + + // + // Read the data. + // + *receiveData = McBSP_read16bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive32BitDataNonBlocking +// +//***************************************************************************** +void +McBSP_receive32BitDataNonBlocking(uint32_t base, uint32_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read the data. + // + *receiveData = McBSP_read32bitData(base); +} + +//***************************************************************************** +// +// McBSP_receive32BitDataBlocking +// +//***************************************************************************** +void +McBSP_receive32BitDataBlocking(uint32_t base, uint32_t *receiveData) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Wait until new data arrives. + // + while(!McBSP_isRxReady(base)) + { + } + + // + // Read the data. + // + *receiveData = McBSP_read32bitData(base); +} + +//***************************************************************************** +// +// McBSP_setRxDataSize +// +//***************************************************************************** +void +McBSP_setRxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(wordsPerFrame < 128U); + + if(dataFrame == MCBSP_PHASE_ONE_FRAME) + { + // + // Set bits per word , write to RWDLEN1 and words per frame , write to + // RFRLEN1. + // + HWREGH(base + MCBSP_O_RCR1) = + ((HWREGH(base + MCBSP_O_RCR1) & ~MCBSP_RCR1_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_RCR1_RFRLEN1_S))); + } + else + { + // + // Set bits per word , write to RWDLEN2 and words per frame, write to + // RFRLEN2. + // + HWREGH(base + MCBSP_O_RCR2) = + ((HWREGH(base + MCBSP_O_RCR2) & ~MCBSP_RCR2_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_RCR2_RFRLEN2_S))); + } +} + +//***************************************************************************** +// +// McBSP_setTxDataSize +// +//***************************************************************************** +void +McBSP_setTxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(wordsPerFrame < 128U); + + if(dataFrame == MCBSP_PHASE_ONE_FRAME) + { + // + // Set bits per word XWDLEN1 and words per frame XFRLEN1. + // + HWREGH(base + MCBSP_O_XCR1) = + ((HWREGH(base + MCBSP_O_XCR1) & ~MCBSP_XCR1_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_XCR1_XFRLEN1_S))); + } + else + { + // + // Set bits per word XWDLEN2 and words per frame XFRLEN2. + // + HWREGH(base + MCBSP_O_XCR2) = + ((HWREGH(base + MCBSP_O_XCR2) & ~MCBSP_XCR2_M) | + ((uint16_t)bitsPerWord | (wordsPerFrame << MCBSP_XCR2_XFRLEN2_S))); + } +} + +//***************************************************************************** +// +// McBSP_disableRxChannel +// +//***************************************************************************** +void +McBSP_disableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is RCERA or RCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is RCERC or RCERD or RCERE or RCERF or + // RCERG or RCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is RCERA or RCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_RCERA + registerOffset) &= ~(1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_enableRxChannel +// +//***************************************************************************** +void +McBSP_enableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is RCERA or RCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is RCERC or RCERD or RCERE or RCERF or + // RCERG or RCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is RCERA or RCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_RCERA + registerOffset) |= (1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_disableTxChannel +// +//***************************************************************************** +void +McBSP_disableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is XCERA or XCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is XCERC or XCERD or XCERE or XCERF or + // XCERG or XCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine whether it is XCERA or XCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_XCERA + registerOffset) &= ~(1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_enableTxChannel +// +//***************************************************************************** +void McBSP_enableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel) +{ + uint16_t block; + uint16_t bitOffset; + uint16_t registerOffset; + uint16_t oddBlock; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + ASSERT(channel < 128U); + + // + // Determine channel block. + // + block = channel >> 4U; + + // + // Determine bit location. + // + bitOffset = channel - (block * 16U); + + // + // Determine register offset for Eight partition. + // + if(partition == MCBSP_MULTICHANNEL_EIGHT_PARTITION) + { + // + // For channel number 0 - 31. + // + if(channel < 32U) + { + // + // Determines whether it is XCERA or XCERB. + // + registerOffset = channel >> 4U; + } + + // + // For channel number 32 - 127. + // + else + { + // + // Determines whether it is XCERC or XCERD or XCERE or XCERF or + // XCERG or XCERH. + // + oddBlock = (block & 1U); + registerOffset = oddBlock + (2U * (block - (2U + oddBlock))) + + 0x5U; + } + } + + // + // Determine register offset for Two partition. + // + else + { + // + // Determine wheter it is XCERA or XCERB. + // + registerOffset = block & 0x1U; + } + + HWREGH(base + MCBSP_O_XCERA + registerOffset) |= (1U << bitOffset); +} + +//***************************************************************************** +// +// McBSP_configureTxClock +// +//***************************************************************************** +void +McBSP_configureTxClock(uint32_t base, const McBSP_ClockParams *ptrClockParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select TX clock source as SRG or External. + // + McBSP_setTxClockSource(base, + (McBSP_TxClockSource)ptrClockParams->clockSourceTx); + + // + // Check if using SRG to drive Transmitter clock. + // + if((McBSP_TxClockSource)ptrClockParams->clockSourceTx == + MCBSP_INTERNAL_TX_CLOCK_SOURCE) + { + // + // Set the SRG clock source. + // + McBSP_setTxSRGClockSource(base, + (McBSP_SRGTxClockSource)ptrClockParams->clockTxSRGSource); + + // + // Check if SRG is clocked from MCLKR pin. GSYNC feature can be enabled + // in this case as SRG input clock source is MCLKR pin. + // + if((McBSP_SRGTxClockSource)ptrClockParams->clockTxSRGSource == + MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN) + { + // + // Set the input clock polarity. + // + McBSP_setRxClockPolarity(base, + (McBSP_RxClockPolarity)ptrClockParams->clockMCLKRPolarity); + + // + // Check if SRG is to be synced with FSR that is GSYNC is to be + // enabled or not. + // + if(ptrClockParams->clockSRGSyncFlag) + { + McBSP_enableSRGSyncFSR(base); + } + else + { + McBSP_disableSRGSyncFSR(base); + } + } + + // + // Set SRG clock divider. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrClockParams->clockSRGDivider); + } + + // + // Input polarity if using external clock on MCLKX. + // Output polarity if using SRG as clock source. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrClockParams->clockMCLKXPolarity); +} + +//***************************************************************************** +// +// McBSP_configureRxClock +// +//***************************************************************************** +void +McBSP_configureRxClock(uint32_t base, const McBSP_ClockParams *ptrClockParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select RX clock source as SRG or External. + // + McBSP_setRxClockSource(base, + (McBSP_RxClockSource)ptrClockParams->clockSourceRx); + + // + // Check if using SRG to drive Receiver clock. + // + if((McBSP_RxClockSource)ptrClockParams->clockSourceRx == + MCBSP_INTERNAL_RX_CLOCK_SOURCE) + { + // + // Set the SRG clock source. + // + McBSP_setRxSRGClockSource(base, + (McBSP_SRGRxClockSource)ptrClockParams->clockRxSRGSource); + + // + // Check if SRG is clocked from MCLKX pin. GSYNC cannot be enabled in + // this case as GSYNC feature can be used only when SRG clock source is + // MCLKR pin. + // + if((McBSP_SRGRxClockSource)ptrClockParams->clockRxSRGSource == + MCBSP_SRG_RX_CLOCK_SOURCE_MCLKX_PIN) + { + // + // Set the input clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrClockParams->clockMCLKXPolarity); + } + + // + // Set SRG clock divider. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrClockParams->clockSRGDivider); + } + + // + // Input polarity if using external clock on MCLKR. + // Output polarity if using SRG as clock source. + // + McBSP_setRxClockPolarity(base, + (McBSP_RxClockPolarity)ptrClockParams->clockMCLKRPolarity); +} + +//***************************************************************************** +// +// McBSP_configureTxFrameSync +// +//***************************************************************************** +void +McBSP_configureTxFrameSync(uint32_t base, + const McBSP_TxFsyncParams *ptrFsyncParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select frame-sync signal source. + // + McBSP_setTxFrameSyncSource(base, + (McBSP_TxFrameSyncSource)ptrFsyncParams->syncSourceTx); + + // + // Check if using internal frame-sync source. + // + if((McBSP_TxFrameSyncSource)ptrFsyncParams->syncSourceTx == + MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE) + { + // + // Select the internal frame-sync trigger source. + // + McBSP_setTxInternalFrameSyncSource(base, + (McBSP_TxInternalFrameSyncSource)ptrFsyncParams->syncIntSource); + + // + // Check if using SRG FSG to trigger frame-sync pulse and GSYNC feature + // is disabled that is FSG is not derived from external MCLKR pin. + // + if((ptrFsyncParams->syncIntSource == + MCBSP_TX_INTERNAL_FRAME_SYNC_SRG) && + (ptrFsyncParams->syncSRGSyncFSRFlag == false)) + { + // + // Set the frame-sync pulse period and width dividers. + // + McBSP_setFrameSyncPulsePeriod(base, + ptrFsyncParams->syncClockDivider); + McBSP_setFrameSyncPulseWidthDivider(base, + ptrFsyncParams->syncPulseDivider); + } + } + + // + // Set the frame-sync polarity. + // + McBSP_setTxFrameSyncPolarity(base, + (McBSP_TxFrameSyncPolarity)ptrFsyncParams->syncFSXPolarity); + + // + // Configure frame-sync error detect flag. + // + if(ptrFsyncParams->syncErrorDetect) + { + McBSP_enableTxFrameSyncErrorDetection(base); + } + else + { + McBSP_disableTxFrameSyncErrorDetection(base); + } +} + +//***************************************************************************** +// +// McBSP_configureRxFrameSync +// +//***************************************************************************** +void +McBSP_configureRxFrameSync(uint32_t base, + const McBSP_RxFsyncParams *ptrFsyncParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Select frame-sync signal source. + // + McBSP_setRxFrameSyncSource(base, + (McBSP_RxFrameSyncSource)ptrFsyncParams->syncSourceRx); + + // + // If using internal frame-sync source. + // + if(ptrFsyncParams->syncSourceRx == MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE) + { + // + // Check if GSYNC feature is disabled that is FSG is not derived + // from external MCLKR pin. + // + if(ptrFsyncParams->syncSRGSyncFSRFlag == false) + { + // + // Set the frame-sync pulse period and width dividers. + // + McBSP_setFrameSyncPulsePeriod(base, + ptrFsyncParams->syncClockDivider); + McBSP_setFrameSyncPulseWidthDivider(base, + ptrFsyncParams->syncPulseDivider); + } + } + + // + // Set the frame-sync polarity. + // + McBSP_setRxFrameSyncPolarity(base, + (McBSP_RxFrameSyncPolarity)ptrFsyncParams->syncFSRPolarity); + + // + // Configure frame-sync error detect flag. + // + if(ptrFsyncParams->syncErrorDetect) + { + McBSP_enableRxFrameSyncErrorDetection(base); + } + else + { + McBSP_disableTxFrameSyncErrorDetection(base); + } +} + +//***************************************************************************** +// +// McBSP_configureTxDataFormat +// +//***************************************************************************** +void +McBSP_configureTxDataFormat(uint32_t base, + const McBSP_TxDataParams *ptrDataParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set loop back mode. + // + if(ptrDataParams->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure the module to work in McBSP. + // + McBSP_setClockStopMode(base, MCBSP_CLOCK_MCBSP_MODE); + + // + // Start with single phase - a TX must at least has a single phase. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase1WordLength, + ptrDataParams->phase1FrameLength); + + // + // Disable second phase by default. + // + McBSP_disableTwoPhaseTx(base); + + // + // Check if second phase is being used. + // + if(ptrDataParams->twoPhaseModeFlag) + { + // + // Enable second phase. + // + McBSP_enableTwoPhaseTx(base); + + // + // Set the parameters for the second phase. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_TWO_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase2WordLength, + ptrDataParams->phase2FrameLength); + } + + // + // Set the Tx companding mode. + // + McBSP_setTxCompandingMode(base, + (McBSP_CompandingMode)ptrDataParams->compandingMode); + + // + // Set Tx data delay in bits. + // + McBSP_setTxDataDelayBits(base, + (McBSP_DataDelayBits)ptrDataParams->dataDelayBits); + + // + // Set DX pin delay. + // + if(ptrDataParams->pinDelayEnableFlag) + { + McBSP_enableDxPinDelay(base); + } + else + { + McBSP_disableDxPinDelay(base); + } + + // + // Set the transmitter interrupt source. + // + McBSP_setTxInterruptSource(base, + (McBSP_TxInterruptSource)ptrDataParams->interruptMode); +} + +//***************************************************************************** +// +// McBSP_configureRxDataFormat +// +//***************************************************************************** +void +McBSP_configureRxDataFormat(uint32_t base, + const McBSP_RxDataParams *ptrDataParams) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set loop back mode. + // + if(ptrDataParams->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure the module to work in McBSP mode. + // + McBSP_setClockStopMode(base, MCBSP_CLOCK_MCBSP_MODE); + + // + // Start with single phase - an RX must at least have a single phase. + // + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase1WordLength, + ptrDataParams->phase1FrameLength); + + // + // Disable second phase by default. + // + McBSP_disableTwoPhaseRx(base); + + // + // Check if second phase is to be enabled. + // + if(ptrDataParams->twoPhaseModeFlag) + { + // + // Enable second phase. + // + McBSP_enableTwoPhaseRx(base); + + // + // Set the parameters for the second phase. + // + McBSP_setRxDataSize(base, MCBSP_PHASE_TWO_FRAME, + (McBSP_DataBitsPerWord)ptrDataParams->phase2WordLength, + ptrDataParams->phase2FrameLength); + } + + // + // Set the receiver companding mode. + // + McBSP_setRxCompandingMode(base, + (McBSP_CompandingMode)ptrDataParams->compandingMode); + + // + // Set receiver data delay in bits. + // + McBSP_setRxDataDelayBits(base, + (McBSP_DataDelayBits)ptrDataParams->dataDelayBits); + + // + // Set receiver sign-extension and justification mode. + // + McBSP_setRxSignExtension(base, + (McBSP_RxSignExtensionMode)ptrDataParams->signExtMode); + + // + // Set the receiver interrupt source. + // + McBSP_setRxInterruptSource(base, + (McBSP_RxInterruptSource)ptrDataParams->interruptMode); +} + +//***************************************************************************** +// +// McBSP_configureTxMultichannel +// +//***************************************************************************** +uint16_t +McBSP_configureTxMultichannel(uint32_t base, + const McBSP_TxMultichannelParams *ptrMchnParams) +{ + uint16_t index; + uint16_t block; + uint16_t partitionAblock; + uint16_t partitionBblock; + uint16_t partitionAflag; + uint16_t partitionBflag; + uint16_t errorTx; + + errorTx = 0U; + partitionAblock = 0U; + partitionBblock = 0U; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Configure Tx Channel Selection mode. + // + McBSP_setTxChannelMode(base, + (McBSP_TxChannelMode)ptrMchnParams->multichannelModeTx); + + // + // Configuration for multichannel selections that is for + // MCBSP_TX_CHANNEL_SELECTION_ENABLED, + // MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION or + // MCBSP_SYMMERTIC_RX_TX_SELECTION. + // + if(((McBSP_TxChannelMode)ptrMchnParams->multichannelModeTx) != + MCBSP_ALL_TX_CHANNELS_ENABLED) + { + // + // Select 2 partition or 8 partition. + // + McBSP_setTxMultichannelPartition(base, + (McBSP_MultichannelPartition)ptrMchnParams->partitionTx); + + // + // Disable dual phase transmission mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Multichannel configuration for 2 partition mode. + // + if((McBSP_MultichannelPartition)ptrMchnParams->partitionTx == + MCBSP_MULTICHANNEL_TWO_PARTITION) + { + if(((uint16_t)ptrMchnParams->channelCountTx) > 32U) + { + errorTx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + partitionAflag = 0U; + partitionBflag = 0U; + + // + // Assign blocks to partition for the provided channels and + // enable the channels. Only the channels which belong to the + // block currently assigned to partition A or B can be enabled. + // + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountTx; + index++) + { + // + // Get the block to which channel belongs. + // + block = (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index)) >> 4U; + + // + // Check if channel block can be assigned to partition A. Only + // even numbered blocks can be assigned to partition A. + // + if((block & 0x1U) == 0U) + { + // + // Check if block is yet to be assigned to partition A. + // + if(partitionAflag == 0U) + { + // + // Assign block to partition A. + // + McBSP_setTxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition A. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionAflag = 1U; + partitionAblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition A. + // + if(partitionAblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition A. + // + McBSP_enableTxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*(ptrMchnParams->ptrChannelsListTx) + + index)); + } + else + { + errorTx = MCBSP_ERROR_2_PARTITION_A; + } + } + + // + // Check if channel block can be assigned to partition B. Only + // odd numbered blocks can be assigned to partition B. + // + else + { + // + // Check if block is yet to be assigned to partition B. + // + if(partitionBflag == 0U) + { + // + // Assign block to partition B. + // + McBSP_setTxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition B. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionBflag = 1U; + partitionBblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition B. + // + if(partitionBblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition B. + // + McBSP_enableTxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index))); + } + else + { + errorTx |= MCBSP_ERROR_2_PARTITION_B; + } + } + } + } + + // + // Multichannel configuration for 8 partition mode. + // + else + { + if((uint16_t)ptrMchnParams->channelCountTx > 128U) + { + errorTx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountTx; + index++) + { + // + // Enable the Tx channels. + // + McBSP_enableTxChannel(base, MCBSP_MULTICHANNEL_EIGHT_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListTx) + + index))); + } + } + } + return(errorTx); +} + +//***************************************************************************** +// +// McBSP_configureRxMultichannel +// +//***************************************************************************** +uint16_t +McBSP_configureRxMultichannel(uint32_t base, + const McBSP_RxMultichannelParams *ptrMchnParams) +{ + uint16_t index; + uint16_t block; + uint16_t partitionAblock; + uint16_t partitionBblock; + uint16_t partitionAflag; + uint16_t partitionBflag; + uint16_t errorRx; + + errorRx = 0U; + partitionAblock = 0U; + partitionBblock = 0U; + + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Configure Tx Channel Selection mode. + // + McBSP_setRxChannelMode(base, + (McBSP_RxChannelMode)ptrMchnParams->multichannelModeRx); + + // + // Select 2 partition or 8 partition. + // + McBSP_setRxMultichannelPartition(base, + (McBSP_MultichannelPartition)ptrMchnParams->partitionRx); + + // + // Configuration for multichannel selections that is for + // MCBSP_RX_CHANNEL_SELECTION_ENABLED. + // + if((ptrMchnParams->multichannelModeRx) == + MCBSP_RX_CHANNEL_SELECTION_ENABLED) + { + // + // Disable dual phase reception mode. + // + McBSP_disableTwoPhaseRx(base); + + // + // Multichannel configuration for 2 partition mode. + // + if((McBSP_MultichannelPartition)ptrMchnParams->partitionRx == + MCBSP_MULTICHANNEL_TWO_PARTITION) + { + if((uint16_t)ptrMchnParams->channelCountRx > 32U) + { + errorRx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + partitionAflag = 0U; + partitionBflag = 0U; + + // + // Assign blocks to partition for the provided channels and + // enable the channels. Only the channels which belong to the + // block currently assigned to partition A or B can be enabled. + // + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountRx; + index++) + { + // + // Get the block to which channel belongs. + // + block = (*((ptrMchnParams->ptrChannelsListRx) + index)) >> 4U; + + // + // Check if channel block can be assigned to partition A. Only + // even numbered blocks can be assigned to partition A. + // + if((block & 0x1U) == 0U) + { + // + // Check if block is yet to be assigned to partition A. + // + if(partitionAflag == 0U) + { + // + // Assign block to partition A. + // + McBSP_setRxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + + // + // Set flag to indicate that a block is now assigned + // to partition A. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionAflag = 1U; + partitionAblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition A. + // + if(partitionAblock == block) + { + // + // Enable the channel belonging to the block assigned + // to partition A. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + + index))); + } + else + { + errorRx = MCBSP_ERROR_2_PARTITION_A; + } + } + + // + // Check if channel block can be assigned to partition B. Only + // odd numbered blocks can be assigned to partition B. + // + else + { + // + // Check if block is yet to be assigned to partition B. + // + if(partitionBflag == 0U) + { + // + // Assign block to partition B. + // + McBSP_setRxTwoPartitionBlock(base, + (McBSP_PartitionBlock)block); + // + // Set flag to indicate that a block is now assigned + // to partition B. Only one block can be assigned to + // a partition at a time in 2 partition mode. + // + partitionBflag = 1U; + partitionBblock = block; + } + + // + // Check if the channel to be enabled belong to the block + // assigned to partition B. + // + if(partitionBblock == block) + { + // + // Enable the Rx channel belonging to the block + // assigned to partition B. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_TWO_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + + index))); + } + else + { + errorRx |= MCBSP_ERROR_2_PARTITION_B; + } + } + } + } + + // + // Multichannel configuration for 8 partition mode. + // + else + { + if(ptrMchnParams->channelCountRx > 128U) + { + errorRx = MCBSP_ERROR_EXCEEDED_CHANNELS; + } + for(index = 0U; index < (uint16_t)ptrMchnParams->channelCountRx; + index++) + { + // + // Enable the Rx channels. + // + McBSP_enableRxChannel(base, + MCBSP_MULTICHANNEL_EIGHT_PARTITION, + (uint16_t)(*((ptrMchnParams->ptrChannelsListRx) + index))); + } + } + } + return(errorRx); +} + +//***************************************************************************** +// +// McBSP_configureSPIMasterMode +// +//***************************************************************************** +void +McBSP_configureSPIMasterMode(uint32_t base, + const McBSP_SPIMasterModeParams *ptrSPIMasterMode) +{ + // + // Configure clock stop mode. + // + if(((ptrSPIMasterMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_NO_DELAY) || + ((ptrSPIMasterMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_DELAY)) + { + // + // Set SPI mode. + // + McBSP_setClockStopMode(base, + (McBSP_ClockStopMode)ptrSPIMasterMode->clockStopMode); + + // + // Set loop back mode. + // + if(ptrSPIMasterMode->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure module as master. Use SRG as clock source for driving + // master clock. MCLKX pin will be the master clock out pin. + // + McBSP_setTxClockSource(base, MCBSP_INTERNAL_TX_CLOCK_SOURCE); + + // + // Set internal clock (LSPCLK) as SRG clock source. + // + McBSP_setTxSRGClockSource(base, MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK); + + // + // Set SRG clock divider for generating CLKG. + // + McBSP_setSRGDataClockDivider(base, + (uint16_t)ptrSPIMasterMode->clockSRGDivider); + + // + // Set the output master clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrSPIMasterMode->spiMode); + + // + // Set FSX as an output driven by SRG. + // + McBSP_setTxFrameSyncSource(base, MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE); + + // + // FSX is triggered when data is written to DXR registers. + // + McBSP_setTxInternalFrameSyncSource(base, + MCBSP_TX_INTERNAL_FRAME_SYNC_DATA); + + // + // Set the polarity for FSX pin as active low. + // + McBSP_setTxFrameSyncPolarity(base, + MCBSP_TX_FRAME_SYNC_POLARITY_LOW); + + // + // Disable dual phase mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Set the data format for transmission & reception. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPIMasterMode->wordLength, 0U); + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPIMasterMode->wordLength, 0U); + + // + // Set one bit data delay for transmission & reception to set correct + // setup time on FSX signal. + // + McBSP_setTxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_1); + McBSP_setRxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_1); + } +} + +//***************************************************************************** +// +// McBSP_configureSPISlaveMode +// +//***************************************************************************** +void +McBSP_configureSPISlaveMode(uint32_t base, + const McBSP_SPISlaveModeParams *ptrSPISlaveMode) +{ + + // + // Configure clock stop mode. + // + if(((ptrSPISlaveMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_NO_DELAY) || + ((ptrSPISlaveMode->clockStopMode) == MCBSP_CLOCK_SPI_MODE_DELAY)) + { + // + // Set SPI mode. + // + McBSP_setClockStopMode(base, + (McBSP_ClockStopMode)ptrSPISlaveMode->clockStopMode); + // + // Set loop back mode. + // + if(ptrSPISlaveMode->loopbackModeFlag) + { + McBSP_enableLoopback(base); + } + else + { + McBSP_disableLoopback(base); + } + + // + // Configure module as Slave. MCLKX pin acts as input slave + // clock and is driven externally by SPI master. + // + McBSP_setTxClockSource(base, MCBSP_EXTERNAL_TX_CLOCK_SOURCE); + + // + // Set the input slave clock polarity. + // + McBSP_setTxClockPolarity(base, + (McBSP_TxClockPolarity)ptrSPISlaveMode->spiMode); + + // + // Set internal clock (LSPCLK) as SRG clock source. SRG is used to + // synchronize McBSP logic with externally generated master clock. + // + McBSP_setRxSRGClockSource(base, MCBSP_SRG_RX_CLOCK_SOURCE_LSPCLK); + + // + // Assign a clock divider value of 1 for generating CLKG. + // + McBSP_setSRGDataClockDivider(base, 1U); + + // + // Set FSX as an input which is driven by slave-enable signal + // from SPI master. + // + McBSP_setTxFrameSyncSource(base, MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE); + + // + // Set the polarity for FSX pin as active low. + // + McBSP_setTxFrameSyncPolarity(base, + MCBSP_TX_FRAME_SYNC_POLARITY_LOW); + + // + // Disable dual phase mode. + // + McBSP_disableTwoPhaseTx(base); + + // + // Set the data format for transmission & reception.. + // + McBSP_setTxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPISlaveMode->wordLength, 0U); + McBSP_setRxDataSize(base, MCBSP_PHASE_ONE_FRAME, + (McBSP_DataBitsPerWord)ptrSPISlaveMode->wordLength, 0U); + + // + // Set zero bit data delay for transmission & reception. + // + McBSP_setTxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_0); + McBSP_setRxDataDelayBits(base, MCBSP_DATA_DELAY_BIT_0); + } +} diff --git a/gpio_driverlib_cpu1/device/driverlib/mcbsp.h b/gpio_driverlib_cpu1/device/driverlib/mcbsp.h new file mode 100644 index 0000000..949987d --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/mcbsp.h @@ -0,0 +1,3340 @@ +//########################################################################### +// +// FILE: mcbsp.h +// +// TITLE: C28x McBSP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef MCBSP_H +#define MCBSP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup mcbsp_api McBSP +//! @{ +// +//***************************************************************************** + +#include "inc/hw_ints.h" +#include "inc/hw_types.h" +#include "inc/hw_mcbsp.h" +#include "inc/hw_memmap.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Define to specify mask for setting the word and frame length in +// McBSP_setTxDataSize() anf McBSP_setRxDataSize(). +// +//***************************************************************************** +#define MCBSP_XCR1_M (MCBSP_XCR1_XWDLEN1_M | \ + MCBSP_XCR1_XFRLEN1_M) +#define MCBSP_RCR1_M (MCBSP_RCR1_RWDLEN1_M | \ + MCBSP_RCR1_RFRLEN1_M) +#define MCBSP_XCR2_M (MCBSP_XCR2_XWDLEN2_M | \ + MCBSP_XCR2_XFRLEN2_M) +#define MCBSP_RCR2_M (MCBSP_RCR2_RWDLEN2_M | \ + MCBSP_RCR2_RFRLEN2_M) + +//***************************************************************************** +// +// Defines the values that can be returned by McBSP_getRxErrorStatus() when +// there is an error in Rx. +// +//***************************************************************************** +#define MCBSP_RX_NO_ERROR 0x0U //!< No error. +#define MCBSP_RX_BUFFER_ERROR 0x4U //!< Buffer Full. +#define MCBSP_RX_FRAME_SYNC_ERROR 0x8U //!< Frame sync error. +#define MCBSP_RX_BUFFER_FRAME_SYNC_ERROR 0xCU //!< Buffer and frame sync error. + +//***************************************************************************** +// +// Defines the values that can be returned by McBSP_getTxErrorStatus() when +// there is an error in Tx. +// +//***************************************************************************** +#define MCBSP_TX_NO_ERROR 0x0U //!< No error. +#define MCBSP_TX_BUFFER_ERROR 0x4U //!< Buffer overrun. +#define MCBSP_TX_FRAME_SYNC_ERROR 0x8U //!< Frame sync error. +#define MCBSP_TX_BUFFER_FRAME_SYNC_ERROR 0xCU //!< Buffer and frame sync error. + +//***************************************************************************** +// +// Values that can be returned by McBSP_configureTxMultichannel() and +// McBSP_configureRxMultichannel(). +// +//***************************************************************************** +#define MCBSP_ERROR_EXCEEDED_CHANNELS 0x1U //!< Exceeded number of channels. +#define MCBSP_ERROR_2_PARTITION_A 0x2U //!< Error in 2 partition A setup. +#define MCBSP_ERROR_2_PARTITION_B 0x4U //!< Error in 2 partition B setup. +#define MCBSP_ERROR_INVALID_MODE 0x8U //!< Invalid mode. + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setRxSignExtension() as the \e +//! mode parameters. +// +//***************************************************************************** +typedef enum +{ + MCBSP_RIGHT_JUSTIFY_FILL_ZERO = 0x0000U, //!< Right justify and + //!< zero fill MSB. + MCBSP_RIGHT_JUSTIFY_FILL_SIGN = 0x2000U, //!< Right justified sign + //!< extended into MSBs. + MCBSP_LEFT_JUSTIFY_FILL_ZER0 = 0x4000U //!< Left justifies LBS + //!< filled with zero. +}McBSP_RxSignExtensionMode; + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setClockStopMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + MCBSP_CLOCK_MCBSP_MODE = 0x0000U, //!< Disables clock stop mode. + MCBSP_CLOCK_SPI_MODE_NO_DELAY = 0x1000U, //!< Enables clock stop mode. + MCBSP_CLOCK_SPI_MODE_DELAY = 0x1800U //!< Enables clock stop mode + //!< with half cycle delay. +}McBSP_ClockStopMode; + +//***************************************************************************** +// +//! Values that can be passed to McBSP_setRxInterruptSource() as the +//! \e interruptSource parameter. +// +//***************************************************************************** +typedef enum +{ + MCBSP_RX_ISR_SOURCE_SERIAL_WORD = 0x0000U, //!> 1U) << 7U)); +} + +//***************************************************************************** +// +//! Configures transmitter input clock source for sample generator. +//! +//! \param base is the base address of the McBSP module. +//! \param srgClockSource is clock source for the sample generator. +//! +//! This functions sets the clock source for the sample rate generator. +//! Valid values for \e clockSource are +//! - \b MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK for LSPCLK. +//! - \b MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN for external clock at MCLKR pin. +//! MCLKX pin will be an output driven by sample rate generator. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxSRGClockSource(uint32_t base, + const McBSP_SRGTxClockSource srgClockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKSM bit. + // + HWREGH(base + MCBSP_O_SRGR2) = + ((HWREGH(base + MCBSP_O_SRGR2) & ~MCBSP_SRGR2_CLKSM) | + ((uint16_t)((uint16_t)srgClockSource & 0x1U) << 13U)); + // + // Set or clear SCLKME bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_SCLKME) | + (uint16_t)(((uint16_t)srgClockSource >> 1U) << 7U)); +} + +//***************************************************************************** +// +//! Sets the mode for transmitter internal frame sync signal. +//! +//! \param base is the base address of the McBSP module. +//! \param syncMode is the frame sync mode. +//! +//! This function sets the frame sync signal generation mode. The signal can be +//! generated based on clock divider as set in McBSP_setFrameSyncPulsePeriod() +//! function or when data is transferred from DXR registers to XSR registers. +//! Valid input for syncMode are: +//! +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_DATA - frame sync signal is +//! generated when data is transferred from +//! DXR registers to XSR registers. +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_SRG - frame sync signal is +//! generated based on the clock counter +//! value as defined in +//! McBSP_setFrameSyncPulsePeriod() +//! function. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxInternalFrameSyncSource(uint32_t base, + const McBSP_TxInternalFrameSyncSource syncMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSGM bit. + // + HWREGH(base + MCBSP_O_SRGR2) = + ((HWREGH(base + MCBSP_O_SRGR2) & ~MCBSP_SRGR2_FSGM) | (uint16_t)syncMode); +} + +//***************************************************************************** +// +//! Set Multichannel receiver partitions. +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the number of partitions. +//! +//! This function sets the partitions for Multichannel receiver. Valid values +//! for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or \b +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 and 8 partitions respectively. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxMultichannelPartition(uint32_t base, + const McBSP_MultichannelPartition partition) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or Clear RMCME bit. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RMCME) | (uint16_t)partition); +} + +//***************************************************************************** +// +//! Sets block to receiver in two partition configuration. +//! +//! \param base is the base address of the McBSP module. +//! \param block is the block to assign to the partition. +//! +//! This function assigns the block the user provides to the appropriate +//! receiver partition. +//! If user sets the value of block to 0,2,4 or 6 the API will assign the +//! blocks to partition A. If values 1,3,5,or 7 are set to block, then +//! the API assigns the block to partition B. +//! +//! \note This function should be used with the two partition configuration +//! only and not with eight partition configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxTwoPartitionBlock(uint32_t base, const McBSP_PartitionBlock block) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + //Check the block value if it is 0,2,4,6 or 1,3,5,7. + // + if(((uint16_t)block == 0U) || + ((uint16_t)block == 2U) || + ((uint16_t)block == 4U) || + ((uint16_t)block == 6U)) + { + // + // write to RPABLK bits. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RPABLK_M) | + (uint16_t)(((uint16_t)block >> 1U)<< 5U)); + } + else + { + // + // write to RPBBLK bits. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RPBBLK_M) | + (uint16_t)(((uint16_t)block >> 1U)<< 7U)); + } +} + +//***************************************************************************** +// +//! Returns the current active receiver block number. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function returns the current active receiver block involved in McBSP +//! reception. +//! +//! \return Active block in McBSP reception. Returned values range from 0 to 7 +//! representing the respective active block number . +// +//***************************************************************************** +static inline uint16_t +McBSP_getRxActiveBlock(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // return RCBLK bits. + // + return((HWREGH(base + MCBSP_O_MCR1) & MCBSP_MCR1_RCBLK_M) >> + MCBSP_MCR1_RCBLK_S); +} + +//***************************************************************************** +// +//! Configure channel selection mode for receiver. +//! +//! \param base is the base address of the McBSP module. +//! \param channelMode is the channel selection mode. +//! +//! This function configures the channel selection mode. The following are +//! valid values for channelMode: +//! +//! - \b MCBSP_ALL_RX_CHANNELS_ENABLED - enables all channels. +//! - \b MCBSP_RX_CHANNEL_SELECTION_ENABLED - lets the user enable desired +//! channels by using McBSP_enableRxChannel(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxChannelMode(uint32_t base, const McBSP_RxChannelMode channelMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear RMCM bit. + // + HWREGH(base + MCBSP_O_MCR1) = + ((HWREGH(base + MCBSP_O_MCR1) & ~MCBSP_MCR1_RMCM) | (uint16_t)channelMode); +} + +//***************************************************************************** +// +//! Set Multichannel transmitter partitions. +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the number of partitions. +//! +//! This function sets the partitions for Multichannel transmitter. Valid +//! values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or \b +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 and 8 partitions respectively. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxMultichannelPartition(uint32_t base, + const McBSP_MultichannelPartition partition) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear XMCME bit. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XMCME) | (uint16_t)partition); +} + +//***************************************************************************** +// +//! Sets block to transmitter in two partition configuration. +//! +//! \param base is the base address of the McBSP module. +//! \param block is the block to assign to the partition. +//! +//! This function assigns the block the user provides to the appropriate +//! transmitter partition. +//! If user sets the value of block to 0,2,4 or 6 the API will assign the +//! blocks to partition A. If values 1,3,5,or 7 are set to block, then +//! the API assigns the block to partition B. +//! +//! \note This function should be used with the two partition configuration +//! only and not with eight partition configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxTwoPartitionBlock(uint32_t base, const McBSP_PartitionBlock block) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + if(((uint16_t)block == 0U) || + ((uint16_t)block == 2U) || + ((uint16_t)block == 4U) || + ((uint16_t)block == 6U)) + { + // + // write to XPABLK bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XPABLK_M) | + ((uint16_t)((uint16_t)block >> 1U)<< 5U)); + } + else + { + // + // write to XPBBLK bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XPBBLK_M) | + ((uint16_t)((uint16_t)block >> 1U)<< 7U)); + } +} + +//***************************************************************************** +// +//! Returns the current active transmitter block number. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function returns the current active transmitter block involved in +//! McBSP transmission. +//! +//! \return Active block in McBSP transmission. Returned values range from +//! 0 to 7 representing the respective active block number. +// +//***************************************************************************** +static inline uint16_t +McBSP_getTxActiveBlock(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // return XCBLK bits. + // + return((HWREGH(base + MCBSP_O_MCR2) & MCBSP_MCR2_XCBLK_M) >> + MCBSP_MCR2_XCBLK_S); + +} + +//***************************************************************************** +// +//! Configure channel selection mode for transmitter. +//! +//! \param base is the base address of the McBSP module. +//! \param channelMode is the channel selection mode. +//! +//! This function configures the channel selection mode. The following are +//! valid values for channelMode: +//! +//! - \b MCBSP_ALL_TX_CHANNELS_ENABLED - enables and unmasks all channels +//! - \b MCBSP_TX_CHANNEL_SELECTION_ENABLED - lets the user enable and unmask +//! desired channels by using McBSP_enableTxChannel() +//! - \b MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION - All channels enables but +//! until enabled by McBSP_enableTxChannel() +//! - \b MCBSP_SYMMERTIC_RX_TX_SELECTION - Symmetric transmission and +//! reception. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxChannelMode(uint32_t base, const McBSP_TxChannelMode channelMode) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set values to the XMCM bits. + // + HWREGH(base + MCBSP_O_MCR2) = + ((HWREGH(base + MCBSP_O_MCR2) & ~MCBSP_MCR2_XMCM_M) | + (uint16_t)channelMode); +} + +//***************************************************************************** +// +//! Select the transmitter frame sync signal source. +//! +//! \param base is the base address of the McBSP module. +//! \param syncSource is the transmitter frame sync source. +//! +//! This function sets external or internal sync signal source based on the +//! syncSource selection. Valid input for syncSource are: +//! +//! - \b MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! externally by pin FSX. +//! - \b MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! internally. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxFrameSyncSource(uint32_t base, + const McBSP_TxFrameSyncSource syncSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + //Set or Clear the FSXM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSXM) | (uint16_t)syncSource); +} + +//***************************************************************************** +// +//! Select receiver frame sync signal source. +//! +//! \param base is the base address of the McBSP module. +//! \param syncSource is the receiver frame sync source. +//! +//! This function sets external or internal sync signal source based on the +//! syncSource selection. Valid input for syncSource are: +//! +//! - \b MCBSP_RX_EXTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! externally by pin FSR. +//! - \b MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE - frame sync signal is supplied +//! by SRG. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxFrameSyncSource(uint32_t base, + const McBSP_RxFrameSyncSource syncSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSRM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSRM) | (uint16_t)syncSource); +} + +//***************************************************************************** +// +//! Configures the Transmit clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockSource is clock source for the transmission pin. +//! +//! This function configures the clock source for the transmitter. Valid input +//! for rxClockSource are: +//! - \b MCBSP_INTERNAL_TX_CLOCK_SOURCE - internal clock source. SRG is the +//! source. +//! - \b MCBSP_EXTERNAL_TX_CLOCK_SOURCE - external clock source. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxClockSource(uint32_t base, const McBSP_TxClockSource clockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKXM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKXM ) | (uint16_t)clockSource); +} + +//***************************************************************************** +// +//! Configures the Receive clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockSource is clock source for the reception pin. +//! +//! This function configures the clock source for the receiver. Valid input +//! for base are: +//! - \b MCBSP_INTERNAL_RX_CLOCK_SOURCE - internal clock source. Sample Rate +//! Generator will be used. +//! - \b MCBSP_EXTERNAL_RX_CLOCK_SOURCE - external clock will drive the data. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxClockSource(uint32_t base, const McBSP_RxClockSource clockSource) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear CLKRM bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKRM) | (uint16_t)clockSource); +} + +//***************************************************************************** +// +//! Sets transmitter frame sync polarity. +//! +//! \param base is the base address of the McBSP module. +//! \param syncPolarity is the polarity of frame sync pulse. +//! +//! This function sets the polarity (rising or falling edge)of the frame sync +//! on FSX pin. Use \b MCBSP_TX_FRAME_SYNC_POLARITY_LOW for active low +//! frame sync pulse and \b MCBSP_TX_FRAME_SYNC_POLARITY_HIGH for active +//! high sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxFrameSyncPolarity(uint32_t base, + const McBSP_TxFrameSyncPolarity syncPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSXP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSXP) | (uint16_t)syncPolarity); +} + +//***************************************************************************** +//! Sets receiver frame sync polarity. +//! +//! \param base is the base address of the McBSP module. +//! \param syncPolarity is the polarity of frame sync pulse. +//! +//! This function sets the polarity (rising or falling edge)of the frame sync +//! on FSR pin. Use \b MCBSP_RX_FRAME_SYNC_POLARITY_LOW for active low +//! frame sync pulse and \b MCBSP_RX_FRAME_SYNC_POLARITY_HIGH for active +//! high sync pulse. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxFrameSyncPolarity(uint32_t base, + const McBSP_RxFrameSyncPolarity syncPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set or clear FSRP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_FSRP) | (uint16_t)syncPolarity); +} + +//***************************************************************************** +//! Sets transmitter clock polarity when using external clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockPolarity is the polarity of external clock. +//! +//! This function sets the polarity (rising or falling edge) of the transmitter +//! clock on MCLKX pin. +//! Valid values for clockPolarity are: +//! - \b MCBSP_TX_POLARITY_RISING_EDGE for rising edge. +//! - \b MCBSP_TX_POLARITY_FALLING_EDGE for falling edge. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setTxClockPolarity(uint32_t base, + const McBSP_TxClockPolarity clockPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear CLKXP bit first , then set or clear CLKXP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKXP) | + (uint16_t)clockPolarity); +} + +//***************************************************************************** +//! Sets receiver clock polarity when using external clock source. +//! +//! \param base is the base address of the McBSP module. +//! \param clockPolarity is the polarity of external clock. +//! +//! This function sets the polarity (rising or falling edge) of the receiver +//! clock on MCLKR pin. If external clock is used, the polarity will affect +//! CLKG signal. +//! Valid values for clockPolarity are: +//! - \b MCBSP_RX_POLARITY_RISING_EDGE for rising edge. +//! - \b MCBSP_RX_POLARITY_FALLING_EDGE for falling edge. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_setRxClockPolarity(uint32_t base, + const McBSP_RxClockPolarity clockPolarity) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear CLKRP bit first , then set or clear CLKRP bit. + // + HWREGH(base + MCBSP_O_PCR) = + ((HWREGH(base + MCBSP_O_PCR) & ~MCBSP_PCR_CLKRP) | + (uint16_t)clockPolarity); +} + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers. +//! +//! \param base is the base address of the McBSP port. +//! +//! This function returns the data value in data receive register. +//! +//! \return received data. +// +//***************************************************************************** +static inline +uint16_t McBSP_read16bitData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read DRR1 register. + // + return(HWREGH(base + MCBSP_O_DRR1)); +} + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers. +//! +//! \param base is the base address of the McBSP port. +//! +//! This function returns the data values in data receive registers. +//! +//! \return received data. +// +//***************************************************************************** +static inline uint32_t +McBSP_read32bitData(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Read DDR1 register and return DDR2:DDR1. + // + return((((uint32_t)HWREGH(base + MCBSP_O_DRR2) << 16U) | + HWREGH(base + MCBSP_O_DRR1))); +} + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers. +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function writes 8,12 or 16 bit data to data transmit register. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_write16bitData(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write to DXR1 register. + // + HWREGH(base + MCBSP_O_DXR1) = data; +} + +//***************************************************************************** +// +//! Write 20, 24 or 32 bit data word to McBSP data transmit registers. +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function writes 20, 24 or 32 bit data to data transmit registers. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_write32bitData(uint32_t base, uint32_t data) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Write to DXR2 register first. + // + HWREGH(base + MCBSP_O_DXR2) = data >> 16U; + + // + // Write to DXR1 register. + // + HWREGH(base + MCBSP_O_DXR1) = data & 0xFFFFU; +} + +//***************************************************************************** +// +//! Return left justified for data for U Law or A Law companding. +//! +//! \param data is the 14 bit word. +//! \param compandingType specifies the type comapnding desired. +//! +//! This functions returns U law or A law adjusted word. +//! +//! \return U law or A law left justified word. +// +//***************************************************************************** +static inline uint16_t +McBSP_getLeftJustifyData(uint16_t data, + const McBSP_CompandingType compandingType) +{ + return(data << (uint16_t)compandingType); +} + + +//***************************************************************************** +// +//! Enable Recieve Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function enables Recieve Interrupt on RRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_enableRxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set RINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= MCBSP_MFFINT_RINT; +} + +//***************************************************************************** +// +//! Disable Recieve Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function disables Recieve Interrupt on RRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_disableRxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear RINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= ~(MCBSP_MFFINT_RINT); +} + +//***************************************************************************** +// +//! Enable Transmit Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function enables Transmit Interrupt on XRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_enableTxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Set XINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= MCBSP_MFFINT_XINT; +} + +//***************************************************************************** +// +//! Disable Transmit Interrupt. +//! +//! \param base is the base address of the McBSP module. +//! +//! This function disables Transmit Interrupt on XRDY. +//! +//! \return None. +// +//***************************************************************************** +static inline void +McBSP_disableTxInterrupt(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(McBSP_isBaseValid(base)); + + // + // Clear XINT ENA bit. + // + HWREGH(base + MCBSP_O_MFFINT) |= ~(MCBSP_MFFINT_XINT); +} + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 16 bit or less data to the transmitter buffer. +//! +//! \return None. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit16BitDataNonBlocking(uint32_t base, uint16_t data); + +//***************************************************************************** +// +//! Write 8,12 or 16 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 16 bit or less data to the transmitter buffer. If +//! transmit buffer is not ready the function will wait until transmit buffer +//! is empty. If the transmitter buffer is empty the data will be written to +//! the data registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit16BitDataBlocking(uint32_t base, uint16_t data); + +//***************************************************************************** +// +//! Write 20 , 24 or 32 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 20 , 24 or 32 bit data to the transmitter buffer. If +//! the transmitter buffer is empty the data will be written to the data +//! registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit32BitDataNonBlocking(uint32_t base, uint32_t data); + +//***************************************************************************** +// +//! Write 20 , 24 or 32 bit data word to McBSP data transmit registers +//! +//! \param base is the base address of the McBSP port. +//! \param data is the data to be written. +//! +//! This function sends 20 , 24 or 32 bit data to the transmitter buffer. If +//! transmit buffer is not ready the function will wait until transmit buffer +//! is empty. If the transmitter buffer is empty the data will be written +//! to the data registers. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_transmit32BitDataBlocking(uint32_t base, uint32_t data); + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 8,12 or 16 bit data from the receiver buffer. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive16BitDataNonBlocking(uint32_t base, uint16_t *receiveData); + +//***************************************************************************** +// +//! Read 8,12 or 16 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 8,12 or 16 bit data from the receiver buffer. If +//! receiver buffer is not ready the function will wait until receiver buffer +//! has new data. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive16BitDataBlocking(uint32_t base, uint16_t *receiveData); + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 20, 24 or 32 bit data from the receiver buffer. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive32BitDataNonBlocking(uint32_t base, uint32_t *receiveData); + +//***************************************************************************** +// +//! Read 20, 24 or 32 bit data word from McBSP data receive registers +//! +//! \param base is the base address of the McBSP port. +//! \param receiveData is the pointer to the receive data. +//! +//! This function reads 20, 24 or 32 bit data from the receiver buffer. If +//! receiver buffer is not ready the function will wait until receiver buffer +//! has new data. +//! If the receiver buffer has new data, the data will be read. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_receive32BitDataBlocking(uint32_t base, uint32_t *receiveData); + + +//***************************************************************************** +// +//! Sets number of words per frame and bits per word for data Reception. +//! +//! \param base is the base address of the McBSP module. +//! \param dataFrame is the data frame phase. +//! \param bitsPerWord is the number of bits per word. +//! \param wordsPerFrame is the number of words per frame per phase. +//! +//! This function sets the number of bits per word and the number of words per +//! frame for the given phase. +//! Valid inputs for phase are \b MCBSP_PHASE_ONE_FRAME or \b +//! MCBSP_PHASE_TWO_FRAME representing the first or second frame phase +//! respectively. Valid value for bitsPerWord are: +//! - \b MCBSP_BITS_PER_WORD_8 8 bit word. +//! - \b MCBSP_BITS_PER_WORD_12 12 bit word. +//! - \b MCBSP_BITS_PER_WORD_16 16 bit word. +//! - \b MCBSP_BITS_PER_WORD_20 20 bit word. +//! - \b MCBSP_BITS_PER_WORD_24 24 bit word. +//! - \b MCBSP_BITS_PER_WORD_32 32 bit word. +//! The maximum value for wordsPerFrame is 127 (128 - 1)representing 128 words. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_setRxDataSize(uint32_t base, const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame); + +//***************************************************************************** +// +//! Sets number of words per frame and bits per word for data Transmission. +//! +//! \param base is the base address of the McBSP module. +//! \param dataFrame is the data frame phase. +//! \param bitsPerWord is the number of bits per word. +//! \param wordsPerFrame is the number of words per frame per phase. +//! +//! This function sets the number of bits per word and the number of words per +//! frame for the given phase. +//! Valid inputs for phase are \b MCBSP_PHASE_ONE_FRAME or \b +//! MCBSP_PHASE_TWO_FRAME representing single or dual phase respectively. +//! Valid values for bitsPerWord are: +//! - \b MCBSP_BITS_PER_WORD_8 8 bit word. +//! - \b MCBSP_BITS_PER_WORD_12 12 bit word. +//! - \b MCBSP_BITS_PER_WORD_16 16 bit word. +//! - \b MCBSP_BITS_PER_WORD_20 20 bit word. +//! - \b MCBSP_BITS_PER_WORD_24 24 bit word. +//! - \b MCBSP_BITS_PER_WORD_32 32 bit word. +//! The maximum value for wordsPerFrame is 127 (128 - 1)representing 128 words. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_setTxDataSize(uint32_t base, + const McBSP_DataPhaseFrame dataFrame, + const McBSP_DataBitsPerWord bitsPerWord, + uint16_t wordsPerFrame); + +//***************************************************************************** +// +//! Disables a channel in an eight partition receiver +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the receiver channel number to be enabled. +//! +//! This function disables the given receiver channel number for the partition +//! provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_disableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Enables a channel for eight partition receiver +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the receiver channel number to be enabled. +//! +//! This function enables the given receiver channel number for the partition +//! provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_enableRxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Disables a channel in an eight partition transmitter +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the transmitter channel number to be enabled. +//! +//! This function disables the given transmitter channel number for the +//! partition provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_disableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Enables a channel for eight partition transmitter +//! +//! \param base is the base address of the McBSP module. +//! \param partition is the partition of the channel. +//! \param channel is the transmitter channel number to be enabled. +//! +//! This function enables the given transmitter channel number for the +//! partition provided. +//! Valid values for partition are \b MCBSP_MULTICHANNEL_TWO_PARTITION or +//! \b MCBSP_MULTICHANNEL_EIGHT_PARTITION for 2 or 8 partitions respectively. +//! Valid values for channel range from 0 to 127. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_enableTxChannel(uint32_t base, + const McBSP_MultichannelPartition partition, + uint16_t channel); + +//***************************************************************************** +// +//! Configures transmitter clock +//! +//! \param base is the base address of the McBSP module. +//! \param ptrClockParams is a pointer to a structure containing \e clock +//! parameters McBSP_ClockParams. +//! This function sets up the transmitter clock. The following are valid +//! values and ranges for the parameters of the McBSP_TxFsyncParams. +//! - \b clockSRGSyncFSR - true to sync with signal on FSR pin, +//! false to ignore signal on FSR pin. +//! the pulse on FSR pin. +//! - \b clockSRGDivider - Maximum valid value is 255. +//! - \b clockSource - MCBSP_EXTERNAL_TX_CLOCK_SOURCE or +//! MCBSP_INTERNAL_TX_CLOCK_SOURCE +//! - \b clockTxSRGSource - MCBSP_SRG_TX_CLOCK_SOURCE_LSPCLK or +//! MCBSP_SRG_TX_CLOCK_SOURCE_MCLKR_PIN +//! - \b clockMCLKXPolarity - Output polarity on MCLKX pin. +//! - MCBSP_TX_POLARITY_RISING_EDGE +//! - MCBSP_TX_POLARITY_FALLING_EDGE +//! - \b clockMCLKRPolarity - Input polarity on MCLKR pin (if SRG is +//! sourced from MCLKR pin). +//! - MCBSP_RX_POLARITY_FALLING_EDGE +//! - MCBSP_RX_POLARITY_RISING_EDGE +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxClock(uint32_t base, + const McBSP_ClockParams * ptrClockParams); + +//***************************************************************************** +// +//! Configures receiver clock +//! +//! \param base is the base address of the McBSP module. +//! \param ptrClockParams is a pointer to a structure containing \e clock +//! parameters McBSP_ClockParams. +//! This function sets up the receiver clock. The following are valid +//! values and ranges for the parameters of the McBSP_TxFsyncParams. +//! - \b clockSRGSyncFlag - true to sync with signal on FSR pin, false to +//! ignore the pulse on FSR pin. +//! - \b clockSRGDivider - Maximum valid value is 255. +//! - \b clockSource - MCBSP_EXTERNAL_RX_CLOCK_SOURCE or +//! MCBSP_INTERNAL_RX_CLOCK_SOURCE +//! - \b clockRxSRGSource - MCBSP_SRG_RX_CLOCK_SOURCE_LSPCLK or +//! MCBSP_SRG_RX_CLOCK_SOURCE_MCLKX_PIN +//! - \b clockMCLKRPolarity- output polarity on MCLKR pin. +//! - MCBSP_RX_POLARITY_FALLING_EDGE or +//! - MCBSP_RX_POLARITY_RISING_EDGE +//! - \b clockMCLKXPolarity- Input polarity on MCLKX pin (if SRG is sourced +//! from MCLKX pin). +//! - MCBSP_TX_POLARITY_RISING_EDGE or +//! - MCBSP_TX_POLARITY_FALLING_EDGE +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxClock(uint32_t base, + const McBSP_ClockParams * ptrClockParams); + +//***************************************************************************** +// +//! Configures transmitter frame sync. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrFsyncParams is a pointer to a structure containing \e frame sync +//! parameters McBSPTxFsyncParams. +//! This function sets up the transmitter frame sync. The following are valid +//! values and ranges for the parameters of the McBSPTxFsyncParams. +//! - \b syncSRGSyncFSRFlag - true to sync with signal on FSR pin, false to +//! ignore the pulse on FSR pin.This value has to +//! be similar to the value of +//! McBSP_ClockParams.clockSRGSyncFlag. +//! - \b syncErrorDetect - true to enable frame sync error detect. false +//! to disable. +//! - \b syncClockDivider - Maximum valid value is 4095. +//! - \b syncPulseDivider - Maximum valid value is 255. +//! - \b syncSourceTx - MCBSP_TX_INTERNAL_FRAME_SYNC_SOURCE or +//! MCBSP_TX_EXTERNAL_FRAME_SYNC_SOURCE +//! - \b syncIntSource - MCBSP_TX_INTERNAL_FRAME_SYNC_DATA or +//! MCBSP_TX_INTERNAL_FRAME_SYNC_SRG +//! - \b syncFSXPolarity - MCBSP_TX_FRAME_SYNC_POLARITY_LOW or +//! MCBSP_TX_FRAME_SYNC_POLARITY_HIGH. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxFrameSync(uint32_t base, + const McBSP_TxFsyncParams * ptrFsyncParams); + +//***************************************************************************** +// +//! Configures receiver frame sync. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrFsyncParams is a pointer to a structure containing \e frame sync +//! parameters McBSP_RxFsyncParams. +//! This function sets up the receiver frame sync. The following are valid +//! values and ranges for the parameters of the McBSPTxFsyncParams. +//! - \b syncSRGSyncFSRFlag - true to sync with signal on FSR pin, +//! false to ignore the pulse on FSR pin. +//! This value has to be similar to the value of +//! McBSP_ClockParams.clockSRGSyncFlag. +//! - \b syncErrorDetect - true to enable frame sync error detect. +//! false to disable. +//! - \b syncClockDivider - Maximum valid value is 4095. +//! - \b syncPulseDivider - Maximum valid value is 255. +//! - \b syncSourceRx - MCBSP_RX_INTERNAL_FRAME_SYNC_SOURCE or +//! MCBSP_RX_EXTERNAL_FRAME_SYNC_SOURCE +//! - \b syncFSRPolarity - MCBSP_RX_FRAME_SYNC_POLARITY_LOW or +//! MCBSP_RX_FRAME_SYNC_POLARITY_HIGH +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxFrameSync(uint32_t base, + const McBSP_RxFsyncParams * ptrFsyncParams); + +//***************************************************************************** +// +//! Configures transmitter data format. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrDataParams is a pointer to a structure containing \e data format +//! parameters McBSPTxDataParams. +//! This function sets up the transmitter data format and properties. The +//! following are valid values and ranges for the parameters of the +//! McBSPTxDataParams. +//! - \b loopbackModeFlag - true for digital loop-back mode. +//! false for no loop-back mode. +//! - \b twoPhaseModeFlag - true for two phase mode. +//! false for single phase mode. +//! - \b pinDelayEnableFlag - true to enable DX pin delay. +//! false to disable DX pin delay. +//! - \b phase1FrameLength - maximum value of 127. +//! - \b phase2FrameLength - maximum value of 127. +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b phase1WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b phase2WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b compandingMode - MCBSP_COMPANDING_NONE, +//! MCBSP_COMPANDING_NONE_LSB_FIRST +//! MCBSP_COMPANDING_U_LAW_SET or +//! MCBSP_COMPANDING_A_LAW_SET. +//! - \b dataDelayBits - MCBSP_DATA_DELAY_BIT_0, +//! MCBSP_DATA_DELAY_BIT_1 or +//! MCBSP_DATA_DELAY_BIT_2 +//! - \b interruptMode - MCBSP_TX_ISR_SOURCE_TX_READY, +//! MCBSP_TX_ISR_SOURCE_END_OF_BLOCK, +//! MCBSP_TX_ISR_SOURCE_FRAME_SYNC or +//! MCBSP_TX_ISR_SOURCE_SYNC_ERROR +//! +//! \b Note - When using companding,phase1WordLength and phase2WordLength +//! must be 8 bits wide. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureTxDataFormat(uint32_t base, + const McBSP_TxDataParams * ptrDataParams); + +//***************************************************************************** +// +//! Configures receiver data format. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrDataParams is a pointer to a structure containing data format +//! parameters McBSP_RxDataParams. +//! This function sets up the transmitter data format and properties. The +//! following are valid values and ranges for the parameters of the +//! McBSP_RxDataParams. +//! - \b loopbackModeFlag - true for digital loop-back mode. +//! false for non loop-back mode. +//! - \b twoPhaseModeFlag - true for two phase mode. +//! false for single phase mode. +//! - \b phase1FrameLength - maximum value of 127. +//! - \b phase2FrameLength - maximum value of 127. +//! - \b phase1WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b phase2WordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b compandingMode - MCBSP_COMPANDING_NONE, +//! MCBSP_COMPANDING_NONE_LSB_FIRST +//! MCBSP_COMPANDING_U_LAW_SET or +//! MCBSP_COMPANDING_A_LAW_SET. +//! - \b dataDelayBits - MCBSP_DATA_DELAY_BIT_0, +//! MCBSP_DATA_DELAY_BIT_1 or +//! MCBSP_DATA_DELAY_BIT_2 +//! - \b signExtMode - MCBSP_RIGHT_JUSTIFY_FILL_ZERO, +//! MCBSP_RIGHT_JUSTIFY_FILL_SIGN or +//! MCBSP_LEFT_JUSTIFY_FILL_ZER0 +//! - \b interruptMode - MCBSP_RX_ISR_SOURCE_SERIAL_WORD, +//! MCBSP_RX_ISR_SOURCE_END_OF_BLOCK, +//! MCBSP_RX_ISR_SOURCE_FRAME_SYNC or +//! MCBSP_RX_ISR_SOURCE_SYNC_ERROR +//! +//! \b Note - When using companding,phase1WordLength and phase2WordLength +//! must be 8 bits wide. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureRxDataFormat(uint32_t base, + const McBSP_RxDataParams * ptrDataParams); + +//***************************************************************************** +// +//! Configures transmitter multichannel. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrMchnParams is a pointer to a structure containing multichannel +//! parameters McBSP_TxMultichannelParams. +//! +//! This function sets up the transmitter multichannel mode. The following are +//! valid values and ranges for the parameters of the +//! McBSP_TxMultichannelParams. +//! - \b channelCount - Maximum value of 128 for partition 8 +//! Maximum value of 32 for partition 2 +//! - \b ptrChannelsList - Pointer to an array of size channelCount that +//! has unique channels. +//! - \b multichannelMode - MCBSP_ALL_TX_CHANNELS_ENABLED, +//! MCBSP_TX_CHANNEL_SELECTION_ENABLED, +//! MCBSP_ENABLE_MASKED_TX_CHANNEL_SELECTION or +//! MCBSP_SYMMERTIC_RX_TX_SELECTION +//! - \b partition - MCBSP_MULTICHANNEL_TWO_PARTITION or +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION +//! \note - In 2 partition mode only channels that belong to a single even or +//! odd block number should be listed. It is valid to have an even and +//! odd channels. For example you can have channels [48 -63] and +//! channels [96 - 111] enables as one belongs to an even block and +//! the other to an odd block or two partitions. But not channels +//! [48 - 63] and channels [112 - 127] since they both are even blocks +//! or similar partitions. +//! +//! \return returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - number of channels exceeds 128 +//! - \b MCBSP_ERROR_2_PARTITION_A - invalid channel combination for +//! partition A +//! - \b MCBSP_ERROR_2_PARTITION_B - invalid channel combination for +//! partition B +//! - \b MCBSP_ERROR_INVALID_MODE - invalid transmitter channel mode. +//! +//! \return Returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - Exceeded number of channels. +//! - \b MCBSP_ERROR_2_PARTITION_A - Error in 2 partition A setup. +//! - \b MCBSP_ERROR_2_PARTITION_B - Error in 2 partition B setup. +//! - \b MCBSP_ERROR_INVALID_MODE - Invalid mode. +// +//***************************************************************************** +extern uint16_t +McBSP_configureTxMultichannel(uint32_t base, + const McBSP_TxMultichannelParams * ptrMchnParams); + +//***************************************************************************** +// +//! Configures receiver multichannel. +//! +//! \param base is the base address of the McBSP module. +//! \param ptrMchnParams is a pointer to a structure containing multichannel +//! parameters McBSP_RxMultiChannelParams. +//! +//! This function sets up the receiver multichannel mode. The following are +//! valid values and ranges for the parameters of the McBSPMultichannelParams. +//! - \b channelCount - Maximum value of 128 for partition 8 +//! Maximum value of 32 for partition 2 +//! - \b ptrChannelsList - Pointer to an array of size channelCount that +//! has unique channels. +//! - \b multichannelMode - MCBSP_ALL_RX_CHANNELS_ENABLED, +//! MCBSP_RX_CHANNEL_SELECTION_ENABLED, +//! - \b partition - MCBSP_MULTICHANNEL_TWO_PARTITION or +//! MCBSP_MULTICHANNEL_EIGHT_PARTITION +//! \note - In 2 partition mode only channels that belong to a single even or +//! odd block number should be listed. It is valid to have an even +//! and odd channels. For example you can have channels [48 - 63] and +//! channels [96 - 111] enables as one belongs to an even block and +//! the other to an odd block or two partitions. But not channels +//! [48 - 63]and channels [112 - 127] since they both are even blocks +//! or similar partitions. +//! +//! \return returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - number of channels exceeds 128 +//! - \b MCBSP_ERROR_2_PARTITION_A - invalid channel combination for +//! partition A +//! - \b MCBSP_ERROR_2_PARTITION_B - invalid channel combination for +//! partition B +//! - \b MCBSP_ERROR_INVALID_MODE - invalid transmitter channel mode. +//! +//! \return Returns the following error codes. +//! - \b MCBSP_ERROR_EXCEEDED_CHANNELS - Exceeded number of channels. +//! - \b MCBSP_ERROR_2_PARTITION_A - Error in 2 partition A setup. +//! - \b MCBSP_ERROR_2_PARTITION_B - Error in 2 partition B setup. +//! - \b MCBSP_ERROR_INVALID_MODE - Invalid mode. +// +//***************************************************************************** +extern uint16_t +McBSP_configureRxMultichannel(uint32_t base, + const McBSP_RxMultichannelParams * ptrMchnParams); + +//***************************************************************************** +// +//! Configures McBSP in SPI master mode +//! +//! \param base is the base address of the McBSP module. +//! \param ptrSPIMasterMode is a pointer to a structure containing SPI +//! parameters McBSP_SPIMasterModeParams. +//! This function sets up the McBSP module in SPI master mode.The following are +//! valid values and ranges for the parameters of the +//! McBSP_SPIMasterModeParams. +//! - \b loopbackModeFlag - true for digital loop-back +//! false for no loop-back +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b wordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b spiMode It represents the clock polarity can take values: +//! - MCBSP_TX_POLARITY_RISING_EDGE or +//! MCBSP_TX_POLARITY_FALLING_EDGE +//! - \b clockSRGDivider - Maximum valid value is 255. +//! +//! \note Make sure the clock divider is such that, the McBSP clock is not +//! running faster than 1/2 the speed of the source clock. +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureSPIMasterMode(uint32_t base, + const McBSP_SPIMasterModeParams * ptrSPIMasterMode); + +//***************************************************************************** +// +//! Configures McBSP in SPI slave mode +//! +//! \param base is the base address of the McBSP module. +//! \param ptrSPISlaveMode is a pointer to a structure containing SPI +//! parameters McBSP_SPISlaveModeParams. +//! This function sets up the McBSP module in SPI slave mode.The following are +//! valid values and ranges for the parameters of the McBSP_SPISlaveModeParams. +//! - \b loopbackModeFlag - true for digital loop-back +//! false for no loop-back +//! - \b clockStopMode - MCBSP_CLOCK_SPI_MODE_NO_DELAY or +//! MCBSP_CLOCK_SPI_MODE_DELAY +//! - \b wordLength - MCBSP_BITS_PER_WORD_x , x = 8,12,16,20,24,32 +//! - \b spiMode It represents the clock polarity and can take +//! values: +//! - MCBSP_RX_POLARITY_FALLING_EDGE or +//! MCBSP_RX_POLARITY_RISING_EDGE +//! +//! \return None. +// +//***************************************************************************** +extern void +McBSP_configureSPISlaveMode(uint32_t base, + const McBSP_SPISlaveModeParams * ptrSPISlaveMode); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // MCBSP_H diff --git a/gpio_driverlib_cpu1/device/driverlib/memcfg.c b/gpio_driverlib_cpu1/device/driverlib/memcfg.c new file mode 100644 index 0000000..c9a4dc7 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/memcfg.c @@ -0,0 +1,701 @@ +//########################################################################### +// +// FILE: memcfg.c +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "memcfg.h" + + +//***************************************************************************** +// +// MemCfg_lockConfig +// +//***************************************************************************** +void +MemCfg_lockConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Set the bit that blocks writes to the sections' configuration registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Lock configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of memory sections. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_unlockConfig +// +//***************************************************************************** +void +MemCfg_unlockConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Clear the bit that blocks writes to the sections' configuration + // registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) &= ~(MEMCFG_SECT_NUM_MASK & + memSections); + break; + + + case MEMCFG_SECT_TYPE_MASK: + // + // Unlock configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_DX_ALL)); + HWREG(MEMCFG_BASE + MEMCFG_O_LSXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_LSX_ALL)); + HWREG(MEMCFG_BASE + MEMCFG_O_GSXLOCK) &= + ~((uint32_t)(MEMCFG_SECT_NUM_MASK & MEMCFG_SECT_GSX_ALL)); + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of memory sections. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_commitConfig +// +//***************************************************************************** +void +MemCfg_commitConfig(uint32_t memSections) +{ + // + // Check the arguments. + // + ASSERT(((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + (memSections == MEMCFG_SECT_ALL)); + + // + // Set the bit that permanently blocks writes to the sections' + // configuration registers. + // + EALLOW; + + switch(memSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + memSections; + break; + + + case MEMCFG_SECT_TYPE_MASK: + // + // Commit configuration for all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXCOMMIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + break; + + default: + // + // Do nothing. Invalid memSections. Make sure you aren't OR-ing + // values for two different types of RAM. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setProtection +// +//***************************************************************************** +void +MemCfg_setProtection(uint32_t memSection, uint32_t protectMode) +{ + uint32_t shiftVal = 0U; + uint32_t maskVal; + uint32_t regVal; + uint32_t sectionNum; + uint32_t regOffset; + + // + // Check the arguments. + // + ASSERT(((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS)); + + // + // Calculate how far the protect mode value needs to be shifted. Each + // section number is represented by a bit in the lower word of memSection + // and 8 bits in the corresponding ACCPROT register. + // + sectionNum = memSection & MEMCFG_SECT_NUM_MASK; + + while(sectionNum != 1U) + { + sectionNum = sectionNum >> 1U; + shiftVal += 8U; + } + + // + // Calculate register offset. Also, make sure the shift value is no greater + // than 31. + // + regOffset = (shiftVal & ~(0x1FU)) >> 4U; + shiftVal &= 0x0001FU; + maskVal = (uint32_t)MEMCFG_XACCPROTX_M << shiftVal; + regVal = protectMode << shiftVal; + + // + // Write the access protection mode into the appropriate field + // + EALLOW; + + switch(memSection & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_DXACCPROT0 + regOffset) |= regVal; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXACCPROT0 + regOffset) |= regVal; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXACCPROT0 + regOffset) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXACCPROT0 + regOffset) |= regVal; + break; + + + default: + // + // Do nothing. Invalid memSection. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setLSRAMControllerSel +// +//***************************************************************************** +void +MemCfg_setLSRAMControllerSel(uint32_t ramSection, + MemCfg_LSRAMControllerSel controllerSel) +{ + uint32_t shiftVal; + uint32_t temp; + + // + // Check the arguments. + // + ASSERT((ramSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS); + + // + // Calculate how far the controller select value needs to be shifted. Each + // section number is represented by a bit in the lower word of ramSection + // and 2 bits in the corresponding MSEL register. + // + shiftVal = 0U; + temp = MEMCFG_SECT_NUM_MASK & ramSection; + + while(temp != 1U) + { + temp = temp >> 1U; + shiftVal += 2U; + } + + // + // Write the controller select setting into the appropriate field + // + EALLOW; + + HWREG(MEMCFG_BASE + MEMCFG_O_LSXMSEL) = + (HWREG(MEMCFG_BASE + MEMCFG_O_LSXMSEL) & + ~((uint32_t)MEMCFG_LSXMSEL_MSEL_LS0_M << shiftVal)) | + ((uint32_t)controllerSel << shiftVal); + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setGSRAMControllerSel +// +//***************************************************************************** +void +MemCfg_setGSRAMControllerSel(uint32_t ramSections, + MemCfg_GSRAMControllerSel controllerSel) +{ + uint32_t sectionNum; + + // + // Check the arguments. + // + ASSERT((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS); + + // + // We only need the section number bits for this function. + // + sectionNum = ramSections & MEMCFG_SECT_NUM_MASK; + + // + // Write the controller select setting into the appropriate field. + // + EALLOW; + if(controllerSel == MEMCFG_GSRAMCONTROLLER_CPU1) + { + HWREG(MEMCFG_BASE + MEMCFG_O_GSXMSEL) &= ~sectionNum; + } + else + { + HWREG(MEMCFG_BASE + MEMCFG_O_GSXMSEL) |= sectionNum; + } + EDIS; +} + +//***************************************************************************** +// +// MemCfg_setTestMode +// +//***************************************************************************** +void +MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode) +{ + uint32_t shiftVal = 0U; + uint32_t maskVal; + uint32_t regVal; + uint32_t sectionNum; + + // + // Check the arguments. + // + ASSERT(((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((memSection & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG)); + + // + // Calculate how far the protect mode value needs to be shifted. Each + // section number is represented by a bit in the lower word of memSection + // and 2 bits in the corresponding TEST register. + // + sectionNum = memSection & MEMCFG_SECT_NUM_MASK; + + while(sectionNum != 1U) + { + sectionNum = sectionNum >> 1U; + shiftVal += 2U; + } + + maskVal = (uint32_t)MEMCFG_XTEST_M << shiftVal; + regVal = (uint32_t)testMode << shiftVal; + + // + // Write the test mode into the appropriate field + // + EALLOW; + + switch(memSection & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_DXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXTEST) |= regVal; + break; + + case MEMCFG_SECT_TYPE_MSG: + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXTEST) &= ~maskVal; + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXTEST) |= regVal; + break; + + default: + // + // Do nothing. Invalid memSection. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_initSections +// +//***************************************************************************** +void +MemCfg_initSections(uint32_t ramSections) +{ + // + // Check the arguments. + // + ASSERT(((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG) || + (ramSections == MEMCFG_SECT_ALL)); + + // + // Set the bit in the various initialization registers that starts + // initialization. + // + EALLOW; + + switch(ramSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + HWREG(MEMCFG_BASE + MEMCFG_O_DXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_LS: + HWREG(MEMCFG_BASE + MEMCFG_O_LSXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_GS: + HWREG(MEMCFG_BASE + MEMCFG_O_GSXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_MSG: + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINIT) |= MEMCFG_SECT_NUM_MASK & + ramSections; + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Initialize all sections. + // + HWREG(MEMCFG_BASE + MEMCFG_O_DXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_DX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_LSXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_LSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_GSXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_GSX_ALL; + HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINIT) |= MEMCFG_SECT_NUM_MASK & + MEMCFG_SECT_MSGX_ALL; + break; + + default: + // + // Do nothing. Invalid ramSections. Make sure you aren't OR-ing + // values for two different types of RAM. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +// MemCfg_getInitStatus +// +//***************************************************************************** +bool +MemCfg_getInitStatus(uint32_t ramSections) +{ + uint32_t status; + + // + // Check the arguments. + // + ASSERT(((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS) || + ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG) || + (ramSections == MEMCFG_SECT_ALL)); + + // + // Read registers containing the initialization complete status. + // + switch(ramSections & MEMCFG_SECT_TYPE_MASK) + { + case MEMCFG_SECT_TYPE_D: + status = HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE); + break; + + case MEMCFG_SECT_TYPE_LS: + status = HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE); + break; + + case MEMCFG_SECT_TYPE_GS: + status = HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE); + break; + + case MEMCFG_SECT_TYPE_MSG: + status = HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE); + break; + + case MEMCFG_SECT_TYPE_MASK: + // + // Return the overall status. + // + if((HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE) == + (MEMCFG_SECT_DX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE) == + (MEMCFG_SECT_LSX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE) == + (MEMCFG_SECT_GSX_ALL & MEMCFG_SECT_NUM_MASK)) && + (HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE) == + (MEMCFG_SECT_MSGX_ALL & MEMCFG_SECT_NUM_MASK))) + { + status = MEMCFG_SECT_NUM_MASK; + } + else + { + status = 0U; + } + break; + + default: + // + // Invalid ramSections. Make sure you aren't OR-ing values for two + // different types of RAM. + // + status = 0U; + break; + } + + return((ramSections & status) == (ramSections & MEMCFG_SECT_NUM_MASK)); +} + +//***************************************************************************** +// +// MemCfg_getViolationAddress +// +//***************************************************************************** +uint32_t +MemCfg_getViolationAddress(uint32_t intFlag) +{ + uint32_t address; + uint32_t stsNumber; + + // + // Calculate the the address of the desired violation address register. + // + if((intFlag & MEMCFG_MVIOL_MASK) != 0U) + { + stsNumber = intFlag >> MEMCFG_MVIOL_SHIFT; + address = ACCESSPROTECTION_BASE + MEMCFG_O_MCPUFAVADDR; + } + else + { + stsNumber = intFlag; + address = ACCESSPROTECTION_BASE + MEMCFG_O_NMCPURDAVADDR; + } + + while(stsNumber > 1U) + { + stsNumber = stsNumber >> 1U; + address += (uint32_t)(MEMCFG_O_NMCPUWRAVADDR - MEMCFG_O_NMCPURDAVADDR); + } + + // + // Read and return the access violation address at the calculated location. + // + return(HWREG(address)); +} + +//***************************************************************************** +// +// MemCfg_getCorrErrorAddress +// +//***************************************************************************** +uint32_t +MemCfg_getCorrErrorAddress(uint32_t stsFlag) +{ + // + // Check the arguments. + // + if(stsFlag != MEMCFG_CERR_CPUREAD) + { + // + // Currently, the only correctable error address that can be read + // from a register is one for a CPU read error (MEMCFG_CERR_CPUREAD). + // For the sake of keeping this function portable to possible future + // devices with other error types, it still takes a stsFlag parameter. + // + ASSERT((bool)false); + } + + // + // Read and return the error address. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CCPUREADDR)); +} + +//***************************************************************************** +// +// MemCfg_getUncorrErrorAddress +// +//***************************************************************************** +uint32_t +MemCfg_getUncorrErrorAddress(uint32_t stsFlag) +{ + uint32_t address; + uint32_t temp; + + // + // Calculate the the address of the desired error address register. + // + address = MEMORYERROR_BASE + MEMCFG_O_UCCPUREADDR; + + temp = stsFlag; + + while(temp > 1U) + { + temp = temp >> 1U; + address += (uint32_t)(MEMCFG_O_UCDMAREADDR - MEMCFG_O_UCCPUREADDR); + } + + // + // Read and return the error address at the calculated location. + // + return(HWREG(address)); +} + + diff --git a/gpio_driverlib_cpu1/device/driverlib/memcfg.h b/gpio_driverlib_cpu1/device/driverlib/memcfg.h new file mode 100644 index 0000000..8a9b6fc --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/memcfg.h @@ -0,0 +1,1266 @@ +//########################################################################### +// +// FILE: memcfg.h +// +// TITLE: C28x RAM config driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef MEMCFG_H +#define MEMCFG_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup memcfg_api MemCfg +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memcfg.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. Not intended for use by +// application code. +// +//***************************************************************************** +// +// Masks to decode memory section defines. +// +#define MEMCFG_SECT_TYPE_MASK 0xFF000000U +#define MEMCFG_SECT_TYPE_D 0x00000000U +#define MEMCFG_SECT_TYPE_LS 0x01000000U +#define MEMCFG_SECT_TYPE_GS 0x02000000U +#define MEMCFG_SECT_TYPE_MSG 0x03000000U +#define MEMCFG_SECT_NUM_MASK 0x00FFFFFFU +#define MEMCFG_XACCPROTX_M ((uint32_t)MEMCFG_GSXACCPROT0_FETCHPROT_GS0 | \ + (uint32_t)MEMCFG_GSXACCPROT0_CPUWRPROT_GS0 | \ + (uint32_t)MEMCFG_GSXACCPROT0_DMAWRPROT_GS0) +#define MEMCFG_XTEST_M MEMCFG_DXTEST_TEST_M0_M + +// +// Used for access violation functions. +// +#define MEMCFG_NMVIOL_MASK 0x0000FFFFU +#define MEMCFG_MVIOL_MASK 0x000F0000U +#define MEMCFG_MVIOL_SHIFT 16U + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to MemCfg_lockConfig(), MemCfg_unlockConfig(), +// MemCfg_commitConfig(), MemCfg_setProtection(), MemCfg_initSections(), +// MemCfg_setCLAMemType(), MemCfg_setLSRAMControllerSel(), +// MemCfg_getInitStatus() as the memSection(s) or ramSection(s) parameter. +// +//***************************************************************************** +// +// DxRAM - Dedicated RAM config +// +#define MEMCFG_SECT_M0 0x00000001U //!< M0 RAM +#define MEMCFG_SECT_M1 0x00000002U //!< M1 RAM +#define MEMCFG_SECT_D0 0x00000004U //!< D0 RAM +#define MEMCFG_SECT_D1 0x00000008U //!< D1 RAM +#define MEMCFG_SECT_DX_ALL 0x0000000FU //!< All M and D RAM + +// +// LSxRAM - Local shared RAM config +// +#define MEMCFG_SECT_LS0 0x01000001U //!< LS0 RAM +#define MEMCFG_SECT_LS1 0x01000002U //!< LS1 RAM +#define MEMCFG_SECT_LS2 0x01000004U //!< LS2 RAM +#define MEMCFG_SECT_LS3 0x01000008U //!< LS3 RAM +#define MEMCFG_SECT_LS4 0x01000010U //!< LS4 RAM +#define MEMCFG_SECT_LS5 0x01000020U //!< LS5 RAM +#define MEMCFG_SECT_LSX_ALL 0x0100003FU //!< All LS RAM + +// +// GSxRAM - Global shared RAM config +// +#define MEMCFG_SECT_GS0 0x02000001U //!< GS0 RAM +#define MEMCFG_SECT_GS1 0x02000002U //!< GS1 RAM +#define MEMCFG_SECT_GS2 0x02000004U //!< GS2 RAM +#define MEMCFG_SECT_GS3 0x02000008U //!< GS3 RAM +#define MEMCFG_SECT_GS4 0x02000010U //!< GS4 RAM +#define MEMCFG_SECT_GS5 0x02000020U //!< GS5 RAM +#define MEMCFG_SECT_GS6 0x02000040U //!< GS6 RAM +#define MEMCFG_SECT_GS7 0x02000080U //!< GS7 RAM +#define MEMCFG_SECT_GS8 0x02000100U //!< GS8 RAM +#define MEMCFG_SECT_GS9 0x02000200U //!< GS9 RAM +#define MEMCFG_SECT_GS10 0x02000400U //!< GS10 RAM +#define MEMCFG_SECT_GS11 0x02000800U //!< GS11 RAM +#define MEMCFG_SECT_GS12 0x02001000U //!< GS12 RAM +#define MEMCFG_SECT_GS13 0x02002000U //!< GS13 RAM +#define MEMCFG_SECT_GS14 0x02004000U //!< GS14 RAM +#define MEMCFG_SECT_GS15 0x02008000U //!< GS15 RAM +#define MEMCFG_SECT_GSX_ALL 0x0200FFFFU //!< All GS RAM + +// +// MSGxRAM - Message RAM config +// +#define MEMCFG_SECT_MSGCPUTOCPU 0x03000001U //!< CPU-to-CPU message RAM +#define MEMCFG_SECT_MSGCPUTOCLA1 0x03000002U //!< CPU-to-CLA1 message RAM +#define MEMCFG_SECT_MSGCLA1TOCPU 0x03000004U //!< CLA1-to-CPU message RAM +#define MEMCFG_SECT_MSGX_ALL 0x03000007U //!< All message RAM + + +// +// All sections +// +#define MEMCFG_SECT_ALL 0xFFFFFFFFU //!< All configurable RAM + +//***************************************************************************** +// +// Values that can be passed to MemCfg_setProtection() as the protectMode +// parameter. +// +//***************************************************************************** +#define MEMCFG_PROT_ALLOWCPUFETCH 0x00000000U //!< CPU fetch allowed +#define MEMCFG_PROT_BLOCKCPUFETCH 0x00000001U //!< CPU fetch blocked + +#define MEMCFG_PROT_ALLOWCPUWRITE 0x00000000U //!< CPU write allowed +#define MEMCFG_PROT_BLOCKCPUWRITE 0x00000002U //!< CPU write blocked + +#define MEMCFG_PROT_ALLOWDMAWRITE 0x00000000U //!< DMA write allowed (GSxRAM) +#define MEMCFG_PROT_BLOCKDMAWRITE 0x00000004U //!< DMA write blocked (GSxRAM) + +//***************************************************************************** +// +// Values that can be passed to MemCfg_enableViolationInterrupt() +// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(), +// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as +// the intFlags parameter. They also make up the return value of +// MemCfg_getViolationInterruptStatus(). +// +//***************************************************************************** +#define MEMCFG_NMVIOL_CPUREAD 0x00000001U //!< Non-controller CPU read access +#define MEMCFG_NMVIOL_CPUWRITE 0x00000002U //!< Non-controller CPU write access +#define MEMCFG_NMVIOL_CPUFETCH 0x00000004U //!< Non-controller CPU fetch access +#define MEMCFG_NMVIOL_DMAWRITE 0x00000008U //!< Non-controller DMA write access +#define MEMCFG_NMVIOL_CLA1READ 0x00000010U //!< Non-controller CLA1 read access +#define MEMCFG_NMVIOL_CLA1WRITE 0x00000020U //!< Non-controller CLA1 write access +#define MEMCFG_NMVIOL_CLA1FETCH 0x00000040U //!< Non-controller CLA1 fetch access + +//***************************************************************************** +// +// Values that can be passed to MemCfg_enableViolationInterrupt() +// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(), +// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as +// the intFlags parameter. They also make up the return value of +// MemCfg_getViolationInterruptStatus(). +// +//***************************************************************************** +#define MEMCFG_MVIOL_CPUFETCH 0x00010000U //!< Controller CPU fetch access +#define MEMCFG_MVIOL_CPUWRITE 0x00020000U //!< Controller CPU write access +#define MEMCFG_MVIOL_DMAWRITE 0x00040000U //!< Controller DMA write access + +//***************************************************************************** +// +// Values that can be passed to MemCfg_forceCorrErrorStatus(), +// MemCfg_clearCorrErrorStatus(), and MemCfg_getCorrErrorAddress() as the +// stsFlag(s) parameter and returned by MemCfg_getCorrErrorStatus(). +// +// Note that MEMCFG_CERR_CPUREAD is the only value below that has a +// corresponding interrupt and may be used with the error functions that take +// an intFlag(s) parameter. +// +//***************************************************************************** +#define MEMCFG_CERR_CPUREAD 0x0001U //!< Correctable CPU read error +#define MEMCFG_CERR_DMAREAD 0x0002U //!< Correctable DMA read error +#define MEMCFG_CERR_CLA1READ 0x0004U //!< Correctable CLA1 read error +//***************************************************************************** +// +// Values that can be passed to MemCfg_forceUncorrErrorStatus(), +// MemCfg_clearUncorrErrorStatus(), and MemCfg_getUncorrErrorAddress() as the +// stsFlag(s) parameter and returned by MemCfg_getUncorrErrorStatus(). +// +//***************************************************************************** +#define MEMCFG_UCERR_CPUREAD 0x0001U //!< Uncorrectable CPU read error +#define MEMCFG_UCERR_DMAREAD 0x0002U //!< Uncorrectable DMA read error +#define MEMCFG_UCERR_CLA1READ 0x0004U //!< Uncorrectable CLA1 read error + +#endif + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setCLAMemType() as the \e claMemType +//! parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_CLA_MEM_DATA, //!< Section is CLA data memory + MEMCFG_CLA_MEM_PROGRAM //!< Section is CLA program memory +} MemCfg_CLAMemoryType; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setLSRAMControllerSel() as the +//! \e controllerSel parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_LSRAMCONTROLLER_CPU_ONLY, //!< CPU is the owner of the section + MEMCFG_LSRAMCONTROLLER_CPU_CLA1 //!< CPU and CLA1 share this section +} MemCfg_LSRAMControllerSel; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setGSRAMControllerSel() as the +//! \e controllerSel parameter. +// +//***************************************************************************** +typedef enum +{ + MEMCFG_GSRAMCONTROLLER_CPU1, //!< CPU1 is controller of the section + MEMCFG_GSRAMCONTROLLER_CPU2 //!< CPU2 is controller of the section +} MemCfg_GSRAMControllerSel; + +//***************************************************************************** +// +//! Values that can be passed to MemCfg_setTestMode() as the \e testMode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Functional mode. Test mode is disabled. + MEMCFG_TEST_FUNCTIONAL = 0, + //! Writes allowed to data only + MEMCFG_TEST_WRITE_DATA = 1, + //! Writes allowed to ECC only (for DxRAM/MxRAM) + MEMCFG_TEST_WRITE_ECC = 2, + //! Writes allowed to parity only (for LSxRAM, GSxRAM, and MSGxRAM) + MEMCFG_TEST_WRITE_PARITY = 2 +} MemCfg_TestMode; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** + +//***************************************************************************** +// +//! Sets the CLA memory type of the specified RAM section. +//! +//! \param ramSections is the logical OR of the sections to be configured. +//! \param claMemType indicates data memory or program memory. +//! +//! This function sets the CLA memory type configuration of the RAM section. If +//! the \e claMemType parameter is \b MEMCFG_CLA_MEM_DATA, the RAM section will +//! be configured as CLA data memory. If \b MEMCFG_CLA_MEM_PROGRAM, the RAM +//! section will be configured as CLA program memory. +//! +//! The \e ramSections parameter is an OR of the following indicators: +//! \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx. +//! +//! \note This API only applies to LSx RAM and has no effect if the CLA isn't +//! controller of the memory section. +//! +//! \sa MemCfg_setLSRAControllerSel() +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_setCLAMemType(uint32_t ramSections, MemCfg_CLAMemoryType claMemType) +{ + // + // Check the arguments. + // + ASSERT((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS); + + // + // Write the CLA memory configuration to the appropriate register. Either + // set or clear the bit that determines the function of the RAM section as + // it relates to the CLA. + // + EALLOW; + + if(claMemType == MEMCFG_CLA_MEM_PROGRAM) + { + // + // Program memory + // + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) |= ramSections; + } + else + { + // + // Data memory + // + HWREG(MEMCFG_BASE + MEMCFG_O_LSXCLAPGM) &= ~ramSections; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables individual RAM access violation interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! This function enables the indicated RAM access violation interrupt sources. +//! Only the sources that are enabled can be reflected to the processor +//! interrupt; disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableViolationInterrupt(uint32_t intFlags) +{ + // + // Enable the specified interrupts. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) |= + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) |= + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Disables individual RAM access violation interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! This function disables the indicated RAM access violation interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only non-controller violations may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableViolationInterrupt(uint32_t intFlags) +{ + // + // Disable the specified interrupts. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVINTEN) &= + ~(intFlags & MEMCFG_NMVIOL_MASK); + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVINTEN) &= + ~((intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current RAM access violation status. +//! +//! This function returns the RAM access violation status. This function will +//! return flags for both controller and non-controller access violations +//! although only the non-controller flags have the ability to cause the +//! generation of an interrupt. +//! +//! \return Returns the current violation status, enumerated as a bit field of +//! the values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//***************************************************************************** +static inline uint32_t +MemCfg_getViolationInterruptStatus(void) +{ + uint32_t status; + + // + // Read and return RAM access status flags. + // + status = (HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVFLG)) | + (HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVFLG) << + MEMCFG_MVIOL_SHIFT); + + return(status); +} + +//***************************************************************************** +// +//! Sets the RAM access violation status. +//! +//! \param intFlags is a bit mask of the access violation flags to be set. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! This function sets the RAM access violation status. This function will +//! set flags for both controller and non-controller access violations, and an +//! interrupt will be generated if it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceViolationInterrupt(uint32_t intFlags) +{ + // + // Shift and mask the flags appropriately and write them to the + // corresponding SET register. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVSET) = + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVSET) = + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Clears RAM access violation flags. +//! +//! \param intFlags is a bit mask of the access violation flags to be cleared. +//! Can be a logical OR any of the following values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearViolationInterruptStatus(uint32_t intFlags) +{ + // + // Clear the requested access violation flags. + // + EALLOW; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_NMAVCLR) |= + intFlags & MEMCFG_NMVIOL_MASK; + + HWREG(ACCESSPROTECTION_BASE + MEMCFG_O_MAVCLR) |= + (intFlags & MEMCFG_MVIOL_MASK) >> MEMCFG_MVIOL_SHIFT; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the correctable error threshold value. +//! +//! \param threshold is the correctable error threshold. +//! +//! This value sets the error-count threshold at which a correctable error +//! interrupt is generated. That is when the error count register reaches the +//! value specified by the \e threshold parameter, an interrupt is +//! generated if it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_setCorrErrorThreshold(uint32_t threshold) +{ + // + // Write the threshold value to the appropriate register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRTHRES) = threshold; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the correctable error count. +//! +//! \return Returns the number of correctable error have occurred. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorCount(void) +{ + // + // Read and return the number of errors that have occurred. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCNT)); +} + +//***************************************************************************** +// +//! Enables individual RAM correctable error interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be enabled. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function enables the indicated RAM correctable error interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Enable the specified interrupts. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) |= intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Disables individual RAM correctable error interrupt sources. +//! +//! \param intFlags is a bit mask of the interrupt sources to be disabled. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function disables the indicated RAM correctable error interrupt +//! sources. Only the sources that are enabled can be reflected to the +//! processor interrupt; disabled sources have no effect on the processor. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Disable the specified interrupts. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTEN) &= ~(intFlags); + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current RAM correctable error interrupt status. +//! +//! \return Returns the current error interrupt status. Will return a value of +//! \b MEMCFG_CERR_CPUREAD if an interrupt has been generated. If not, the +//! function will return 0. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorInterruptStatus(void) +{ + // + // Read and return correctable error interrupt flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTFLG)); +} + +//***************************************************************************** +// +//! Sets the RAM correctable error interrupt status. +//! +//! \param intFlags is a bit mask of the interrupt sources to be set. Can take +//! the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function sets the correctable error interrupt flag. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceCorrErrorInterrupt(uint32_t intFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTSET) = intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears the RAM correctable error interrupt status. +//! +//! \param intFlags is a bit mask of the interrupt sources to be cleared. Can +//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved. +//! +//! This function clears the correctable error interrupt flag. +//! +//! \note Note that only correctable errors may generate interrupts. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearCorrErrorInterruptStatus(uint32_t intFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CEINTCLR) |= intFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the current correctable RAM error status. +//! +//! \return Returns the current error status, enumerated as a bit field of +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +// +//***************************************************************************** +static inline uint32_t +MemCfg_getCorrErrorStatus(void) +{ + // + // Read and return RAM error status flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRFLG)); +} + +//***************************************************************************** +// +//! Gets the current uncorrectable RAM error status. +//! +//! \return Returns the current error status, enumerated as a bit field of +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +// +//***************************************************************************** +static inline uint32_t +MemCfg_getUncorrErrorStatus(void) +{ + // + // Read and return RAM error status flags. + // + return(HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRFLG)); +} + +//***************************************************************************** +// +//! Sets the specified correctable RAM error status flag. +//! +//! \param stsFlags is a bit mask of the error sources. This parameter can be +//! any of the following values: +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +//! +//! This function sets the specified correctable RAM error status flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceCorrErrorStatus(uint32_t stsFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRSET) = stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Sets the specified uncorrectable RAM error status flag. +//! +//! \param stsFlags is a bit mask of the error sources. This parameter can be +//! any of the following values: +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +//! +//! This function sets the specified uncorrectable RAM error status flag. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_forceUncorrErrorStatus(uint32_t stsFlags) +{ + // + // Write the flags to the appropriate SET register. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRSET) = stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears correctable RAM error flags. +//! +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! This parameter can be any of the following : +//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ +//! +//! This function clears the specified correctable RAM error flags. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearCorrErrorStatus(uint32_t stsFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_CERRCLR) |= stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Clears uncorrectable RAM error flags. +//! +//! \param stsFlags is a bit mask of the status flags to be cleared. +//! This parameter can be any of the following : +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ, +//! or \b MEMCFG_UCERR_ECATMEMREAD. +//! +//! This function clears the specified uncorrectable RAM error flags. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_clearUncorrErrorStatus(uint32_t stsFlags) +{ + // + // Clear the requested flags. + // + EALLOW; + + HWREG(MEMORYERROR_BASE + MEMCFG_O_UCERRCLR) |= stsFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Enables ROM wait state. +//! +//! This function enables the ROM wait state. This mean CPU accesses to ROM are +//! 1-wait. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableROMWaitState(void) +{ + // + // Clear the disable bit. + // + EALLOW; + + HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) &= + ~((uint32_t)MEMCFG_ROMWAITSTATE_WSDISABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Disables ROM wait state. +//! +//! This function enables the ROM wait state. This mean CPU accesses to ROM are +//! 0-wait. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableROMWaitState(void) +{ + // + // Set the disable bit. + // + EALLOW; + + HWREG(ROMWAITSTATE_BASE + MEMCFG_O_ROMWAITSTATE) |= + MEMCFG_ROMWAITSTATE_WSDISABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Enables ROM prefetch. +//! +//! This function enables the ROM prefetch for both secure ROM and boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_enableROMPrefetch(void) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) |= + MEMCFG_ROMPREFETCH_PFENABLE; + + EDIS; +} + +//***************************************************************************** +// +//! Disables ROM prefetch. +//! +//! This function enables the ROM prefetch for both secure ROM and boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +MemCfg_disableROMPrefetch(void) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(ROMPREFETCH_BASE + MEMCFG_O_ROMPREFETCH) &= + ~((uint32_t)MEMCFG_ROMPREFETCH_PFENABLE); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the writes to the configuration of specified memory sections. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function locks writes to the access protection and controller select +//! configuration of a memory section.That means calling MemCfg_setProtection() +//! or MemCfg_setLSRAMControllerSel() for a locked memory section will have no +//! effect until MemCfg_unlockConfig() is called. +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_lockConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Unlocks the writes to the configuration of a memory section. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function unlocks writes to the access protection and controller select +//! configuration of a memory section that has been locked using +//! MemCfg_lockConfig(). +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_unlockConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Permanently locks writes to the configuration of a memory section. +//! +//! \param memSections is the logical OR of the sections to be configured. +//! +//! This function permanently locks writes to the access protection and +//! controller select configuration of a memory section. That means calling +//! MemCfg_setProtection() or MemCfg_setLSRAMControllerSel() for a locked memory +//! section will have no effect. To lock the configuration in a nonpermanent +//! way, use MemCfg_lockConfig(). +//! +//! The \e memSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_D0 and \b MEMCFG_SECT_D1 or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_commitConfig(uint32_t memSections); + +//***************************************************************************** +// +//! Sets the access protection mode of a single memory section. +//! +//! \param memSection is the memory section to be configured. +//! \param protectMode is the logical OR of the settings to be applied. +//! +//! This function sets the access protection mode of a specified memory section. +//! The mode is passed into the \e protectMode parameter as the logical OR of +//! the following values: +//! - \b MEMCFG_PROT_ALLOWCPUFETCH or \b MEMCFG_PROT_BLOCKCPUFETCH - CPU fetch +//! - \b MEMCFG_PROT_ALLOWCPUWRITE or \b MEMCFG_PROT_BLOCKCPUWRITE - CPU write +//! - \b MEMCFG_PROT_ALLOWDMAWRITE or \b MEMCFG_PROT_BLOCKDMAWRITE - DMA write +//! +//! The \e memSection parameter is one of the following indicators: +//! - \b MEMCFG_SECT_D0 or \b MEMCFG_SECT_D1 +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig() or if the memory +//! is configured as CLA program memory. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setProtection(uint32_t memSection, uint32_t protectMode); + +//***************************************************************************** +// +//! Sets the controller of the specified LSxRAM section. +//! +//! \param ramSection is the LSxRAM section to be configured. +//! \param controllerSel is the sharing selection. +//! +//! This function sets the controller select configuration of the LSxRAM +//! section. +//! If the \e controllerSel parameter is \b MEMCFG_LSRAMCONTROLLER_CPU_ONLY, +//! the LSxRAM section passed into the \e ramSection parameter will be dedicated +//! to the CPU. If \b MEMCFG_LSRAMCONTROLLER_CPU_CLA1, the memory section will +//! be shared between the CPU and the CLA. +//! +//! The \e ramSection parameter should be a value from \b MEMCFG_SECT_LS0 +//! through \b MEMCFG_SECT_LSx. +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig(). +//! +//! \note This API only applies to LSxRAM. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setLSRAMControllerSel(uint32_t ramSection, + MemCfg_LSRAMControllerSel controllerSel); + +//***************************************************************************** +// +//! Sets the controller of the specified GSxRAM section. +//! +//! \param ramSections is the logical OR of the sections to be configured. +//! \param controllerSel is the sharing selection. +//! +//! This function sets the controller select configuration of the GSxRAM +//! section.If the \e controllerSel parameter is \b MEMCFG_GSRAMCONTROLLER_CPU1, +//! the GSRAM sections passed into the \e ramSections parameter will be +//! dedicated to CPU1. If \b MEMCFG_GSRAMCONTROLLER_CPU2, the memory section +//! will be dedicated to CPU2. +//! +//! The \e ramSections parameter should be a logical OR of values from +//! \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx. +//! +//! This function will have no effect if the associated registers have been +//! locked by MemCfg_lockConfig() or MemCfg_commitConfig(). +//! +//! \note This API only applies to GSxRAM. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setGSRAMControllerSel(uint32_t ramSections, + MemCfg_GSRAMControllerSel controllerSel); + +//***************************************************************************** +// +//! Sets the test mode of the specified memory section. +//! +//! \param memSection is the memory section to be configured. +//! \param testMode is the test mode selected. +//! +//! This function sets the test mode configuration of the RAM section. The +//! \e testMode parameter can take one of the following values: +//! - \b MEMCFG_TEST_FUNCTIONAL +//! - \b MEMCFG_TEST_WRITE_DATA +//! - \b MEMCFG_TEST_WRITE_ECC +//! - \b MEMCFG_TEST_WRITE_PARITY +//! +//! The \e memSection parameter is one of the following indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1 +//! - \b MEMCFG_SECT_D0, \b MEMCFG_SECT_D1 +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode); + +//***************************************************************************** +// +//! Starts the initialization the specified RAM sections. +//! +//! \param ramSections is the logical OR of the sections to be initialized. +//! +//! This function starts the initialization of the specified RAM sections. Use +//! MemCfg_getInitStatus() to check if the initialization is done. +//! +//! The \e ramSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0, +//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections. +//! +//! \return None. +// +//***************************************************************************** +extern void +MemCfg_initSections(uint32_t ramSections); + +//***************************************************************************** +// +//! Get the status of initialized RAM sections. +//! +//! \param ramSections is the logical OR of the sections to be checked. +//! +//! This function gets the initialization status of the RAM sections specified +//! by the \e ramSections parameter. +//! +//! The \e ramSections parameter is an OR of one of the following sets of +//! indicators: +//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, \b MEMCFG_SECT_D0, +//! \b MEMCFG_SECT_D1, or \b MEMCFG_SECT_DX_ALL +//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL +//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL +//! - \b MEMCFG_SECT_MSGCPUTOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1, or +//! \b MEMCFG_SECT_MSGCLA1TOCPU +//! - \b OR use \b MEMCFG_SECT_ALL to get status of all possible sections. +//! +//! \note Use MemCfg_initSections() to start the initialization. +//! +//! \return Returns \b true if all the sections specified by \e ramSections +//! have been initialized and \b false if not. +// +//***************************************************************************** +extern bool +MemCfg_getInitStatus(uint32_t ramSections); + +//***************************************************************************** +// +//! Get the violation address associated with a intFlag. +//! +//! \param intFlag is the type of access violation as indicated by ONE of +//! these values: +//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access +//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access +//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access +//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access +//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access +//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access +//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access +//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access +//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access +//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access +//! +//! \return Returns the violation address associated with the \e intFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getViolationAddress(uint32_t intFlag); + +//***************************************************************************** +// +//! Get the correctable error address associated with a stsFlag. +//! +//! \param stsFlag is the type of error to which the returned address will +//! correspond. Can currently take the value \b MEMCFG_CERR_CPUREAD only. +//! Other values are reserved. +//! +//! \return Returns the error address associated with the stsFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getCorrErrorAddress(uint32_t stsFlag); + +//***************************************************************************** +// +//! Get the uncorrectable error address associated with a stsFlag. +//! +//! \param stsFlag is the type of error to which the returned address will +//! correspond. It may be passed one of these values: +//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, or +//! \b MEMCFG_UCERR_CLA1READ values +//! +//! \return Returns the error address associated with the stsFlag. +// +//***************************************************************************** +extern uint32_t +MemCfg_getUncorrErrorAddress(uint32_t stsFlag); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // MEMCFG_H diff --git a/gpio_driverlib_cpu1/device/driverlib/pin_map.h b/gpio_driverlib_cpu1/device/driverlib/pin_map.h new file mode 100644 index 0000000..95c6fa3 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/pin_map.h @@ -0,0 +1,894 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef __PIN_MAP_H__ +#define __PIN_MAP_H__ + +//***************************************************************************** +// 0x00000003 = MUX register value +// 0x0000000C = GMUX register value +// 0x0000FF00 = Shift amount within mux registers +// 0xFFFF0000 = Offset of MUX register +//***************************************************************************** + + +#define GPIO_0_GPIO0 0x00060000U +#define GPIO_0_EPWM1A 0x00060001U +#define GPIO_0_SDAA 0x00060006U + +#define GPIO_1_GPIO1 0x00060200U +#define GPIO_1_EPWM1B 0x00060201U +#define GPIO_1_MFSRB 0x00060203U +#define GPIO_1_SCLA 0x00060206U + +#define GPIO_2_GPIO2 0x00060400U +#define GPIO_2_EPWM2A 0x00060401U +#define GPIO_2_OUTPUTXBAR1 0x00060405U +#define GPIO_2_SDAB 0x00060406U + +#define GPIO_3_GPIO3 0x00060600U +#define GPIO_3_EPWM2B 0x00060601U +#define GPIO_3_OUTPUTXBAR2 0x00060602U +#define GPIO_3_MCLKRB 0x00060603U +#define GPIO_3_SCLB 0x00060606U + +#define GPIO_4_GPIO4 0x00060800U +#define GPIO_4_EPWM3A 0x00060801U +#define GPIO_4_OUTPUTXBAR3 0x00060805U +#define GPIO_4_CANTXA 0x00060806U + +#define GPIO_5_GPIO5 0x00060A00U +#define GPIO_5_EPWM3B 0x00060A01U +#define GPIO_5_MFSRA 0x00060A02U +#define GPIO_5_OUTPUTXBAR3 0x00060A03U +#define GPIO_5_CANRXA 0x00060A06U + +#define GPIO_6_GPIO6 0x00060C00U +#define GPIO_6_EPWM4A 0x00060C01U +#define GPIO_6_OUTPUTXBAR4 0x00060C02U +#define GPIO_6_EPWMSYNCO 0x00060C03U +#define GPIO_6_EQEP3A 0x00060C05U +#define GPIO_6_CANTXB 0x00060C06U + +#define GPIO_7_GPIO7 0x00060E00U +#define GPIO_7_EPWM4B 0x00060E01U +#define GPIO_7_MCLKRA 0x00060E02U +#define GPIO_7_OUTPUTXBAR5 0x00060E03U +#define GPIO_7_EQEP3B 0x00060E05U +#define GPIO_7_CANRXB 0x00060E06U + +#define GPIO_8_GPIO8 0x00061000U +#define GPIO_8_EPWM5A 0x00061001U +#define GPIO_8_CANTXB 0x00061002U +#define GPIO_8_ADCSOCAO 0x00061003U +#define GPIO_8_EQEP3S 0x00061005U +#define GPIO_8_SCITXDA 0x00061006U + +#define GPIO_9_GPIO9 0x00061200U +#define GPIO_9_EPWM5B 0x00061201U +#define GPIO_9_SCITXDB 0x00061202U +#define GPIO_9_OUTPUTXBAR6 0x00061203U +#define GPIO_9_EQEP3I 0x00061205U +#define GPIO_9_SCIRXDA 0x00061206U + +#define GPIO_10_GPIO10 0x00061400U +#define GPIO_10_EPWM6A 0x00061401U +#define GPIO_10_CANRXB 0x00061402U +#define GPIO_10_ADCSOCBO 0x00061403U +#define GPIO_10_EQEP1A 0x00061405U +#define GPIO_10_SCITXDB 0x00061406U +#define GPIO_10_UPP_WAIT 0x0006140FU + +#define GPIO_11_GPIO11 0x00061600U +#define GPIO_11_EPWM6B 0x00061601U +#define GPIO_11_SCIRXDB 0x00061602U +#define GPIO_11_OUTPUTXBAR7 0x00061603U +#define GPIO_11_EQEP1B 0x00061605U +#define GPIO_11_UPP_STRT 0x0006160FU + +#define GPIO_12_GPIO12 0x00061800U +#define GPIO_12_EPWM7A 0x00061801U +#define GPIO_12_CANTXB 0x00061802U +#define GPIO_12_MDXB 0x00061803U +#define GPIO_12_EQEP1S 0x00061805U +#define GPIO_12_SCITXDC 0x00061806U +#define GPIO_12_UPP_ENA 0x0006180FU + +#define GPIO_13_GPIO13 0x00061A00U +#define GPIO_13_EPWM7B 0x00061A01U +#define GPIO_13_CANRXB 0x00061A02U +#define GPIO_13_MDRB 0x00061A03U +#define GPIO_13_EQEP1I 0x00061A05U +#define GPIO_13_SCIRXDC 0x00061A06U +#define GPIO_13_UPP_D7 0x00061A0FU + +#define GPIO_14_GPIO14 0x00061C00U +#define GPIO_14_EPWM8A 0x00061C01U +#define GPIO_14_SCITXDB 0x00061C02U +#define GPIO_14_MCLKXB 0x00061C03U +#define GPIO_14_OUTPUTXBAR3 0x00061C06U +#define GPIO_14_UPP_D6 0x00061C0FU + +#define GPIO_15_GPIO15 0x00061E00U +#define GPIO_15_EPWM8B 0x00061E01U +#define GPIO_15_SCIRXDB 0x00061E02U +#define GPIO_15_MFSXB 0x00061E03U +#define GPIO_15_OUTPUTXBAR4 0x00061E06U +#define GPIO_15_UPP_D5 0x00061E0FU + +#define GPIO_16_GPIO16 0x00080000U +#define GPIO_16_SPISIMOA 0x00080001U +#define GPIO_16_CANTXB 0x00080002U +#define GPIO_16_OUTPUTXBAR7 0x00080003U +#define GPIO_16_EPWM9A 0x00080005U +#define GPIO_16_SD1_D1 0x00080007U +#define GPIO_16_UPP_D4 0x0008000FU + +#define GPIO_17_GPIO17 0x00080200U +#define GPIO_17_SPISOMIA 0x00080201U +#define GPIO_17_CANRXB 0x00080202U +#define GPIO_17_OUTPUTXBAR8 0x00080203U +#define GPIO_17_EPWM9B 0x00080205U +#define GPIO_17_SD1_C1 0x00080207U +#define GPIO_17_UPP_D3 0x0008020FU + +#define GPIO_18_GPIO18 0x00080400U +#define GPIO_18_SPICLKA 0x00080401U +#define GPIO_18_SCITXDB 0x00080402U +#define GPIO_18_CANRXA 0x00080403U +#define GPIO_18_EPWM10A 0x00080405U +#define GPIO_18_SD1_D2 0x00080407U +#define GPIO_18_UPP_D2 0x0008040FU + +#define GPIO_19_GPIO19 0x00080600U +#define GPIO_19_SPISTEA 0x00080601U +#define GPIO_19_SCIRXDB 0x00080602U +#define GPIO_19_CANTXA 0x00080603U +#define GPIO_19_EPWM10B 0x00080605U +#define GPIO_19_SD1_C2 0x00080607U +#define GPIO_19_UPP_D1 0x0008060FU + +#define GPIO_20_GPIO20 0x00080800U +#define GPIO_20_EQEP1A 0x00080801U +#define GPIO_20_MDXA 0x00080802U +#define GPIO_20_CANTXB 0x00080803U +#define GPIO_20_EPWM11A 0x00080805U +#define GPIO_20_SD1_D3 0x00080807U +#define GPIO_20_UPP_D0 0x0008080FU + +#define GPIO_21_GPIO21 0x00080A00U +#define GPIO_21_EQEP1B 0x00080A01U +#define GPIO_21_MDRA 0x00080A02U +#define GPIO_21_CANRXB 0x00080A03U +#define GPIO_21_EPWM11B 0x00080A05U +#define GPIO_21_SD1_C3 0x00080A07U +#define GPIO_21_UPP_CLK 0x00080A0FU + +#define GPIO_22_GPIO22 0x00080C00U +#define GPIO_22_EQEP1S 0x00080C01U +#define GPIO_22_MCLKXA 0x00080C02U +#define GPIO_22_SCITXDB 0x00080C03U +#define GPIO_22_EPWM12A 0x00080C05U +#define GPIO_22_SPICLKB 0x00080C06U +#define GPIO_22_SD1_D4 0x00080C07U + +#define GPIO_23_GPIO23 0x00080E00U +#define GPIO_23_EQEP1I 0x00080E01U +#define GPIO_23_MFSXA 0x00080E02U +#define GPIO_23_SCIRXDB 0x00080E03U +#define GPIO_23_EPWM12B 0x00080E05U +#define GPIO_23_SPISTEB 0x00080E06U +#define GPIO_23_SD1_C4 0x00080E07U + +#define GPIO_24_GPIO24 0x00081000U +#define GPIO_24_OUTPUTXBAR1 0x00081001U +#define GPIO_24_EQEP2A 0x00081002U +#define GPIO_24_MDXB 0x00081003U +#define GPIO_24_SPISIMOB 0x00081006U +#define GPIO_24_SD2_D1 0x00081007U + +#define GPIO_25_GPIO25 0x00081200U +#define GPIO_25_OUTPUTXBAR2 0x00081201U +#define GPIO_25_EQEP2B 0x00081202U +#define GPIO_25_MDRB 0x00081203U +#define GPIO_25_SPISOMIB 0x00081206U +#define GPIO_25_SD2_C1 0x00081207U + +#define GPIO_26_GPIO26 0x00081400U +#define GPIO_26_OUTPUTXBAR3 0x00081401U +#define GPIO_26_EQEP2I 0x00081402U +#define GPIO_26_MCLKXB 0x00081403U +#define GPIO_26_SPICLKB 0x00081406U +#define GPIO_26_SD2_D2 0x00081407U + +#define GPIO_27_GPIO27 0x00081600U +#define GPIO_27_OUTPUTXBAR4 0x00081601U +#define GPIO_27_EQEP2S 0x00081602U +#define GPIO_27_MFSXB 0x00081603U +#define GPIO_27_SPISTEB 0x00081606U +#define GPIO_27_SD2_C2 0x00081607U + +#define GPIO_28_GPIO28 0x00081800U +#define GPIO_28_SCIRXDA 0x00081801U +#define GPIO_28_EM1CS4N 0x00081802U +#define GPIO_28_OUTPUTXBAR5 0x00081805U +#define GPIO_28_EQEP3A 0x00081806U +#define GPIO_28_SD2_D3 0x00081807U + +#define GPIO_29_GPIO29 0x00081A00U +#define GPIO_29_SCITXDA 0x00081A01U +#define GPIO_29_EM1SDCKE 0x00081A02U +#define GPIO_29_OUTPUTXBAR6 0x00081A05U +#define GPIO_29_EQEP3B 0x00081A06U +#define GPIO_29_SD2_C3 0x00081A07U + +#define GPIO_30_GPIO30 0x00081C00U +#define GPIO_30_CANRXA 0x00081C01U +#define GPIO_30_EM1CLK 0x00081C02U +#define GPIO_30_OUTPUTXBAR7 0x00081C05U +#define GPIO_30_EQEP3S 0x00081C06U +#define GPIO_30_SD2_D4 0x00081C07U + +#define GPIO_31_GPIO31 0x00081E00U +#define GPIO_31_CANTXA 0x00081E01U +#define GPIO_31_EM1WEN 0x00081E02U +#define GPIO_31_OUTPUTXBAR8 0x00081E05U +#define GPIO_31_EQEP3I 0x00081E06U +#define GPIO_31_SD2_C4 0x00081E07U + +#define GPIO_32_GPIO32 0x00460000U +#define GPIO_32_SDAA 0x00460001U +#define GPIO_32_EM1CS0N 0x00460002U + +#define GPIO_33_GPIO33 0x00460200U +#define GPIO_33_SCLA 0x00460201U +#define GPIO_33_EM1RNW 0x00460202U + +#define GPIO_34_GPIO34 0x00460400U +#define GPIO_34_OUTPUTXBAR1 0x00460401U +#define GPIO_34_EM1CS2N 0x00460402U +#define GPIO_34_SDAB 0x00460406U +#define GPIO_34_OFSD_2_N 0x0046040FU + +#define GPIO_35_GPIO35 0x00460600U +#define GPIO_35_SCIRXDA 0x00460601U +#define GPIO_35_EM1CS3N 0x00460602U +#define GPIO_35_SCLB 0x00460606U +#define GPIO_35_IID 0x0046060FU + +#define GPIO_36_GPIO36 0x00460800U +#define GPIO_36_SCITXDA 0x00460801U +#define GPIO_36_EM1WAIT 0x00460802U +#define GPIO_36_CANRXA 0x00460806U +#define GPIO_36_ISESSEND 0x0046080FU + +#define GPIO_37_GPIO37 0x00460A00U +#define GPIO_37_OUTPUTXBAR2 0x00460A01U +#define GPIO_37_EM1OEN 0x00460A02U +#define GPIO_37_CANTXA 0x00460A06U +#define GPIO_37_IAVALID 0x00460A0FU + +#define GPIO_38_GPIO38 0x00460C00U +#define GPIO_38_EM1A0 0x00460C02U +#define GPIO_38_SCITXDC 0x00460C05U +#define GPIO_38_CANTXB 0x00460C06U + +#define GPIO_39_GPIO39 0x00460E00U +#define GPIO_39_EM1A1 0x00460E02U +#define GPIO_39_SCIRXDC 0x00460E05U +#define GPIO_39_CANRXB 0x00460E06U + +#define GPIO_40_GPIO40 0x00461000U +#define GPIO_40_EM1A2 0x00461002U +#define GPIO_40_SDAB 0x00461006U + +#define GPIO_41_GPIO41 0x00461200U +#define GPIO_41_EM1A3 0x00461202U +#define GPIO_41_EMU1 0x00461203U +#define GPIO_41_SCLB 0x00461206U + +#define GPIO_42_GPIO42 0x00461400U +#define GPIO_42_SDAA 0x00461406U +#define GPIO_42_SCITXDA 0x0046140FU + +#define GPIO_43_GPIO43 0x00461600U +#define GPIO_43_SCLA 0x00461606U +#define GPIO_43_SCIRXDA 0x0046160FU + +#define GPIO_44_GPIO44 0x00461800U +#define GPIO_44_EM1A4 0x00461802U +#define GPIO_44_IXRCV 0x0046180FU + +#define GPIO_45_GPIO45 0x00461A00U +#define GPIO_45_EM1A5 0x00461A02U +#define GPIO_45_IDM 0x00461A0FU + +#define GPIO_46_GPIO46 0x00461C00U +#define GPIO_46_EM1A6 0x00461C02U +#define GPIO_46_SCIRXDD 0x00461C06U +#define GPIO_46_IDP 0x00461C0FU + +#define GPIO_47_GPIO47 0x00461E00U +#define GPIO_47_EM1A7 0x00461E02U +#define GPIO_47_SCITXDD 0x00461E06U +#define GPIO_47_OFSD_1_N 0x00461E0FU + +#define GPIO_48_GPIO48 0x00480000U +#define GPIO_48_OUTPUTXBAR3 0x00480001U +#define GPIO_48_EM1A8 0x00480002U +#define GPIO_48_SCITXDA 0x00480006U +#define GPIO_48_SD1_D1 0x00480007U + +#define GPIO_49_GPIO49 0x00480200U +#define GPIO_49_OUTPUTXBAR4 0x00480201U +#define GPIO_49_EM1A9 0x00480202U +#define GPIO_49_SCIRXDA 0x00480206U +#define GPIO_49_SD1_C1 0x00480207U + +#define GPIO_50_GPIO50 0x00480400U +#define GPIO_50_EQEP1A 0x00480401U +#define GPIO_50_EM1A10 0x00480402U +#define GPIO_50_SPISIMOC 0x00480406U +#define GPIO_50_SD1_D2 0x00480407U + +#define GPIO_51_GPIO51 0x00480600U +#define GPIO_51_EQEP1B 0x00480601U +#define GPIO_51_EM1A11 0x00480602U +#define GPIO_51_SPISOMIC 0x00480606U +#define GPIO_51_SD1_C2 0x00480607U + +#define GPIO_52_GPIO52 0x00480800U +#define GPIO_52_EQEP1S 0x00480801U +#define GPIO_52_EM1A12 0x00480802U +#define GPIO_52_SPICLKC 0x00480806U +#define GPIO_52_SD1_D3 0x00480807U + +#define GPIO_53_GPIO53 0x00480A00U +#define GPIO_53_EQEP1I 0x00480A01U +#define GPIO_53_EM1D31 0x00480A02U +#define GPIO_53_EM2D15 0x00480A03U +#define GPIO_53_SPISTEC 0x00480A06U +#define GPIO_53_SD1_C3 0x00480A07U + +#define GPIO_54_GPIO54 0x00480C00U +#define GPIO_54_SPISIMOA 0x00480C01U +#define GPIO_54_EM1D30 0x00480C02U +#define GPIO_54_EM2D14 0x00480C03U +#define GPIO_54_EQEP2A 0x00480C05U +#define GPIO_54_SCITXDB 0x00480C06U +#define GPIO_54_SD1_D4 0x00480C07U + +#define GPIO_55_GPIO55 0x00480E00U +#define GPIO_55_SPISOMIA 0x00480E01U +#define GPIO_55_EM1D29 0x00480E02U +#define GPIO_55_EM2D13 0x00480E03U +#define GPIO_55_EQEP2B 0x00480E05U +#define GPIO_55_SCIRXDB 0x00480E06U +#define GPIO_55_SD1_C4 0x00480E07U + +#define GPIO_56_GPIO56 0x00481000U +#define GPIO_56_SPICLKA 0x00481001U +#define GPIO_56_EM1D28 0x00481002U +#define GPIO_56_EM2D12 0x00481003U +#define GPIO_56_EQEP2S 0x00481005U +#define GPIO_56_SCITXDC 0x00481006U +#define GPIO_56_SD2_D1 0x00481007U + +#define GPIO_57_GPIO57 0x00481200U +#define GPIO_57_SPISTEA 0x00481201U +#define GPIO_57_EM1D27 0x00481202U +#define GPIO_57_EM2D11 0x00481203U +#define GPIO_57_EQEP2I 0x00481205U +#define GPIO_57_SCIRXDC 0x00481206U +#define GPIO_57_SD2_C1 0x00481207U + +#define GPIO_58_GPIO58 0x00481400U +#define GPIO_58_MCLKRA 0x00481401U +#define GPIO_58_EM1D26 0x00481402U +#define GPIO_58_EM2D10 0x00481403U +#define GPIO_58_OUTPUTXBAR1 0x00481405U +#define GPIO_58_SPICLKB 0x00481406U +#define GPIO_58_SD2_D2 0x00481407U +#define GPIO_58_SPISIMOA 0x0048140FU + +#define GPIO_59_GPIO59 0x00481600U +#define GPIO_59_MFSRA 0x00481601U +#define GPIO_59_EM1D25 0x00481602U +#define GPIO_59_EM2D9 0x00481603U +#define GPIO_59_OUTPUTXBAR2 0x00481605U +#define GPIO_59_SPISTEB 0x00481606U +#define GPIO_59_SD2_C2 0x00481607U +#define GPIO_59_SPISOMIA 0x0048160FU + +#define GPIO_60_GPIO60 0x00481800U +#define GPIO_60_MCLKRB 0x00481801U +#define GPIO_60_EM1D24 0x00481802U +#define GPIO_60_EM2D8 0x00481803U +#define GPIO_60_OUTPUTXBAR3 0x00481805U +#define GPIO_60_SPISIMOB 0x00481806U +#define GPIO_60_SD2_D3 0x00481807U +#define GPIO_60_SPICLKA 0x0048180FU + +#define GPIO_61_GPIO61 0x00481A00U +#define GPIO_61_MFSRB 0x00481A01U +#define GPIO_61_EM1D23 0x00481A02U +#define GPIO_61_EM2D7 0x00481A03U +#define GPIO_61_OUTPUTXBAR4 0x00481A05U +#define GPIO_61_SPISOMIB 0x00481A06U +#define GPIO_61_SD2_C3 0x00481A07U +#define GPIO_61_SPISTEA 0x00481A0FU + +#define GPIO_62_GPIO62 0x00481C00U +#define GPIO_62_SCIRXDC 0x00481C01U +#define GPIO_62_EM1D22 0x00481C02U +#define GPIO_62_EM2D6 0x00481C03U +#define GPIO_62_EQEP3A 0x00481C05U +#define GPIO_62_CANRXA 0x00481C06U +#define GPIO_62_SD2_D4 0x00481C07U + +#define GPIO_63_GPIO63 0x00481E00U +#define GPIO_63_SCITXDC 0x00481E01U +#define GPIO_63_EM1D21 0x00481E02U +#define GPIO_63_EM2D5 0x00481E03U +#define GPIO_63_EQEP3B 0x00481E05U +#define GPIO_63_CANTXA 0x00481E06U +#define GPIO_63_SD2_C4 0x00481E07U +#define GPIO_63_SPISIMOB 0x00481E0FU + +#define GPIO_64_GPIO64 0x00860000U +#define GPIO_64_EM1D20 0x00860002U +#define GPIO_64_EM2D4 0x00860003U +#define GPIO_64_EQEP3S 0x00860005U +#define GPIO_64_SCIRXDA 0x00860006U +#define GPIO_64_SPISOMIB 0x0086000FU + +#define GPIO_65_GPIO65 0x00860200U +#define GPIO_65_EM1D19 0x00860202U +#define GPIO_65_EM2D3 0x00860203U +#define GPIO_65_EQEP3I 0x00860205U +#define GPIO_65_SCITXDA 0x00860206U +#define GPIO_65_SPICLKB 0x0086020FU + +#define GPIO_66_GPIO66 0x00860400U +#define GPIO_66_EM1D18 0x00860402U +#define GPIO_66_EM2D2 0x00860403U +#define GPIO_66_SDAB 0x00860406U +#define GPIO_66_SPISTEB 0x0086040FU + +#define GPIO_67_GPIO67 0x00860600U +#define GPIO_67_EM1D17 0x00860602U +#define GPIO_67_EM2D1 0x00860603U + +#define GPIO_68_GPIO68 0x00860800U +#define GPIO_68_EM1D16 0x00860802U +#define GPIO_68_EM2D0 0x00860803U + +#define GPIO_69_GPIO69 0x00860A00U +#define GPIO_69_EM1D15 0x00860A02U +#define GPIO_69_EMU0 0x00860A03U +#define GPIO_69_SCLB 0x00860A06U +#define GPIO_69_SPISIMOC 0x00860A0FU + +#define GPIO_70_GPIO70 0x00860C00U +#define GPIO_70_EM1D14 0x00860C02U +#define GPIO_70_EMU0 0x00860C03U +#define GPIO_70_CANRXA 0x00860C05U +#define GPIO_70_SCITXDB 0x00860C06U +#define GPIO_70_SPISOMIC 0x00860C0FU + +#define GPIO_71_GPIO71 0x00860E00U +#define GPIO_71_EM1D13 0x00860E02U +#define GPIO_71_EMU1 0x00860E03U +#define GPIO_71_CANTXA 0x00860E05U +#define GPIO_71_SCIRXDB 0x00860E06U +#define GPIO_71_SPICLKC 0x00860E0FU + +#define GPIO_72_GPIO72 0x00861000U +#define GPIO_72_EM1D12 0x00861002U +#define GPIO_72_CANTXB 0x00861005U +#define GPIO_72_SCITXDC 0x00861006U +#define GPIO_72_SPISTEC 0x0086100FU + +#define GPIO_73_GPIO73 0x00861200U +#define GPIO_73_EM1D11 0x00861202U +#define GPIO_73_XCLKOUT 0x00861203U +#define GPIO_73_CANRXB 0x00861205U +#define GPIO_73_SCIRXDC 0x00861206U + +#define GPIO_74_GPIO74 0x00861400U +#define GPIO_74_EM1D10 0x00861402U + +#define GPIO_75_GPIO75 0x00861600U +#define GPIO_75_EM1D9 0x00861602U + +#define GPIO_76_GPIO76 0x00861800U +#define GPIO_76_EM1D8 0x00861802U +#define GPIO_76_SCITXDD 0x00861806U + +#define GPIO_77_GPIO77 0x00861A00U +#define GPIO_77_EM1D7 0x00861A02U +#define GPIO_77_SCIRXDD 0x00861A06U + +#define GPIO_78_GPIO78 0x00861C00U +#define GPIO_78_EM1D6 0x00861C02U +#define GPIO_78_EQEP2A 0x00861C06U + +#define GPIO_79_GPIO79 0x00861E00U +#define GPIO_79_EM1D5 0x00861E02U +#define GPIO_79_EQEP2B 0x00861E06U + +#define GPIO_80_GPIO80 0x00880000U +#define GPIO_80_EM1D4 0x00880002U +#define GPIO_80_EQEP2S 0x00880006U + +#define GPIO_81_GPIO81 0x00880200U +#define GPIO_81_EM1D3 0x00880202U +#define GPIO_81_EQEP2I 0x00880206U + +#define GPIO_82_GPIO82 0x00880400U +#define GPIO_82_EM1D2 0x00880402U + +#define GPIO_83_GPIO83 0x00880600U +#define GPIO_83_EM1D1 0x00880602U + +#define GPIO_84_GPIO84 0x00880800U +#define GPIO_84_SCITXDA 0x00880805U +#define GPIO_84_MDXB 0x00880806U +#define GPIO_84_MDXA 0x0088080FU + +#define GPIO_85_GPIO85 0x00880A00U +#define GPIO_85_EM1D0 0x00880A02U +#define GPIO_85_SCIRXDA 0x00880A05U +#define GPIO_85_MDRB 0x00880A06U +#define GPIO_85_MDRA 0x00880A0FU + +#define GPIO_86_GPIO86 0x00880C00U +#define GPIO_86_EM1A13 0x00880C02U +#define GPIO_86_EM1CAS 0x00880C03U +#define GPIO_86_SCITXDB 0x00880C05U +#define GPIO_86_MCLKXB 0x00880C06U +#define GPIO_86_MCLKXA 0x00880C0FU + +#define GPIO_87_GPIO87 0x00880E00U +#define GPIO_87_EM1A14 0x00880E02U +#define GPIO_87_EM1RAS 0x00880E03U +#define GPIO_87_SCIRXDB 0x00880E05U +#define GPIO_87_MFSXB 0x00880E06U +#define GPIO_87_MFSXA 0x00880E0FU + +#define GPIO_88_GPIO88 0x00881000U +#define GPIO_88_EM1A15 0x00881002U +#define GPIO_88_EM1DQM0 0x00881003U + +#define GPIO_89_GPIO89 0x00881200U +#define GPIO_89_EM1A16 0x00881202U +#define GPIO_89_EM1DQM1 0x00881203U +#define GPIO_89_SCITXDC 0x00881206U + +#define GPIO_90_GPIO90 0x00881400U +#define GPIO_90_EM1A17 0x00881402U +#define GPIO_90_EM1DQM2 0x00881403U +#define GPIO_90_SCIRXDC 0x00881406U + +#define GPIO_91_GPIO91 0x00881600U +#define GPIO_91_EM1A18 0x00881602U +#define GPIO_91_EM1DQM3 0x00881603U +#define GPIO_91_SDAA 0x00881606U + +#define GPIO_92_GPIO92 0x00881800U +#define GPIO_92_EM1A19 0x00881802U +#define GPIO_92_EM1BA1 0x00881803U +#define GPIO_92_SCLA 0x00881806U + +#define GPIO_93_GPIO93 0x00881A00U +#define GPIO_93_EM1A20 0x00881A02U +#define GPIO_93_EM1BA0 0x00881A03U +#define GPIO_93_SCITXDD 0x00881A06U + +#define GPIO_94_GPIO94 0x00881C00U +#define GPIO_94_EM1A21 0x00881C02U +#define GPIO_94_SCIRXDD 0x00881C06U + +#define GPIO_95_GPIO95 0x00881E00U + +#define GPIO_96_GPIO96 0x00C60000U +#define GPIO_96_EM2DQM1 0x00C60003U +#define GPIO_96_EQEP1A 0x00C60005U + +#define GPIO_97_GPIO97 0x00C60200U +#define GPIO_97_EM2DQM0 0x00C60203U +#define GPIO_97_EQEP1B 0x00C60205U + +#define GPIO_98_GPIO98 0x00C60400U +#define GPIO_98_EM2A0 0x00C60403U +#define GPIO_98_EQEP1S 0x00C60405U + +#define GPIO_99_GPIO99 0x00C60600U +#define GPIO_99_EM2A1 0x00C60603U +#define GPIO_99_EQEP1I 0x00C60605U + +#define GPIO_100_GPIO100 0x00C60800U +#define GPIO_100_EM2A2 0x00C60803U +#define GPIO_100_EQEP2A 0x00C60805U +#define GPIO_100_SPISIMOC 0x00C60806U + +#define GPIO_101_GPIO101 0x00C60A00U +#define GPIO_101_EM2A3 0x00C60A03U +#define GPIO_101_EQEP2B 0x00C60A05U +#define GPIO_101_SPISOMIC 0x00C60A06U + +#define GPIO_102_GPIO102 0x00C60C00U +#define GPIO_102_EM2A4 0x00C60C03U +#define GPIO_102_EQEP2S 0x00C60C05U +#define GPIO_102_SPICLKC 0x00C60C06U + +#define GPIO_103_GPIO103 0x00C60E00U +#define GPIO_103_EM2A5 0x00C60E03U +#define GPIO_103_EQEP2I 0x00C60E05U +#define GPIO_103_SPISTEC 0x00C60E06U + +#define GPIO_104_GPIO104 0x00C61000U +#define GPIO_104_SDAA 0x00C61001U +#define GPIO_104_EM2A6 0x00C61003U +#define GPIO_104_EQEP3A 0x00C61005U +#define GPIO_104_SCITXDD 0x00C61006U + +#define GPIO_105_GPIO105 0x00C61200U +#define GPIO_105_SCLA 0x00C61201U +#define GPIO_105_EM2A7 0x00C61203U +#define GPIO_105_EQEP3B 0x00C61205U +#define GPIO_105_SCIRXDD 0x00C61206U + +#define GPIO_106_GPIO106 0x00C61400U +#define GPIO_106_EM2A8 0x00C61403U +#define GPIO_106_EQEP3S 0x00C61405U +#define GPIO_106_SCITXDC 0x00C61406U + +#define GPIO_107_GPIO107 0x00C61600U +#define GPIO_107_EM2A9 0x00C61603U +#define GPIO_107_EQEP3I 0x00C61605U +#define GPIO_107_SCIRXDC 0x00C61606U + +#define GPIO_108_GPIO108 0x00C61800U +#define GPIO_108_EM2A10 0x00C61803U + +#define GPIO_109_GPIO109 0x00C61A00U +#define GPIO_109_EM2A11 0x00C61A03U + +#define GPIO_110_GPIO110 0x00C61C00U +#define GPIO_110_EM2WAIT 0x00C61C03U + +#define GPIO_111_GPIO111 0x00C61E00U +#define GPIO_111_EM2BA0 0x00C61E03U + +#define GPIO_112_GPIO112 0x00C80000U +#define GPIO_112_EM2BA1 0x00C80003U + +#define GPIO_113_GPIO113 0x00C80200U +#define GPIO_113_EM2CAS 0x00C80203U + +#define GPIO_114_GPIO114 0x00C80400U +#define GPIO_114_EM2RAS 0x00C80403U + +#define GPIO_115_GPIO115 0x00C80600U +#define GPIO_115_EM2CS0N 0x00C80603U + +#define GPIO_116_GPIO116 0x00C80800U +#define GPIO_116_EM2CS2N 0x00C80803U + +#define GPIO_117_GPIO117 0x00C80A00U +#define GPIO_117_EM2SDCKE 0x00C80A03U + +#define GPIO_118_GPIO118 0x00C80C00U +#define GPIO_118_EM2CLK 0x00C80C03U + +#define GPIO_119_GPIO119 0x00C80E00U +#define GPIO_119_EM2RNW 0x00C80E03U + +#define GPIO_120_GPIO120 0x00C81000U +#define GPIO_120_EM2WEN 0x00C81003U +#define GPIO_120_USB0PFLT 0x00C8100FU + +#define GPIO_121_GPIO121 0x00C81200U +#define GPIO_121_EM2OEN 0x00C81203U +#define GPIO_121_USB0EPEN 0x00C8120FU + +#define GPIO_122_GPIO122 0x00C81400U +#define GPIO_122_SPISIMOC 0x00C81406U +#define GPIO_122_SD1_D1 0x00C81407U +#define GPIO_122_ODISCHRGVBUS 0x00C8140FU + +#define GPIO_123_GPIO123 0x00C81600U +#define GPIO_123_SPISOMIC 0x00C81606U +#define GPIO_123_SD1_C1 0x00C81607U +#define GPIO_123_OCHRGVBUS 0x00C8160FU + +#define GPIO_124_GPIO124 0x00C81800U +#define GPIO_124_SPICLKC 0x00C81806U +#define GPIO_124_SD1_D2 0x00C81807U +#define GPIO_124_ODMPULLDN 0x00C8180FU + +#define GPIO_125_GPIO125 0x00C81A00U +#define GPIO_125_SPISTEC 0x00C81A06U +#define GPIO_125_SD1_C2 0x00C81A07U +#define GPIO_125_ODPPULLDN 0x00C81A0FU + +#define GPIO_126_GPIO126 0x00C81C00U +#define GPIO_126_SD1_D3 0x00C81C07U +#define GPIO_126_OLSD_2_N 0x00C81C0FU + +#define GPIO_127_GPIO127 0x00C81E00U +#define GPIO_127_SD1_C3 0x00C81E07U +#define GPIO_127_OLSD_1_N 0x00C81E0FU + +#define GPIO_128_GPIO128 0x01060000U +#define GPIO_128_SD1_D4 0x01060007U +#define GPIO_128_OIDPULLUP 0x0106000FU + +#define GPIO_129_GPIO129 0x01060200U +#define GPIO_129_SD1_C4 0x01060207U +#define GPIO_129_OSPEED 0x0106020FU + +#define GPIO_130_GPIO130 0x01060400U +#define GPIO_130_SD2_D1 0x01060407U +#define GPIO_130_OSUSPEND 0x0106040FU + +#define GPIO_131_GPIO131 0x01060600U +#define GPIO_131_SD2_C1 0x01060607U +#define GPIO_131_OOE 0x0106060FU + +#define GPIO_132_GPIO132 0x01060800U +#define GPIO_132_SD2_D2 0x01060807U +#define GPIO_132_ODMSE1 0x0106080FU + +#define GPIO_133_GPIO133 0x01060A00U +#define GPIO_133_SD2_C2 0x01060A07U +#define GPIO_133_ODPDAT 0x01060A0FU + +#define GPIO_134_GPIO134 0x01060C00U +#define GPIO_134_SD2_D3 0x01060C07U +#define GPIO_134_IVBUSVALID 0x01060C0FU + +#define GPIO_135_GPIO135 0x01060E00U +#define GPIO_135_SCITXDA 0x01060E06U +#define GPIO_135_SD2_C3 0x01060E07U + +#define GPIO_136_GPIO136 0x01061000U +#define GPIO_136_SCIRXDA 0x01061006U +#define GPIO_136_SD2_D4 0x01061007U + +#define GPIO_137_GPIO137 0x01061200U +#define GPIO_137_SCITXDB 0x01061206U +#define GPIO_137_SD2_C4 0x01061207U + +#define GPIO_138_GPIO138 0x01061400U +#define GPIO_138_SCIRXDB 0x01061406U + +#define GPIO_139_GPIO139 0x01061600U +#define GPIO_139_SCIRXDC 0x01061606U + +#define GPIO_140_GPIO140 0x01061800U +#define GPIO_140_SCITXDC 0x01061806U + +#define GPIO_141_GPIO141 0x01061A00U +#define GPIO_141_SCIRXDD 0x01061A06U + +#define GPIO_142_GPIO142 0x01061C00U +#define GPIO_142_SCITXDD 0x01061C06U + +#define GPIO_143_GPIO143 0x01061E00U + +#define GPIO_144_GPIO144 0x01080000U + +#define GPIO_145_GPIO145 0x01080200U +#define GPIO_145_EPWM1A 0x01080201U + +#define GPIO_146_GPIO146 0x01080400U +#define GPIO_146_EPWM1B 0x01080401U + +#define GPIO_147_GPIO147 0x01080600U +#define GPIO_147_EPWM2A 0x01080601U + +#define GPIO_148_GPIO148 0x01080800U +#define GPIO_148_EPWM2B 0x01080801U + +#define GPIO_149_GPIO149 0x01080A00U +#define GPIO_149_EPWM3A 0x01080A01U + +#define GPIO_150_GPIO150 0x01080C00U +#define GPIO_150_EPWM3B 0x01080C01U + +#define GPIO_151_GPIO151 0x01080E00U +#define GPIO_151_EPWM4A 0x01080E01U + +#define GPIO_152_GPIO152 0x01081000U +#define GPIO_152_EPWM4B 0x01081001U + +#define GPIO_153_GPIO153 0x01081200U +#define GPIO_153_EPWM5A 0x01081201U + +#define GPIO_154_GPIO154 0x01081400U +#define GPIO_154_EPWM5B 0x01081401U + +#define GPIO_155_GPIO155 0x01081600U +#define GPIO_155_EPWM6A 0x01081601U + +#define GPIO_156_GPIO156 0x01081800U +#define GPIO_156_EPWM6B 0x01081801U + +#define GPIO_157_GPIO157 0x01081A00U +#define GPIO_157_EPWM7A 0x01081A01U + +#define GPIO_158_GPIO158 0x01081C00U +#define GPIO_158_EPWM7B 0x01081C01U + +#define GPIO_159_GPIO159 0x01081E00U +#define GPIO_159_EPWM8A 0x01081E01U + +#define GPIO_160_GPIO160 0x01460000U +#define GPIO_160_EPWM8B 0x01460001U + +#define GPIO_161_GPIO161 0x01460200U +#define GPIO_161_EPWM9A 0x01460201U + +#define GPIO_162_GPIO162 0x01460400U +#define GPIO_162_EPWM9B 0x01460401U + +#define GPIO_163_GPIO163 0x01460600U +#define GPIO_163_EPWM10A 0x01460601U + +#define GPIO_164_GPIO164 0x01460800U +#define GPIO_164_EPWM10B 0x01460801U + +#define GPIO_165_GPIO165 0x01460A00U +#define GPIO_165_EPWM11A 0x01460A01U + +#define GPIO_166_GPIO166 0x01460C00U +#define GPIO_166_EPWM11B 0x01460C01U + +#define GPIO_167_GPIO167 0x01460E00U +#define GPIO_167_EPWM12A 0x01460E01U + +#define GPIO_168_GPIO168 0x01461000U +#define GPIO_168_EPWM12B 0x01461001U + +#endif // PIN_MAP_H diff --git a/gpio_driverlib_cpu1/device/driverlib/pin_map_legacy.h b/gpio_driverlib_cpu1/device/driverlib/pin_map_legacy.h new file mode 100644 index 0000000..c503ad4 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/pin_map_legacy.h @@ -0,0 +1,95 @@ +//########################################################################### +// +// FILE: pin_map.h +// +// TITLE: Legacy definitions of pin mux info for gpio.c. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef __PIN_MAP_LEGACY_H__ +#define __PIN_MAP_LEGACY_H__ + + +#include "pin_map.h" + +//***************************************************************************** +// Legacy pinmuxing MACROS - Retained for portability across devices ONLY +// Not recommended for new users +//***************************************************************************** +#define GPIO_16_SD_D1 GPIO_16_SD1_D1 + +#define GPIO_17_SD_C1 GPIO_17_SD1_C1 + +#define GPIO_18_SD_D2 GPIO_18_SD1_D2 + +#define GPIO_19_SD_C2 GPIO_19_SD1_C2 + +#define GPIO_20_SD_D3 GPIO_20_SD1_D3 + +#define GPIO_21_SD_C3 GPIO_21_SD1_C3 + +#define GPIO_22_SD_D4 GPIO_22_SD1_D4 + +#define GPIO_23_SD_C4 GPIO_23_SD1_C4 + +#define GPIO_24_SD_D5 GPIO_24_SD2_D1 + +#define GPIO_25_SD_C5 GPIO_25_SD2_C1 + +#define GPIO_26_SD_D6 GPIO_26_SD2_D2 + +#define GPIO_27_SD_C6 GPIO_27_SD2_C2 + +#define GPIO_28_SD_D7 GPIO_28_SD2_D3 + +#define GPIO_29_SD_C7 GPIO_29_SD2_C3 + +#define GPIO_30_SD_D8 GPIO_30_SD2_D4 + +#define GPIO_31_SD_C8 GPIO_31_SD2_C4 + +#define GPIO_36_EM1WAIT1 GPIO_36_EM1WAIT + +#define GPIO_110_EM2WAIT1 GPIO_110_EM2WAIT + +#define GPIO_115_EM2CS0 GPIO_115_EM2CS0N + +#define GPIO_116_EM2CS2 GPIO_116_EM2CS2N + +#define GPIO_132_ODMSE0 GPIO_132_ODMSE1 + +#endif // __PIN_MAP_LEGACY_H__ diff --git a/gpio_driverlib_cpu1/device/driverlib/sci.c b/gpio_driverlib_cpu1/device/driverlib/sci.c new file mode 100644 index 0000000..dfd8e30 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sci.c @@ -0,0 +1,421 @@ +//########################################################################### +// +// FILE: sci.c +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "sci.h" + +//***************************************************************************** +// +// SCI_setConfig +// +//***************************************************************************** +void +SCI_setConfig(uint32_t base, uint32_t lspclkHz, uint32_t baud, uint32_t config) +{ + uint32_t divider; + + // + // Check the arguments. + // Is the required baud rate greater than the maximum rate supported? + // + ASSERT(SCI_isBaseValid(base)); + ASSERT(baud != 0U); + ASSERT((baud * 16U) <= lspclkHz); + + // + // Stop the SCI. + // + SCI_disableModule(base); + + // + // Compute the baud rate divider. + // + divider = ((lspclkHz / (baud * 8U)) - 1U); + + // + // Set the baud rate. + // + HWREGH(base + SCI_O_HBAUD) = (divider & 0xFF00U) >> 8U; + HWREGH(base + SCI_O_LBAUD) = divider & 0x00FFU; + + // + // Set parity, data length, and number of stop bits. + // + HWREGH(base + SCI_O_CCR) = ((HWREGH(base + SCI_O_CCR) & + ~(SCI_CONFIG_PAR_MASK | + SCI_CONFIG_STOP_MASK | + SCI_CONFIG_WLEN_MASK)) | config); + + // + // Start the SCI. + // + SCI_enableModule(base); +} + +//***************************************************************************** +// +// SCI_writeCharArray +// +//***************************************************************************** +void +SCI_writeCharArray(uint32_t base, const uint16_t * const array, + uint16_t length) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + uint16_t i; + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // FIFO is enabled. + // For loop to write (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until space is available in the transmit FIFO. + // + while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = array[i]; + } + } + else + { + // + // FIFO is not enabled. + // For loop to write (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until space is available in the transmit buffer. + // + while(!SCI_isSpaceAvailableNonFIFO(base)) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = array[i]; + } + } +} + +//***************************************************************************** +// +// SCI_readCharArray +// +//***************************************************************************** +void +SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + uint16_t i; + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // FIFO is enabled. + // For loop to read (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until a character is available in the receive FIFO. + // + while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0) + { + } + + // + // Return the character from the receive buffer. + // + array[i] = (uint16_t) + (HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M); + } + } + else + { + // + // FIFO is not enabled. + // For loop to read (Blocking) 'length' number of characters + // + for(i = 0U; i < length; i++) + { + // + // Wait until a character is available in the receive buffer. + // + while(!SCI_isDataAvailableNonFIFO(base)) + { + } + + // + // Return the character from the receive buffer. + // + array[i] = (uint16_t) + (HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M); + } + } +} + +//***************************************************************************** +// +// SCI_enableInterrupt +// +//***************************************************************************** +void +SCI_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the specified interrupts. + // + if((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) + { + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_RXERRINTENA; + } + if((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) + { + HWREGH(base + SCI_O_CTL2) |= SCI_CTL2_RXBKINTENA; + } + if((intFlags & SCI_INT_TXRDY) == SCI_INT_TXRDY) + { + HWREGH(base + SCI_O_CTL2) |= SCI_CTL2_TXINTENA; + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFFIENA; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SCI_disableInterrupt +// +//***************************************************************************** +void +SCI_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the specified interrupts. + // + if((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) + { + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_RXERRINTENA; + } + if((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) + { + HWREGH(base + SCI_O_CTL2) &= ~SCI_CTL2_RXBKINTENA; + } + if((intFlags & SCI_INT_TXRDY) == SCI_INT_TXRDY) + { + HWREGH(base + SCI_O_CTL2) &= ~SCI_CTL2_TXINTENA; + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_TXFFIENA; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) &= ~SCI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SCI_getInterruptStatus +// +//***************************************************************************** +uint32_t +SCI_getInterruptStatus(uint32_t base) +{ + uint32_t interruptStatus = 0; + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the interrupt status. + // + if((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXRDY) == SCI_CTL2_TXRDY) + { + interruptStatus |= SCI_INT_TXRDY; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXERROR) == SCI_RXST_RXERROR) + { + interruptStatus |= SCI_INT_RXERR; + } + if(((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXRDY) == SCI_RXST_RXRDY) || + ((HWREGH(base + SCI_O_RXST) & SCI_RXST_BRKDT) == SCI_RXST_BRKDT)) + { + interruptStatus |= SCI_INT_RXRDY_BRKDT; + } + if((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFINT) == SCI_FFTX_TXFFINT) + { + interruptStatus |= SCI_INT_TXFF; + } + if((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFINT) == SCI_FFRX_RXFFINT) + { + interruptStatus |= SCI_INT_RXFF; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_FE) == SCI_RXST_FE) + { + interruptStatus |= SCI_INT_FE; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_OE) == SCI_RXST_OE) + { + interruptStatus |= SCI_INT_OE; + } + if((HWREGH(base + SCI_O_RXST) & SCI_RXST_PE) == SCI_RXST_PE) + { + interruptStatus |= SCI_INT_PE; + } + + return(interruptStatus); +} + +//***************************************************************************** +// +// SCI_clearInterruptStatus +// +//***************************************************************************** +void +SCI_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the requested interrupt sources. + // + if(((intFlags & SCI_INT_RXERR) == SCI_INT_RXERR) || + ((intFlags & SCI_INT_RXRDY_BRKDT) == SCI_INT_RXRDY_BRKDT) || + ((intFlags & SCI_INT_FE) == SCI_INT_FE) || + ((intFlags & SCI_INT_OE) == SCI_INT_OE) || + ((intFlags & SCI_INT_PE) == SCI_INT_PE)) + { + SCI_performSoftwareReset(base); + } + if((intFlags & SCI_INT_TXFF) == SCI_INT_TXFF) + { + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFFINTCLR; + } + if((intFlags & SCI_INT_RXFF) == SCI_INT_RXFF) + { + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFINTCLR; + } +} + +//***************************************************************************** +// +// SCI_setBaud +// +//***************************************************************************** +void SCI_setBaud(uint32_t base, uint32_t lspclkHz, uint32_t baud) +{ + uint32_t divider; + + // + // Compute the baud rate divider {ROUND TO NEAREST INTEGER} + // + divider = ((float)((float)lspclkHz / ((float)baud * 8.0F)) - 1.0F) + 0.5F; + + // + // Set the baud rate. + // + HWREGH(base + SCI_O_HBAUD) = (divider & 0xFF00U) >> 8U; + HWREGH(base + SCI_O_LBAUD) = divider & 0x00FFU; +} + +//***************************************************************************** +// +// SCI_setWakeFlag +// +//***************************************************************************** +void SCI_setWakeFlag(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the TX wake flag bit to indicate + // that the next frame is an address frame. + // + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_TXWAKE; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/sci.h b/gpio_driverlib_cpu1/device/driverlib/sci.h new file mode 100644 index 0000000..454ee12 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sci.h @@ -0,0 +1,1646 @@ +//########################################################################### +// +// FILE: sci.h +// +// TITLE: C28x SCI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SCI_H +#define SCI_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sci_api SCI +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_sci.h" +#include "inc/hw_types.h" +#include "debug.h" + +//***************************************************************************** +// +// Values that can be passed to SCI_enableInterrupt, SCI_disableInterrupt, and +// SCI_clearInterruptStatus as the intFlags parameter, and returned from +// SCI_getInterruptStatus. +// +//***************************************************************************** +#define SCI_INT_RXERR 0x01U //!< RXERR interrupt +#define SCI_INT_RXRDY_BRKDT 0x02U //!< RXRDY interrupt +#define SCI_INT_TXRDY 0x04U //!< TXRDY interrupt +#define SCI_INT_TXFF 0x08U //!< TX FIFO level interrupt +#define SCI_INT_RXFF 0x10U //!< RX FIFO level interrupt +#define SCI_INT_FE 0x20U //!< Frame Error +#define SCI_INT_OE 0x40U //!< Overrun Error +#define SCI_INT_PE 0x80U //!< Parity Error + +//***************************************************************************** +// +// Values that can be passed to SCI_setConfig as the config parameter +// and returned by SCI_getConfig in the config parameter. +// Additionally, the SCI_CONFIG_PAR_* enum subset can be passed to +// SCI_setParityMode as the parity parameter, and are returned by +// SCI_getParityMode. +// +//***************************************************************************** +#define SCI_CONFIG_WLEN_MASK 0x0007U //!< Mask for extracting word length +#define SCI_CONFIG_WLEN_8 0x0007U //!< 8 bit data +#define SCI_CONFIG_WLEN_7 0x0006U //!< 7 bit data +#define SCI_CONFIG_WLEN_6 0x0005U //!< 6 bit data +#define SCI_CONFIG_WLEN_5 0x0004U //!< 5 bit data +#define SCI_CONFIG_WLEN_4 0x0003U //!< 4 bit data +#define SCI_CONFIG_WLEN_3 0x0002U //!< 3 bit data +#define SCI_CONFIG_WLEN_2 0x0001U //!< 2 bit data +#define SCI_CONFIG_WLEN_1 0x0000U //!< 1 bit data +#define SCI_CONFIG_STOP_MASK 0x0080U //!< Mask for extracting stop bits +#define SCI_CONFIG_STOP_ONE 0x0000U //!< One stop bit +#define SCI_CONFIG_STOP_TWO 0x0080U //!< Two stop bits +#define SCI_CONFIG_PAR_MASK 0x0060U //!< Parity Mask + +//***************************************************************************** +// +//! Values that can be used with SCI_setParityMode() and SCI_getParityMode() to +//! describe the parity of the SCI communication. +// +//***************************************************************************** +typedef enum +{ + SCI_CONFIG_PAR_NONE = 0x0000U, //!< No parity + SCI_CONFIG_PAR_EVEN = 0x0060U, //!< Even parity + SCI_CONFIG_PAR_ODD = 0x0020U //!< Odd parity +} SCI_ParityType; + +//***************************************************************************** +// +//! Values that can be passed to SCI_setFIFOInterruptLevel() as the txLevel +//! parameter and returned by SCI_getFIFOInteruptLevel() and +//! SCI_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SCI_FIFO_TX0 = 0x0000U, //!< Transmit interrupt empty + SCI_FIFO_TX1 = 0x0001U, //!< Transmit interrupt 1/16 full + SCI_FIFO_TX2 = 0x0002U, //!< Transmit interrupt 2/16 full + SCI_FIFO_TX3 = 0x0003U, //!< Transmit interrupt 3/16 full + SCI_FIFO_TX4 = 0x0004U, //!< Transmit interrupt 4/16 full + SCI_FIFO_TX5 = 0x0005U, //!< Transmit interrupt 5/16 full + SCI_FIFO_TX6 = 0x0006U, //!< Transmit interrupt 6/16 full + SCI_FIFO_TX7 = 0x0007U, //!< Transmit interrupt 7/16 full + SCI_FIFO_TX8 = 0x0008U, //!< Transmit interrupt 8/16 full + SCI_FIFO_TX9 = 0x0009U, //!< Transmit interrupt 9/16 full + SCI_FIFO_TX10 = 0x000AU, //!< Transmit interrupt 10/16 full + SCI_FIFO_TX11 = 0x000BU, //!< Transmit interrupt 11/16 full + SCI_FIFO_TX12 = 0x000CU, //!< Transmit interrupt 12/16 full + SCI_FIFO_TX13 = 0x000DU, //!< Transmit interrupt 13/16 full + SCI_FIFO_TX14 = 0x000EU, //!< Transmit interrupt 14/16 full + SCI_FIFO_TX15 = 0x000FU, //!< Transmit interrupt 15/16 full + SCI_FIFO_TX16 = 0x0010U //!< Transmit interrupt full +} SCI_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SCI_setFIFOInterruptLevel() as the rxLevel +//! parameter and returned by SCI_getFIFOInterruptLevel() and +//! SCI_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SCI_FIFO_RX0 = 0x0000U, //!< Receive interrupt empty + SCI_FIFO_RX1 = 0x0001U, //!< Receive interrupt 1/16 full + SCI_FIFO_RX2 = 0x0002U, //!< Receive interrupt 2/16 full + SCI_FIFO_RX3 = 0x0003U, //!< Receive interrupt 3/16 full + SCI_FIFO_RX4 = 0x0004U, //!< Receive interrupt 4/16 full + SCI_FIFO_RX5 = 0x0005U, //!< Receive interrupt 5/16 full + SCI_FIFO_RX6 = 0x0006U, //!< Receive interrupt 6/16 full + SCI_FIFO_RX7 = 0x0007U, //!< Receive interrupt 7/16 full + SCI_FIFO_RX8 = 0x0008U, //!< Receive interrupt 8/16 full + SCI_FIFO_RX9 = 0x0009U, //!< Receive interrupt 9/16 full + SCI_FIFO_RX10 = 0x000AU, //!< Receive interrupt 10/16 full + SCI_FIFO_RX11 = 0x000BU, //!< Receive interrupt 11/16 full + SCI_FIFO_RX12 = 0x000CU, //!< Receive interrupt 12/16 full + SCI_FIFO_RX13 = 0x000DU, //!< Receive interrupt 13/16 full + SCI_FIFO_RX14 = 0x000EU, //!< Receive interrupt 14/16 full + SCI_FIFO_RX15 = 0x000FU, //!< Receive interrupt 15/16 full + SCI_FIFO_RX16 = 0x0010U //!< Receive interrupt full +} SCI_RxFIFOLevel; + +//***************************************************************************** +// +// Values returned from SCI_getRxStatus(). These correspond to the different +// bits and flags of the SCIRXST register. +// +//***************************************************************************** +#define SCI_RXSTATUS_WAKE 0x0002U //!< Receiver wake up detect +#define SCI_RXSTATUS_PARITY 0x0004U //!< Parity error +#define SCI_RXSTATUS_OVERRUN 0x0008U //!< Overrun error +#define SCI_RXSTATUS_FRAMING 0x0010U //!< Framing error +#define SCI_RXSTATUS_BREAK 0x0020U //!< Break detect +#define SCI_RXSTATUS_READY 0x0040U //!< Receiver ready +#define SCI_RXSTATUS_ERROR 0x0080U //!< Receiver error + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks a SCI base address. +//! +//! \param base is the base address of the SCI port. +//! +//! This function determines if a SCI port base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SCI_isBaseValid(uint32_t base) +{ + return( + (base == SCIA_BASE) || + (base == SCIB_BASE) || + (base == SCIC_BASE) || + (base == SCID_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Sets the type of parity. +//! +//! \param base is the base address of the SCI port. +//! \param parity specifies the type of parity to use. +//! +//! Sets the type of parity to use for transmitting and expect when receiving. +//! The \e parity parameter must be one of the following: +//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setParityMode(uint32_t base, SCI_ParityType parity) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the parity mode. + // + HWREGH(base + SCI_O_CCR) = ((HWREGH(base + SCI_O_CCR) & + ~(SCI_CONFIG_PAR_MASK)) | (uint16_t)parity); +} + +//***************************************************************************** +// +//! Gets the type of parity currently being used. +//! +//! \param base is the base address of the SCI port. +//! +//! This function gets the type of parity used for transmitting data and +//! expected when receiving data. +//! +//! \return Returns the current parity settings, specified as one of the +//! following: +//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD. +// +//***************************************************************************** +static inline SCI_ParityType +SCI_getParityMode(uint32_t base) +{ + uint16_t parity; + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current parity setting. + // + parity = (HWREGH(base + SCI_O_CCR) & (SCI_CONFIG_PAR_MASK)); + + return((SCI_ParityType)parity); +} + +//***************************************************************************** +// +//! Sets the multiprocessor protocol to address-bit mode. +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the multi-processor protocol to address-bit mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setAddrMultiProcessorMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the address-bit mode protocol + // + HWREGH(base + SCI_O_CCR) |= SCI_CCR_ADDRIDLE_MODE; +} + +//***************************************************************************** +// +//! Sets the multiprocessor protocol to idle-line mode. +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the multi-processor protocol to idle-line protocol. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setIdleMultiProcessorMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the address-bit mode protocol + // + HWREGH(base + SCI_O_CCR) &= ~SCI_CCR_ADDRIDLE_MODE; +} + +//***************************************************************************** +// +//! Locks Autobaud. +//! +//! \param base is the base address of the SCI port. +//! +//! This function performs an autobaud lock for the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_lockAutobaud(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Prime the baud register + // + HWREGH(base + SCI_O_HBAUD) = 0x0U; + HWREGH(base + SCI_O_LBAUD) = 0x1U; + + // + // Prepare for autobaud detection. + // Set the CDC bit to enable autobaud detection and clear the ABD bit. + // + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_CDC; + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR; + + // + // Wait until we correctly read an 'A' or 'a' and lock + // + while((HWREGH(base + SCI_O_FFCT) & SCI_FFCT_ABD) != SCI_FFCT_ABD) + { + } + + // + // After autobaud lock, clear the ABD and CDC bits + // + HWREGH(base + SCI_O_FFCT) |= SCI_FFCT_ABDCLR; + HWREGH(base + SCI_O_FFCT) &= ~SCI_FFCT_CDC; +} + +//***************************************************************************** +// +//! Sets the FIFO interrupt level at which interrupts are generated. +//! +//! \param base is the base address of the SCI port. +//! \param txLevel is the transmit FIFO interrupt level, specified as one of +//! the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, . . . or +//! \b SCI_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as one of +//! the following +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_setFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel txLevel, + SCI_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + SCI_O_FFTX) = (HWREGH(base + SCI_O_FFTX) & + (~SCI_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + SCI_O_FFRX) = (HWREGH(base + SCI_O_FFRX) & + (~SCI_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO interrupt level at which interrupts are generated. +//! +//! \param base is the base address of the SCI port. +//! \param txLevel is a pointer to storage for the transmit FIFO interrupt +//! level, returned as one of the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, ... or \b SCI_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO interrupt +//! level, returned as one of the following: +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_getFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel *txLevel, + SCI_RxFIFOLevel *rxLevel) +{ + + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (SCI_TxFIFOLevel)(HWREGH(base + SCI_O_FFTX) & + SCI_FFTX_TXFFIL_M); + *rxLevel = (SCI_RxFIFOLevel)(HWREGH(base + SCI_O_FFRX) & + SCI_FFRX_RXFFIL_M); +} + +//***************************************************************************** +// +//! Gets the current configuration of a SCI. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is a pointer to storage for the baud rate. +//! \param config is a pointer to storage for the data format. +//! +//! The baud rate and data format for the SCI is determined, given an +//! explicitly provided peripheral clock (hence the ExpClk suffix). The +//! returned baud rate is the actual baud rate; it may not be the exact baud +//! rate requested or an ``official'' baud rate. The data format returned in +//! \e config is enumerated the same as the \e config parameter of +//! SCI_setConfig(). +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSeedClock(), or it can be explicitly +//! hard coded if it is constant and known (to save the code/execution overhead +//! of a call to SysCtl_getLowSpeedClock()). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_getConfig(uint32_t base, uint32_t lspclkHz, uint32_t *baud, + uint32_t *config) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Compute the baud rate. + // + *baud = lspclkHz / + ((1U + (((uint32_t)HWREGH(base + SCI_O_HBAUD) << 8U) | + HWREGH(base + SCI_O_LBAUD))) * 8U); + + // + // Get the parity, data length, and number of stop bits. + // + *config = (uint32_t)HWREGH(base + SCI_O_CCR) & (SCI_CONFIG_PAR_MASK | + SCI_CONFIG_STOP_MASK | + SCI_CONFIG_WLEN_MASK); +} + +//***************************************************************************** +// +//! Enables transmitting and receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the TXENA, and +//! RXENA bits which enables transmit and receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable RX, TX, and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_TXENA | SCI_CTL1_RXENA | + SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables transmitting and receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Clears the SCIEN, TXE, and RXE bits. The user should ensure that all the +//! data has been sent before disable the module during transmission. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~(SCI_FFTX_SCIFFENA); + + // + // Disable the SCI. + // + HWREGH(base + SCI_O_CTL1) &= ~(SCI_CTL1_TXENA | SCI_CTL1_RXENA); +} + +//***************************************************************************** +// +//! Enables transmitting. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the TXENA bit +//! which enables transmit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableTxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable TX and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_TXENA | SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables transmitting. +//! +//! \param base is the base address of the SCI port. +//! +//! Disables SCI by taking SCI out of the software reset. Clears the TXENA bit +//! which disables transmit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableTxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable TX. + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_TXENA; +} + +//***************************************************************************** +// +//! Enables receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Enables SCI by taking SCI out of the software reset. Sets the RXENA bit +//! which enables receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableRxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable RX and the SCI. + // + HWREGH(base + SCI_O_CTL1) |= (SCI_CTL1_RXENA | SCI_CTL1_SWRESET); +} + +//***************************************************************************** +// +//! Disables receiving. +//! +//! \param base is the base address of the SCI port. +//! +//! Disables SCI by taking SCI out of the software reset. Clears the RXENA bit +//! which disables receive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableRxModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable RX. + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_RXENA; +} + +//***************************************************************************** +// +//! Enables Sleep Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Enables the sleep mode in SCI by setting the SLEEP bit in SCICTL1 register +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableSleepMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set sleep bit + // + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_SLEEP; +} + +//***************************************************************************** +// +//! Disables Sleep Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Disables the sleep mode in SCI by clearing the SLEEP bit in SCICTL1 register +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableSleepMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear sleep bit + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_SLEEP; +} + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions enables the transmit and receive FIFOs in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIRST; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIFFENA | SCI_FFTX_TXFIFORESET; + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions disables the transmit and receive FIFOs in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_SCIFFENA; +} + +//***************************************************************************** +// +//! Determines if the FIFO enhancement is enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not the FIFO enhancement +//! is enabled. +//! +//! \return Returns \b true if the FIFO enhancement is enabled or \b false +//! if the FIFO enhancement is disabled. +// +//***************************************************************************** +static inline bool +SCI_isFIFOEnabled(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return true if the FIFO is enabled and false if it is disabled. + // + return(((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_SCIFFENA) == + SCI_FFTX_SCIFFENA) ? true : false); +} + +//***************************************************************************** +// +//! Resets the receive FIFO. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets the receive FIFO of the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetRxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the specified FIFO. + // + HWREGH(base + SCI_O_FFRX) &= ~SCI_FFRX_RXFIFORESET; + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the transmit FIFO. +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets the transmit FIFO of the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetTxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the specified FIFO. + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_TXFIFORESET; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_TXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the SCI Transmit and Receive Channels +//! +//! \param base is the base address of the SCI port. +//! +//! This functions resets transmit and receive channels in the SCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_resetChannels(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Reset the Tx and Rx Channels + // + HWREGH(base + SCI_O_FFTX) &= ~SCI_FFTX_SCIRST; + HWREGH(base + SCI_O_FFTX) |= SCI_FFTX_SCIRST; +} + +//***************************************************************************** +// +//! Determines if there are any characters in the receive buffer when the +//! FIFO enhancement is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not there is data +//! available in the receive buffer. +//! +//! \return Returns \b true if there is data in the receive buffer or \b false +//! if there is no data in the receive buffer. +// +//***************************************************************************** +static inline bool +SCI_isDataAvailableNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the availability of characters with FIFO disabled. + // + return(((HWREGH(base + SCI_O_RXST) & SCI_RXST_RXRDY) == + SCI_RXST_RXRDY) ? true : false); +} + +//***************************************************************************** +// +//! Determines if there is any space in the transmit buffer when the FIFO +//! enhancement is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns a flag indicating whether or not there is space +//! available in the transmit buffer when not using the FIFO enhancement. +//! +//! \return Returns \b true if there is space available in the transmit buffer +//! or \b false if there is no space available in the transmit buffer. +// +//***************************************************************************** +static inline bool +SCI_isSpaceAvailableNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the availability of space. + // + return(((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXRDY) == + SCI_CTL2_TXRDY) ? true : false); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, \b SCI_FIFO_TX3 +//! \b SCI_FIFO_TX4, ..., or \b SCI_FIFO_TX16 +// +//***************************************************************************** +static inline SCI_TxFIFOLevel +SCI_getTxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SCI_TxFIFOLevel)((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFST_M) >> + SCI_FFTX_TXFFST_S)); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, \b SCI_FIFO_RX3 +//! \b SCI_FIFO_RX4, ..., or \b SCI_FIFO_RX16 +// +//***************************************************************************** +static inline SCI_RxFIFOLevel +SCI_getRxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SCI_RxFIFOLevel)((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFST_M) >> + SCI_FFRX_RXFFST_S)); +} + +//***************************************************************************** +// +//! Determines whether the SCI transmitter is busy or not. +//! +//! \param base is the base address of the SCI port. +//! +//! Allows the caller to determine whether all transmitted bytes have cleared +//! the transmitter hardware when the FIFO is not enabled. When the FIFO is +//! enabled, this function allows the caller to determine whether there is any +//! data in the FIFO. +//! +//! Without the FIFO enabled, if \b false is returned, the transmit buffer and +//! shift registers are empty and the transmitter is not busy. With the FIFO +//! enabled, if \b false is returned, the FIFO is empty. This does not +//! necessarily mean that the transmitter is not busy. The empty FIFO does not +//! reflect the status of the transmitter shift register. The FIFO may be empty +//! while the transmitter is still transmitting data. +//! +//! \return Returns \b true if the SCI is transmitting or \b false if +//! transmissions are complete. +// +//***************************************************************************** +static inline bool +SCI_isTransmitterBusy(uint32_t base) +{ + // + // Check the argument. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Check if FIFO enhancement is enabled. + // + if(SCI_isFIFOEnabled(base)) + { + // + // With FIFO enhancement, determine if the SCI is busy. + // + return(((HWREGH(base + SCI_O_FFTX) & SCI_FFTX_TXFFST_M) != + 0U) ? true : false); + } + else + { + // + // Without FIFO enhancement, determine if the SCI is busy. + // Check if the transmit buffer and shift register empty. + // + return(((HWREGH(base + SCI_O_CTL2) & SCI_CTL2_TXEMPTY) == + SCI_CTL2_TXEMPTY) ? false : true); + } +} + +//***************************************************************************** +// +//! Waits to send a character from the specified port when the FIFO enhancement +//! is enabled. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Sends the character \e data to the transmit buffer for the specified port. +//! If there is no space available in the transmit FIFO, this function waits +//! until there is space available before returning. \e data is a uint16_t but +//! only 8 bits are written to the SCI port. SCI only transmits 8 bit +//! characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharBlockingFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until space is available in the transmit FIFO. + // + while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits to send a character from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Sends the character \e data to the transmit buffer for the specified port. +//! If there is no space available in the transmit buffer, or the transmit +//! FIFO if it is enabled, this function waits until there is space available +//! before returning. \e data is a uint16_t but only 8 bits are written to the +//! SCI port. SCI only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharBlockingNonFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until space is available in the transmit buffer. + // + while(!SCI_isSpaceAvailableNonFIFO(base)) + { + } + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Sends a character to the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param data is the character to be transmitted. +//! +//! Writes the character \e data to the transmit buffer for the specified port. +//! This function does not block and only writes to the transmit buffer. +//! The user should use SCI_isSpaceAvailableNonFIFO() or SCI_getTxFIFOStatus() +//! to determine if the transmit buffer or FIFO have space available. +//! \e data is a uint16_t but only 8 bits are written to the SCI port. SCI +//! only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_writeCharNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Send a char. + // + HWREGH(base + SCI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Gets current receiver status flags. +//! +//! \param base is the base address of the SCI port. +//! +//! This function returns the current receiver status flags. The returned +//! error flags are equivalent to the error bits returned via the previous +//! reading or receiving of a character with the exception that the overrun +//! error is set immediately the overrun occurs rather than when a character +//! is next read. +//! +//! \return Returns a bitwise OR combination of the receiver status flags, +//! \b SCI_RXSTATUS_WAKE, \b SCI_RXSTATUS_PARITY, \b SCI_RXSTATUS_OVERRUN, +//! \b SCI_RXSTATUS_FRAMING, \b SCI_RXSTATUS_BREAK, \b SCI_RXSTATUS_READY, +//! and \b SCI_RXSTATUS_ERROR. +// +//***************************************************************************** +static inline uint16_t +SCI_getRxStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current value of the receive status register. + // + return(HWREGH(base + SCI_O_RXST)); +} + +//***************************************************************************** +// +//! Waits for a character from the specified port when the FIFO enhancement +//! is enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive FIFO for the specified port. If there +//! are no characters available, this function waits until a character is +//! received before returning. Returns immediately in case of Error. +//! +//! \return Returns the character read from the specified port as \e uint16_t +//! or 0x0 in case of Error. The application must use +//! SCI_getRxStatus() API to check if some error occurred before +//! consuming the data +// +//***************************************************************************** +static inline uint16_t +SCI_readCharBlockingFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until a character is available in the receive FIFO. + // + while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0) + { + // + //If there is any error return + // + if((SCI_getRxStatus(base) & SCI_RXSTATUS_ERROR) != 0U) + { + return(0U); + } + } + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Waits for a character from the specified port when the FIFO enhancement +//! is not enabled. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive buffer for the specified port. If there +//! is no characters available, this function waits until a character is +//! received before returning. +//! +//! \return Returns the character read from the specified port as \e uint16_t. +// +//***************************************************************************** +static inline uint16_t +SCI_readCharBlockingNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Wait until a character is available in the receive FIFO. + // + while(!SCI_isDataAvailableNonFIFO(base)) + { + } + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Receives a character from the specified port. +//! +//! \param base is the base address of the SCI port. +//! +//! Gets a character from the receive buffer for the specified port. This +//! function does not block and only reads the receive buffer. The user should +//! use SCI_isDataAvailableNonFIFO() or SCI_getRxFIFOStatus() to determine if +//! the receive buffer or FIFO have data available. +//! +//! \return Returns \e uin16_t which is read from the receive buffer. +// +//***************************************************************************** +static inline uint16_t +SCI_readCharNonBlocking(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the character from the receive buffer. + // + return((uint16_t)(HWREGH(base + SCI_O_RXBUF) & SCI_RXBUF_SAR_M)); +} + +//***************************************************************************** +// +//! Performs a software reset of the SCI and Clears all reported receiver +//! status flags. +//! +//! \param base is the base address of the SCI port. +//! +//! This function performs a software reset of the SCI port. It affects the +//! operating flags of the SCI, but it neither affects the configuration bits +//! nor restores the reset values. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_performSoftwareReset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // To clear all errors a sw reset of the module is required + // + HWREGH(base + SCI_O_CTL1) &= ~SCI_CTL1_SWRESET; + HWREGH(base + SCI_O_CTL1) |= SCI_CTL1_SWRESET; +} + +//***************************************************************************** +// +//! Enables Loop Back Test Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Enables the loop back test mode where the Tx pin is internally connected +//! to the Rx pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Set the loop back mode. + // + HWREGH(base + SCI_O_CCR) |= SCI_CCR_LOOPBKENA; +} + +//***************************************************************************** +// +//! Disables Loop Back Test Mode +//! +//! \param base is the base address of the SCI port. +//! +//! Disables the loop back test mode where the Tx pin is no longer internally +//! connected to the Rx pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the loop back mode. + // + HWREGH(base + SCI_O_CCR) &= ~SCI_CCR_LOOPBKENA; +} + +//***************************************************************************** +// +//! Get the receive FIFO Overflow flag status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions gets the receive FIFO overflow flag status. +//! +//! \return Returns \b true if overflow has occurred, else returned \b false if +//! an overflow hasn't occurred. +// +//***************************************************************************** +static inline bool +SCI_getOverflowStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Return the current FIFO overflow status + // + return((HWREGH(base + SCI_O_FFRX) & SCI_FFRX_RXFFOVF) == SCI_FFRX_RXFFOVF); +} + +//***************************************************************************** +// +//! Clear the receive FIFO Overflow flag status +//! +//! \param base is the base address of the SCI port. +//! +//! This functions clears the receive FIFO overflow flag status. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SCI_clearOverflowStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SCI_isBaseValid(base)); + + // + // Clear the current FIFO overflow status + // + HWREGH(base + SCI_O_FFRX) |= SCI_FFRX_RXFFOVRCLR; +} + +//***************************************************************************** +// +//! Sets the configuration of a SCI. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is the desired baud rate. +//! \param config is the data format for the port (number of data bits, +//! number of stop bits, and parity). +//! +//! This function configures the SCI for operation in the specified data +//! format. The baud rate is provided in the \e baud parameter and the data +//! format in the \e config parameter. +//! +//! The \e config parameter is the bitwise OR of three values: the number of +//! data bits, the number of stop bits, and the parity. \b SCI_CONFIG_WLEN_8, +//! \b SCI_CONFIG_WLEN_7, \b SCI_CONFIG_WLEN_6, \b SCI_CONFIG_WLEN_5, +//! \b SCI_CONFIG_WLEN_4, \b SCI_CONFIG_WLEN_3, \b SCI_CONFIG_WLEN_2, and +//! \b SCI_CONFIG_WLEN_1. Select from eight to one data bits per byte +//! (respectively). +//! \b SCI_CONFIG_STOP_ONE and \b SCI_CONFIG_STOP_TWO select one or two stop +//! bits (respectively). \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, +//! \b SCI_CONFIG_PAR_ODD, select the parity mode (no parity bit, even parity +//! bit, odd parity bit respectively). +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSpeedClock(), or it can be explicitly +//! hard coded if it is constant and known (to save the code/execution overhead +//! of a call to SysCtl_getLowSpeedClock()). +//! +//! A baud rate divider (BRR) is used in this function to calculate the +//! baud rate. The value of BRR is calculated in float and type casted as int +//! to be fed in the \b SCIHBAUD and \b SCILBAUD registers. This conversion +//! brings an error in the calculated baud rate and the requested. Error will +//! be significant when operating at higher baud rates. The error is due to +//! lower BRR integer value granularity at higher baud rates. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setConfig(uint32_t base, uint32_t lspclkHz, uint32_t baud, + uint32_t config); + +//***************************************************************************** +// +//! Waits to send an array of characters from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param array is the address of the array of characters to be transmitted. +//! It is pointer to the array of characters to be transmitted. +//! \param length is the length of the array, or number of characters in the +//! array to be transmitted. +//! +//! Sends the number of characters specified by \e length, starting at the +//! address \e array, out of the transmit buffer for the specified port. +//! If there is no space available in the transmit buffer, or the transmit +//! FIFO if it is enabled, this function waits until there is space available +//! and \e length number of characters are transmitted before returning. +//! \e array is a pointer to uint16_ts but only the least significant 8 bits +//! are written to the SCI port. SCI only transmits 8 bit characters. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_writeCharArray(uint32_t base, const uint16_t * const array, + uint16_t length); + +//***************************************************************************** +// +//! Waits to receive an array of characters from the specified port. +//! +//! \param base is the base address of the SCI port. +//! \param array is the address of the array of characters to be received. +//! It is a pointer to the array of characters to be received. +//! \param length is the length of the array, or number of characters in the +//! array to be received. +//! +//! Receives an array of characters from the receive buffer for the specified +//! port, and stores them as an array of characters starting at address +//! \e array. This function waits until the \e length number of characters are +//! received before returning. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length); + +//***************************************************************************** +// +//! Enables individual SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated SCI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The \e intFlags parameter is the bitwise OR of any of the following: +//! +//! - \b SCI_INT_RXERR - RXERR Interrupt +//! - \b SCI_INT_RXRDY_BRKDT - RXRDY/BRKDT Interrupt +//! - \b SCI_INT_TXRDY - TXRDY Interrupt +//! - \b SCI_INT_TXFF - TX FIFO Level Interrupt +//! - \b SCI_INT_RXFF - RX FIFO Level Interrupt +//! - \b SCI_INT_FE - Frame Error +//! - \b SCI_INT_OE - Overrun Error +//! - \b SCI_INT_PE - Parity Error +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables individual SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated SCI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to SCI_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base is the base address of the SCI port. +//! +//! \return Returns the current interrupt status, enumerated as a bit field of +//! values described in SCI_enableInterrupt(). +// +//***************************************************************************** +extern uint32_t +SCI_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears SCI interrupt sources. +//! +//! \param base is the base address of the SCI port. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified SCI interrupt sources are cleared, so that they no longer +//! assert. This function must be called in the interrupt handler to keep the +//! interrupt from being recognized again immediately upon exit. +//! +//! The \e intFlags parameter has the same definition as the \e intFlags +//! parameter to SCI_enableInterrupt(). +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_clearInterruptStatus(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Sets SCI Baud rate. +//! +//! \param base is the base address of the SCI port. +//! \param lspclkHz is the rate of the clock supplied to the SCI module. This +//! is the LSPCLK. +//! \param baud is the desired baud rate. +//! +//! This function configures the SCI for operation in the specified baud rate +//! The baud rate is provided in the \e baud parameter. +//! +//! The peripheral clock is the low speed peripheral clock. This will be +//! the value returned by SysCtl_getLowSpeedClock() +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setBaud(uint32_t base, uint32_t lspclkHz, uint32_t baud); + +//***************************************************************************** +// +//! Sets the SCI TXWAKE flag +//! +//! \param base is the base address of the SCI port. +//! +//! This function sets the TXWAKE flag bit to indicate that the next frame +//! is an address frame. +//! TXWAKE bit controls selection of data-transmit feature based on +//! which mode is selected from idle-line and address-bit. +//! +//! \return None. +// +//***************************************************************************** +extern void +SCI_setWakeFlag(uint32_t base); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SCI_H diff --git a/gpio_driverlib_cpu1/device/driverlib/sdfm.c b/gpio_driverlib_cpu1/device/driverlib/sdfm.c new file mode 100644 index 0000000..41bc605 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sdfm.c @@ -0,0 +1,188 @@ +//########################################################################### +// +// FILE: sdfm.c +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "sdfm.h" + +//***************************************************************************** +// +// Defines for filter configurations. Not intended for use by application code. +// +//***************************************************************************** +// +// Get filter oversampling ratio +// +#define SDFM_GET_OSR(C) ((C) >> 8U) + +// +// Maximum acceptable comparator filter oversampling ratio +// +#define SDFM_MAX_COMP_FILTER_OSR 31U + +// +// Maximum acceptable data filter oversampling ratio +// +#define SDFM_MAX_DATA_FILTER_OSR 255U + +// +// Get the filter type +// +#define SDFM_GET_FILTER_TYPE(C) ((C) & 0x30U) + +// +// Get the filter number +// +#define SDFM_GET_FILTER_NUMBER(C) ((C) & 0x3U) + + +// +// Get data shift value +// +#define SDFM_GET_SHIFT_VALUE(C) (((C) >> 2U) & 0x1FU) + +//***************************************************************************** +// +// SDFM_configComparator +// +//***************************************************************************** +void SDFM_configComparator(uint32_t base, uint16_t config1, uint32_t config2) +{ + SDFM_FilterNumber filter; + uint16_t ratio; + SDFM_FilterType filterType; + + filter = (SDFM_FilterNumber)(SDFM_GET_FILTER_NUMBER(config1)); + ratio = SDFM_GET_OSR(config1); + filterType = (SDFM_FilterType)SDFM_GET_FILTER_TYPE(config1); + + // + // Limit the oversampling ratio + // + if(ratio > SDFM_MAX_COMP_FILTER_OSR) + { + ratio = SDFM_MAX_COMP_FILTER_OSR; + } + + // + // Set the comparator filter type + // + SDFM_setComparatorFilterType(base, filter, filterType); + + // + // Set the comparator filter over sampling ratio + // + SDFM_setCompFilterOverSamplingRatio(base, filter, ratio); + + // + // Set the comparator high threshold value + // + SDFM_setCompFilterHighThreshold(base, filter, + SDFM_GET_HIGH_THRESHOLD(config2)); + + // + // Set the comparator low threshold value + // + SDFM_setCompFilterLowThreshold(base, filter, + SDFM_GET_LOW_THRESHOLD(config2)); + +} + +//***************************************************************************** +// +// SDFM_configDataFilter +// +//***************************************************************************** +void SDFM_configDataFilter(uint32_t base, uint16_t config1, uint16_t config2) +{ + SDFM_FilterNumber filter; + uint16_t ratio; + SDFM_FilterType filterType; + + filter = (SDFM_FilterNumber)(SDFM_GET_FILTER_NUMBER(config1)); + ratio = SDFM_GET_OSR(config1); + filterType = (SDFM_FilterType)SDFM_GET_FILTER_TYPE(config1); + + // + // Limit the oversampling ratio + // + if(ratio > SDFM_MAX_DATA_FILTER_OSR) + { + ratio = SDFM_MAX_DATA_FILTER_OSR; + } + + // + // Set the comparator filter type + // + SDFM_setFilterType(base, filter, filterType); + + // + // Set the comparator filter over sampling ratio + // + SDFM_setFilterOverSamplingRatio(base, filter, ratio); + + // + // If filter switch on + // + if((config2 & SDFM_FILTER_ENABLE) == SDFM_FILTER_ENABLE) + { + SDFM_enableFilter(base, filter); + } + else + { + SDFM_disableFilter(base, filter); + } + + // + // Set output data format + // + SDFM_setOutputDataFormat(base, filter, + (SDFM_OutputDataFormat)(config2 & 0x1U)); + + // + // Set the shift value if data is in 16-bit 2's complement format + // + if((config2 & 0x1U) == (uint16_t)(SDFM_DATA_FORMAT_16_BIT)) + { + SDFM_setDataShiftValue(base, filter, SDFM_GET_SHIFT_VALUE(config2)); + } +} + + diff --git a/gpio_driverlib_cpu1/device/driverlib/sdfm.h b/gpio_driverlib_cpu1/device/driverlib/sdfm.h new file mode 100644 index 0000000..afbdfb7 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sdfm.h @@ -0,0 +1,1178 @@ +//########################################################################### +// +// FILE: sdfm.h +// +// TITLE: C28x SDFM Driver +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef SDFM_H +#define SDFM_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sdfm_api SDFM +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_types.h" +#include "inc/hw_sdfm.h" +#include "inc/hw_memmap.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//! Macro to get the low threshold +//! +#define SDFM_GET_LOW_THRESHOLD(C) ((uint16_t)(C)) + +//! Macro to get the high threshold +//! +#define SDFM_GET_HIGH_THRESHOLD(C) ((uint16_t)((uint32_t)(C) >> 16U)) + + +//! Macro to convert comparator over sampling ratio to acceptable bit location +//! +#define SDFM_SET_OSR(X) (((X) - 1U) << 8U) +//! Macro to convert the data shift bit values to acceptable bit location +//! +#define SDFM_SHIFT_VALUE(X) ((X) << 2U) + +//! Macro to combine high threshold and low threshold values +//! +#define SDFM_THRESHOLD(H, L) ((((uint32_t)(H)) << 16U) | (L)) + +//! Macro to set the FIFO level to acceptable bit location +//! +#define SDFM_SET_FIFO_LEVEL(X) ((X) << 7U) + +//! Macro to set and enable the zero cross threshold value. +//! +#define SDFM_SET_ZERO_CROSS_THRESH_VALUE(X) (0x8000 | (X)) + +//! Macros to enable or disable filter. +//! +#define SDFM_FILTER_DISABLE 0x0U +#define SDFM_FILTER_ENABLE 0x2U + +//***************************************************************************** +// +//! Values that can be returned from SDFM_getThresholdStatus() +// +//***************************************************************************** +typedef enum +{ + SDFM_OUTPUT_WITHIN_THRESHOLD = 0, //!< SDFM output is within threshold + SDFM_OUTPUT_ABOVE_THRESHOLD = 1, //!< SDFM output is above threshold + SDFM_OUTPUT_BELOW_THRESHOLD = 2 //!< SDFM output is below threshold +} SDFM_OutputThresholdStatus; + +//***************************************************************************** +// +//! Values that can be passed to all functions as the \e filterNumber +//! parameter. +// +//***************************************************************************** +typedef enum +{ + SDFM_FILTER_1 = 0, //!< Digital filter 1 + SDFM_FILTER_2 = 1, //!< Digital filter 2 + SDFM_FILTER_3 = 2, //!< Digital filter 3 + SDFM_FILTER_4 = 3 //!< Digital filter 4 +} SDFM_FilterNumber; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setFilterType(), +//! SDFM_setComparatorFilterType() as the \e filterType parameter. +// +//***************************************************************************** +typedef enum +{ + //! Digital filter with SincFast structure. + SDFM_FILTER_SINC_FAST = 0x00, + //! Digital filter with Sinc1 structure + SDFM_FILTER_SINC_1 = 0x10, + //! Digital filter with Sinc3 structure. + SDFM_FILTER_SINC_2 = 0x20, + //! Digital filter with Sinc4 structure. + SDFM_FILTER_SINC_3 = 0x30 +} SDFM_FilterType; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setupModulatorClock(),as the +//! \e clockMode parameter. +// +//***************************************************************************** +typedef enum +{ + //! Modulator clock is identical to the data rate + SDFM_MODULATOR_CLK_EQUAL_DATA_RATE = 0, + //! Modulator clock is half the data rate + SDFM_MODULATOR_CLK_HALF_DATA_RATE = 1, + //! Modulator clock is off. Data is Manchester coded. + SDFM_MODULATOR_CLK_OFF = 2, + //! Modulator clock is double the data rate. + SDFM_MODULATOR_CLK_DOUBLE_DATA_RATE = 3 +} SDFM_ModulatorClockMode; + +//***************************************************************************** +// +//! Values that can be passed to SDFM_setOutputDataFormat(),as the +//! \e dataFormat parameter. +// +//***************************************************************************** +typedef enum +{ + //! Filter output is in 16 bits 2's complement format. + SDFM_DATA_FORMAT_16_BIT = 0, + //! Filter output is in 32 bits 2's complement format. + SDFM_DATA_FORMAT_32_BIT = 1 +} SDFM_OutputDataFormat; + +//***************************************************************************** +// +// Values that can be passed to SDFM_enableInterrupt and SDFM_disableInterrupt +// as intFlags parameter +// +//***************************************************************************** +//! Interrupt is generated if Modulator fails. +//! +#define SDFM_MODULATOR_FAILURE_INTERRUPT 0x200U +//! Interrupt on Comparator low-level threshold. +//! +#define SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT 0x40U +//! Interrupt on Comparator high-level threshold. +//! +#define SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT 0x20U +//! Interrupt on Acknowledge flag +//! +#define SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT 0x1U + +//***************************************************************************** +// +// Values that can be passed to SDFM_clearInterruptFlag flags parameter +// +//***************************************************************************** +//! Main interrupt flag +//! +#define SDFM_MAIN_INTERRUPT_FLAG 0x80000000U +//! Filter 1 high -level threshold flag +//! +#define SDFM_FILTER_1_HIGH_THRESHOLD_FLAG 0x1U +//! Filter 1 low -level threshold flag +//! +#define SDFM_FILTER_1_LOW_THRESHOLD_FLAG 0x2U +//! Filter 2 high -level threshold flag +//! +#define SDFM_FILTER_2_HIGH_THRESHOLD_FLAG 0x4U +//! Filter 2 low -level threshold flag +//! +#define SDFM_FILTER_2_LOW_THRESHOLD_FLAG 0x8U +//! Filter 3 high -level threshold flag +//! +#define SDFM_FILTER_3_HIGH_THRESHOLD_FLAG 0x10U +//! Filter 3 low -level threshold flag +//! +#define SDFM_FILTER_3_LOW_THRESHOLD_FLAG 0x20U +//! Filter 4 high -level threshold flag +//! +#define SDFM_FILTER_4_HIGH_THRESHOLD_FLAG 0x40U +//! Filter 4 low -level threshold flag +//! +#define SDFM_FILTER_4_LOW_THRESHOLD_FLAG 0x80U +//! Filter 1 modulator failed flag +//! +#define SDFM_FILTER_1_MOD_FAILED_FLAG 0x100U +//! Filter 2 modulator failed flag +//! +#define SDFM_FILTER_2_MOD_FAILED_FLAG 0x200U +//! Filter 3 modulator failed flag +//! +#define SDFM_FILTER_3_MOD_FAILED_FLAG 0x400U +//! Filter 4 modulator failed flag +//! +#define SDFM_FILTER_4_MOD_FAILED_FLAG 0x800U +//! Filter 1 new data flag +//! +#define SDFM_FILTER_1_NEW_DATA_FLAG 0x1000U +//! Filter 2 new data flag +//! +#define SDFM_FILTER_2_NEW_DATA_FLAG 0x2000U +//! Filter 3 new data flag +//! +#define SDFM_FILTER_3_NEW_DATA_FLAG 0x4000U +//! Filter 4 new data flag +//! +#define SDFM_FILTER_4_NEW_DATA_FLAG 0x8000U + +//***************************************************************************** +// +//! \internal +//! Checks SDFM base address. +//! +//! \param base specifies the SDFM module base address. +//! +//! This function determines if SDFM module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SDFM_isBaseValid(uint32_t base) +{ + return( + (base == SDFM1_BASE) || + (base == SDFM2_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enable external reset +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function enables data filter to be reset by an external source (PWM +//! compare output). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set the SDSYNCEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) |= + SDFM_SDDFPARM1_SDSYNCEN; + EDIS; +} + +//***************************************************************************** +// +//! Disable external reset +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function disables data filter from being reset by an external source +//! (PWM compare output). +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_disableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear the SDSYNCEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) &= + ~SDFM_SDDFPARM1_SDSYNCEN; + EDIS; +} + +//***************************************************************************** +// +//! Enable filter +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function enables the filter specified by the \e filterNumber variable. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableFilter(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set the FEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) |= + SDFM_SDDFPARM1_FEN; + EDIS; +} + +//***************************************************************************** +// +//! Disable filter +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function disables the filter specified by the \e filterNumber +//! variable. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_disableFilter(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear the FEN bit + // + EALLOW; + HWREGH(base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U)) &= + ~SDFM_SDDFPARM1_FEN; + EDIS; +} + +//***************************************************************************** +// +//! Set filter type. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param filterType is the filter type or structure. +//! +//! This function sets the filter type or structure to be used as specified by +//! filterType for the selected filter number as specified by filterNumber. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setFilterType(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_FilterType filterType) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to SST bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDFPARM1_SST_M)) | + ((uint16_t)filterType << 6U); + EDIS; +} + +//***************************************************************************** +// +//! Set data filter over sampling ratio. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param overSamplingRatio is the data filter over sampling ratio. +//! +//! This function sets the filter oversampling ratio for the filter specified +//! by the filterNumber variable.Valid values for the variable +//! overSamplingRatio are 0 to 255 inclusive. The actual oversampling ratio +//! will be this value plus one. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setFilterOverSamplingRatio(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t overSamplingRatio) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(overSamplingRatio < 256U); + + address = base + SDFM_O_SDDFPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to DOSR bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDFPARM1_DOSR_M)) | + overSamplingRatio; + EDIS; +} + +//***************************************************************************** +// +//! Set modulator clock mode. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param clockMode is the modulator clock mode. +//! +//! This function sets the modulator clock mode specified by clockMode +//! for the filter specified by filterNumber. +//! +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setupModulatorClock(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_ModulatorClockMode clockMode) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDCTLPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to MOD bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCTLPARM1_MOD_M)) | + (uint16_t)clockMode; + + EDIS; +} + +//***************************************************************************** +// +//! Set the output data format +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param dataFormat is the output data format. +//! +//! This function sets the output data format for the filter specified by +//! filterNumber. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setOutputDataFormat(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_OutputDataFormat dataFormat) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDDPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to DR bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDPARM1_DR)) | + ((uint16_t)dataFormat << 10U); + EDIS; +} + +//***************************************************************************** +// +//! Set data shift value. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param shiftValue is the data shift value. +//! +//! This function sets the shift value for the 16 bit 2's complement data +//! format. The valid maximum value for shiftValue is 31. +//! +//! \b Note: Use this function with 16 bit 2's complement data format only. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setDataShiftValue(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t shiftValue) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(shiftValue < 32U); + + address = base + SDFM_O_SDDPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to SH bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDDPARM1_SH_M)) | + (shiftValue << SDFM_SDDPARM1_SH_S); + EDIS; +} + +//***************************************************************************** +// +//! Set Filter output high-level threshold. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param highThreshold is the high-level threshold. +//! +//! This function sets the unsigned high-level threshold value for the +//! Comparator filter output. If the output value of the filter exceeds +//! highThreshold and interrupt generation is enabled, an interrupt will be +//! issued. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setCompFilterHighThreshold(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t highThreshold) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(highThreshold < 0x7FFFU); + + address = base + SDFM_O_SDCMPH1 + ((uint32_t)filterNumber * 16U); + + // + // Write to HLT bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & ~SDFM_SDCMPH1_HLT_M) | highThreshold; + EDIS; +} + +//***************************************************************************** +// +//! Set Filter output low-level threshold. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param lowThreshold is the low-level threshold. +//! +//! This function sets the unsigned low-level threshold value for the +//! Comparator filter output. If the output value of the filter gets below +//! lowThreshold and interrupt generation is enabled, an interrupt will be +//! issued. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_setCompFilterLowThreshold(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t lowThreshold) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(lowThreshold < 0x7FFFU); + + address = base + SDFM_O_SDCMPL1 + ((uint32_t)filterNumber * 16U); + + // + // Write to LLT bit + // + EALLOW; + HWREGH(address) = (HWREGH(address) & ~SDFM_SDCMPL1_LLT_M) | lowThreshold; + EDIS; +} + +//***************************************************************************** +// +//! Enable SDFM interrupts. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param intFlags is the interrupt source. +//! +//! This function enables the low threshold , high threshold or modulator +//! failure interrupt as determined by intFlags for the filter specified +//! by filterNumber. +//! Valid values for intFlags are: +//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT, +//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_enableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t intFlags) +{ + uint16_t offset; + + ASSERT(SDFM_isBaseValid(base)); + + offset = (uint16_t)filterNumber * 16U; + + EALLOW; + + // + // Low, high threshold, Modulator failure + // + if((intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)) != 0U) + { + // + // Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx + // + HWREGH(base + SDFM_O_SDCPARM1 + offset) |= + (intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)); + } + + // + // Data filter acknowledge interrupt + // + if((intFlags & SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT) != 0U) + { + HWREGH(base + SDFM_O_SDDFPARM1 + offset) |= SDFM_SDDFPARM1_AE; + } + EDIS; +} + +//***************************************************************************** +// +//! Disable SDFM interrupts. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param intFlags is the interrupt source. +//! +//! This function disables the low threshold , high threshold or modulator +//! failure interrupt as determined by intFlags for the filter +//! specified by filterNumber. +//! Valid values for intFlags are: +//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT, +//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SDFM_disableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber, + uint16_t intFlags) +{ + uint16_t offset; + + ASSERT(SDFM_isBaseValid(base)); + + offset = (uint16_t)filterNumber * 16U; + + EALLOW; + + // + // Low, high threshold, modulator failure interrupts + // + if((intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)) != 0U) + { + // + // Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx + // + HWREGH(base + SDFM_O_SDCPARM1 + offset) &= + ~(intFlags & (SDFM_MODULATOR_FAILURE_INTERRUPT | + SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT | + SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT)); + } + + // + // Data filter acknowledge interrupt + // + if((intFlags & SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT) != 0U) + { + HWREGH(base + SDFM_O_SDDFPARM1 + offset) &= ~SDFM_SDDFPARM1_AE; + } + EDIS; +} + +//***************************************************************************** +// +//! Set the comparator filter type. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param filterType is the comparator filter type or structure. +//! +//! This function sets the Comparator filter type or structure to be used as +//! specified by filterType for the selected filter number as specified by +//! filterNumber. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setComparatorFilterType(uint32_t base, SDFM_FilterNumber filterNumber, + SDFM_FilterType filterType) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + + address = base + SDFM_O_SDCPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to CS1_CS0 bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCPARM1_CS1_CS0_M)) | + ((uint16_t)filterType << 3U); + EDIS; +} + +//***************************************************************************** +// +//! Set Comparator filter over sampling ratio. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! \param overSamplingRatio is the comparator filter over sampling ration. +//! +//! This function sets the comparator filter oversampling ratio for the filter +//! specified by the filterNumber.Valid values for the variable +//! overSamplingRatio are 0 to 31 inclusive. +//! The actual oversampling ratio will be this value plus one. +//! +//! \return None. +//***************************************************************************** +static inline void +SDFM_setCompFilterOverSamplingRatio(uint32_t base, + SDFM_FilterNumber filterNumber, + uint16_t overSamplingRatio) +{ + uint32_t address; + + ASSERT(SDFM_isBaseValid(base)); + ASSERT(overSamplingRatio < 32U); + + address = base + SDFM_O_SDCPARM1 + ((uint32_t)filterNumber * 16U); + + // + // Write to COSR bits + // + EALLOW; + HWREGH(address) = (HWREGH(address) & (~SDFM_SDCPARM1_COSR_M)) | + overSamplingRatio; + EDIS; +} + +//***************************************************************************** +// +//! Get the filter data output. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the latest data filter output. Depending on the +//! filter data output format selected, the valid value will be the lower 16 +//! bits or the whole 32 bits of the returned value. +//! +//! \return Returns the latest data filter output. +//***************************************************************************** +static inline uint32_t +SDFM_getFilterData(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDDATA bits + // + return(HWREG(base + SDFM_O_SDDATA1 + ((uint32_t)filterNumber * 16U))); +} + +//***************************************************************************** +// +//! Get the Comparator threshold status. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the Comparator output threshold status for the given +//! filterNumber. +//! +//! \return Returns the following status flags. +//! - \b SDFM_OUTPUT_WITHIN_THRESHOLD if the output is within the +//! specified threshold. +//! - \b SDFM_OUTPUT_ABOVE_THRESHOLD if the output is above the high +//! threshold +//! - \b SDFM_OUTPUT_BELOW_THRESHOLD if the output is below the low +//! threshold. +//! +//***************************************************************************** +static inline SDFM_OutputThresholdStatus +SDFM_getThresholdStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG high/low threshold bits + // + return((SDFM_OutputThresholdStatus)((HWREG(base + SDFM_O_SDIFLG) >> + (2U * (uint16_t)filterNumber)) & 0x3U)); +} + +//***************************************************************************** +// +//! Get the Modulator status. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns the Modulator status. +//! +//! \return Returns true if the Modulator is operating normally +//! Returns false if the Modulator has failed +//! +//***************************************************************************** +static inline bool +SDFM_getModulatorStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG MF1, MF2, MF3 OR MF4 bits + // + return(((HWREG(base + SDFM_O_SDIFLG) >> ((uint16_t)filterNumber + 8U)) & + 0x1U) != 0x1U); +} + +//***************************************************************************** +// +//! Check if new Filter data is available. +//! +//! \param base is the base address of the SDFM module +//! \param filterNumber is the filter number. +//! +//! This function returns new filter data status. +//! +//! \return Returns \b true if new filter data is available +//! Returns \b false if no new filter data is available +//! +//***************************************************************************** +static inline bool +SDFM_getNewFilterDataStatus(uint32_t base, SDFM_FilterNumber filterNumber) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG AF1, AF2, AF3 OR AF4 bits + // + return(((HWREG(base + SDFM_O_SDIFLG) >> ((uint16_t)filterNumber + 12U)) & + 0x1U) == 0x1U); +} + +//***************************************************************************** +// +//! Get pending interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function returns any pending interrupt status. +//! +//! \return Returns \b true if there is a pending interrupt. +//! Returns \b false if no interrupt is pending. +//! +//***************************************************************************** +static inline bool +SDFM_getIsrStatus(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Read SDIFLG MIF + // + return((HWREG(base + SDFM_O_SDIFLG) >> 31U) == 0x1U); +} + +//***************************************************************************** +// +//! Clear pending flags. +//! +//! \param base is the base address of the SDFM module +//! \param flag is the SDFM status +//! +//! This function clears the specified pending interrupt flag. +//! Valid values are +//! SDFM_MAIN_INTERRUPT_FLAG,SDFM_FILTER_1_NEW_DATA_FLAG, +//! SDFM_FILTER_2_NEW_DATA_FLAG,SDFM_FILTER_3_NEW_DATA_FLAG, +//! SDFM_FILTER_4_NEW_DATA_FLAG,SDFM_FILTER_1_MOD_FAILED_FLAG, +//! SDFM_FILTER_2_MOD_FAILED_FLAG,SDFM_FILTER_3_MOD_FAILED_FLAG, +//! SDFM_FILTER_4_MOD_FAILED_FLAG,SDFM_FILTER_1_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_1_LOW_THRESHOLD_FLAG,SDFM_FILTER_2_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_2_LOW_THRESHOLD_FLAG,SDFM_FILTER_3_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_3_LOW_THRESHOLD_FLAG,SDFM_FILTER_4_HIGH_THRESHOLD_FLAG, +//! SDFM_FILTER_4_LOW_THRESHOLD_FLAG or any combination of the above +//! flags. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_clearInterruptFlag(uint32_t base, uint32_t flag) +{ + ASSERT(SDFM_isBaseValid(base)); + ASSERT((flag & 0x8000FFFFU) == flag); + + // + // Write to SDIFLGCLR register + // + HWREG(base + SDFM_O_SDIFLGCLR) |= flag; +} + +//***************************************************************************** +// +//! Enable main interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function enables the main SDFM interrupt. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_enableMainInterrupt(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set SDCTL MIE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDCTL) |= SDFM_SDCTL_MIE; + EDIS; +} + +//***************************************************************************** +// +//! Disable main interrupt. +//! +//! \param base is the base address of the SDFM module +//! +//! This function disables the main SDFM interrupt. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_disableMainInterrupt(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear SDCTL MIE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDCTL) &= ~SDFM_SDCTL_MIE; + EDIS; +} + +//***************************************************************************** +// +//! Enable main filter. +//! +//! \param base is the base address of the SDFM module +//! +//! This function enables main filter. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_enableMainFilter(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Set SDMFILEN MFE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDMFILEN) |= SDFM_SDMFILEN_MFE; + EDIS; +} + +//***************************************************************************** +// +//! Disable main filter. +//! +//! \param base is the base address of the SDFM module +//! +//! This function disables main filter. +//! +//! \return None +//! +//***************************************************************************** +static inline void +SDFM_disableMainFilter(uint32_t base) +{ + ASSERT(SDFM_isBaseValid(base)); + + // + // Clear SDMFILEN MFE bit + // + EALLOW; + HWREGH(base + SDFM_O_SDMFILEN) &= ~SDFM_SDMFILEN_MFE; + EDIS; +} + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Configures SDFM comparator for filter config & threshold values +//! +//! \param base is the base address of the SDFM module +//! \param config1 is the filter number, filter type and over sampling ratio. +//! \param config2 is high-level and low-level threshold values. +//! +//! This function configures the comparator filter for filter config and +//! threshold values based on provided inputs. +//! +//! The config1 parameter is the logical OR of the filter number, filter type +//! and oversampling ratio. +//! The bit definitions for config1 are as follow: +//! - config1.[3:0] filter number +//! - config1.[7:4] filter type +//! - config1.[15:8] Over sampling Ratio +//! Valid values for filter number and filter type are defined in +//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively. +//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling +//! ratio ,which ranges [1,32] inclusive, in the appropriate bit location. +//! For example the value +//! (SDFM_FILTER_1 | SDFM_FILTER_SINC_2 | SDFM_SET_OSR(16)) +//! will select Filter 1, SINC 2 type with an oversampling ratio of 16. +//! +//! The config2 parameter is the logical OR of the filter high and low +//! threshold values. +//! The bit definitions for config2 are as follow: +//! - config2.[15:0] low threshold +//! - config2.[31:16] high threshold +//! The upper 16 bits define the high threshold and the lower +//! 16 bits define the low threshold. +//! SDFM_THRESHOLD(H,L) can be used to combine the high and low thresholds. +//! +//! \return None. +//! +//***************************************************************************** +extern void +SDFM_configComparator(uint32_t base, uint16_t config1, uint32_t config2); + +//***************************************************************************** +// +//! Configure SDFM data filter +//! +//! \param base is the base address of the SDFM module +//! \param config1 is the filter number, filter type and over sampling ratio +//! configuration. +//! \param config2 is filter switch, data representation and data shift values +//! configuration. +//! +//! This function configures the data filter based on configurations +//! config1 and config2. +//! +//! The config1 parameter is the logical OR of the filter number, filter type +//! and oversampling ratio. +//! The bit definitions for config1 are as follow: +//! - config1.[3:0] Filter number +//! - config1.[7:4] Filter type +//! - config1.[15:8] Over sampling Ratio +//! Valid values for filter number and filter type are defined in +//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively. +//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling +//! ratio , which ranges [1,256] inclusive , in the appropriate bit location +//! for config1. For example the value +//! (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(64)) +//! will select Filter 2 , SINC 3 type with an oversampling ratio of 64. +//! +//! The config2 parameter is the logical OR of data representation, filter +//! switch, and data shift values +//! The bit definitions for config2 are as follow: +//! - config2.[0] Data representation +//! - config2.[1] Filter switch +//! - config2.[15:2] Shift values +//! Valid values for data representation are given in SDFM_OutputDataFormat +//! enumeration. SDFM_FILTER_DISABLE or SDFM_FILTER_ENABLE will define the +//! filter switch values.SDFM_SHIFT_VALUE(X) macro can be used to set the value +//! of the data shift value,which ranges [0,31] inclusive, in the appropriate +//! bit location for config2. +//! The shift value is valid only in SDFM_DATA_FORMAT_16_BIT data +//! representation format. +//! +//! \return None. +//! +//***************************************************************************** +extern void +SDFM_configDataFilter(uint32_t base, uint16_t config1, uint16_t config2); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif +#endif // SDFM_H diff --git a/gpio_driverlib_cpu1/device/driverlib/spi.c b/gpio_driverlib_cpu1/device/driverlib/spi.c new file mode 100644 index 0000000..b077369 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/spi.c @@ -0,0 +1,661 @@ +//########################################################################### +// +// FILE: spi.c +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "spi.h" + +//***************************************************************************** +// +// SPI_setConfig +// +//***************************************************************************** +void +SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol, + SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth) +{ + uint16_t regValue; + uint32_t baud; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(bitRate <= (lspclkHz / 4U)); + ASSERT((lspclkHz / bitRate) <= 128U); + ASSERT((dataWidth >= 1U) && (dataWidth <= 16U)); + ASSERT((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPISWRESET) == 0U); + + // + // Set polarity and data width. + // + regValue = (((uint16_t)protocol << 6U) & SPI_CCR_CLKPOLARITY) | + (dataWidth - 1U); + + HWREGH(base + SPI_O_CCR) = (HWREGH(base + SPI_O_CCR) & + ~(SPI_CCR_CLKPOLARITY | SPI_CCR_SPICHAR_M)) | + regValue; + + // + // Set the mode and phase. + // + regValue = (uint16_t)mode | (((uint16_t)protocol << 2U) & + SPI_CTL_CLK_PHASE); + + HWREGH(base + SPI_O_CTL) = (HWREGH(base + SPI_O_CTL) & + ~(SPI_CTL_TALK | SPI_CTL_CONTROLLER_PERIPHERAL | + SPI_CTL_CLK_PHASE)) | regValue; + + // + // Set the clock. + // + baud = (lspclkHz / bitRate) - 1U; + HWREGH(base + SPI_O_BRR) = (uint16_t)baud; +} + +//***************************************************************************** +// +// SPI_setBaudRate +// +//***************************************************************************** +void +SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate) +{ + uint32_t baud; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(bitRate <= (lspclkHz / 4U)); + ASSERT((lspclkHz / bitRate) <= 128U); + + // + // Set the clock. + // + baud = (lspclkHz / bitRate) - 1U; + HWREGH(base + SPI_O_BRR) = (uint16_t)baud; +} + +//***************************************************************************** +// +// SPI_enableInterrupt +// +//***************************************************************************** +void +SPI_enableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Enable the specified non-FIFO interrupts. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CTL) |= SPI_CTL_SPIINTENA; + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_CTL) |= SPI_CTL_OVERRUNINTENA; + } + + // + // Enable the specified FIFO-mode interrupts. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFFIENA; + } + + if((intFlags & (SPI_INT_RXFF | SPI_INT_RXFF_OVERFLOW)) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFIENA; + } +} + +//***************************************************************************** +// +// SPI_disableInterrupt +// +//***************************************************************************** +void +SPI_disableInterrupt(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Disable the specified non-FIFO interrupts. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CTL) &= ~(SPI_CTL_SPIINTENA); + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_CTL) &= ~(SPI_CTL_OVERRUNINTENA); + } + + // + // Disable the specified FIFO-mode interrupts. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) &= ~(SPI_FFTX_TXFFIENA); + } + + if((intFlags & (SPI_INT_RXFF | SPI_INT_RXFF_OVERFLOW)) != 0U) + { + HWREGH(base + SPI_O_FFRX) &= ~(SPI_FFRX_RXFFIENA); + } +} + +//***************************************************************************** +// +// SPI_getInterruptStatus +// +//***************************************************************************** +uint32_t +SPI_getInterruptStatus(uint32_t base) +{ + uint32_t temp = 0; + + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + if((HWREGH(base + SPI_O_STS) & SPI_STS_INT_FLAG) != 0U) + { + temp |= SPI_INT_RX_DATA_TX_EMPTY; + } + + if((HWREGH(base + SPI_O_STS) & SPI_STS_OVERRUN_FLAG) != 0U) + { + temp |= SPI_INT_RX_OVERRUN; + } + + if((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFINT) != 0U) + { + temp |= SPI_INT_TXFF; + } + + if((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFINT) != 0U) + { + temp |= SPI_INT_RXFF; + } + + if((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFOVF) != 0U) + { + temp |= SPI_INT_RXFF_OVERFLOW; + } + + return(temp); +} + +//***************************************************************************** +// +// SPI_clearInterruptStatus +// +//***************************************************************************** +void +SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the specified non-FIFO interrupt sources. + // + if((intFlags & SPI_INT_RX_DATA_TX_EMPTY) != 0U) + { + HWREGH(base + SPI_O_CCR) &= ~(SPI_CCR_SPISWRESET); + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPISWRESET; + } + + if((intFlags & SPI_INT_RX_OVERRUN) != 0U) + { + HWREGH(base + SPI_O_STS) |= SPI_STS_OVERRUN_FLAG; + } + + // + // Clear the specified FIFO-mode interrupt sources. + // + if((intFlags & SPI_INT_TXFF) != 0U) + { + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFFINTCLR; + } + + if((intFlags & SPI_INT_RXFF) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFINTCLR; + } + + if((intFlags & SPI_INT_RXFF_OVERFLOW) != 0U) + { + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFOVFCLR; + } +} +//***************************************************************************** +// +// SPI_pollingNonFIFOTransaction +// +//***************************************************************************** +uint16_t +SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength, uint16_t data) +{ + uint16_t rxData; + + ASSERT(((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPICHAR_M) + 1U) == charLength); + ASSERT(data < ((uint32_t)1U << charLength)); + + // + // Write to SPI Transmit buffer + // + SPI_writeDataBlockingNonFIFO(base, data << (16U - charLength)); + + // + // Read SPI Receive buffer + // + rxData = SPI_readDataBlockingNonFIFO(base); + + return(rxData); +} +//***************************************************************************** +// +// SPI_pollingFIFOTransaction +// +//***************************************************************************** + +void +SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t *pTxBuffer, uint16_t *pRxBuffer, + uint16_t numOfWords, uint16_t txDelay) +{ + ASSERT(((HWREGH(base + SPI_O_CCR) & SPI_CCR_SPICHAR_M) + 1U) == charLength); + + // + // Reset the TX / RX FIFO buffers to default state + // + SPI_disableFIFO(base); // Disable FIFO register + SPI_enableFIFO(base); // Enable FIFO register + + // + // Configure the FIFO Transmit Delay + // + SPI_setTxFifoTransmitDelay(base, txDelay); + + // + // Determine the number of 16-level words from number of words to be + // transmitted / received + // + uint16_t numOfSixteenWords = numOfWords / (uint16_t)SPI_FIFO_TXFULL; + + // + // Determine the number of remaining words from number of words to be + // transmitted / received + // + uint16_t remainingWords = numOfWords % (uint16_t)SPI_FIFO_TXFULL; + + uint16_t count = 0; + uint16_t i = 0; + uint16_t txBuffer_pos = 0; + uint16_t rxBuffer_pos = 0; + + // + // Number of transactions is based on numOfSixteenWords + // Each transaction will transmit and receive 16 words. + // + while(count < numOfSixteenWords) + { + // + // Fill-up the SPI Transmit FIFO buffers + // + for(i = 1; i <= (uint16_t)SPI_FIFO_TXFULL; i++) + { + SPI_writeDataBlockingFIFO(base, pTxBuffer[txBuffer_pos] << + (16U - charLength)); + txBuffer_pos++; + } + + // + // Wait till SPI Receive FIFO buffer is full + // + while(SPI_getRxFIFOStatus(base) < SPI_FIFO_RXFULL) + { + } + + // + // Read the SPI Receive FIFO buffers + // + for(i = 1U; i <= (uint16_t)SPI_FIFO_RXFULL; i++) + { + if(pRxBuffer == NULL) + { + SPI_readDataBlockingFIFO(base); + } + else + { + pRxBuffer[rxBuffer_pos] = SPI_readDataBlockingFIFO(base); + rxBuffer_pos++; + } + } + + count++; + } + + // + // Number of transactions is based on remainingWords + // + for(i = 0U; i < remainingWords; i++) + { + SPI_writeDataBlockingFIFO(base, pTxBuffer[txBuffer_pos] << + (16U - charLength)); + txBuffer_pos++; + } + + // + // Wait till SPI Receive FIFO buffer remaining words + // + while((uint16_t)SPI_getRxFIFOStatus(base) < remainingWords) + { + } + + // + // Read the SPI Receive FIFO buffers + // + for(i = 0; i < remainingWords; i++) + { + if(pRxBuffer == NULL) + { + SPI_readDataBlockingFIFO(base); + } + else + { + pRxBuffer[rxBuffer_pos] = SPI_readDataBlockingFIFO(base); + rxBuffer_pos++; + } + } + + // + // Disable SPI FIFO + // + SPI_disableFIFO(base); +} + +//***************************************************************************** +// +// SPI_transmit24Bits +// +//***************************************************************************** +void +SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay) +{ + uint16_t i; + uint16_t rxBuffer[3]; + uint16_t txBuffer[3]; + + ASSERT(data < ((uint32_t)1U << 24U)); + + // + // Empty Receive buffer + // + for(i = 0U; i < 3U; i++) + { + rxBuffer[i] = 0U; + } + + // + // Fill Transmit buffer with appropriate data + // + txBuffer[0] = (uint16_t)(data >> 16U); // data[23:16] + txBuffer[1] = (uint16_t)(data) >> 8U; // data[15:8] + txBuffer[2] = (uint16_t)(data) & 0x00FFU; // data[7:0] + + // + // Three 8-bits make a 24-bit + // Character length = 8 + // number of bytes = 3 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 3U, txDelay); +} +//***************************************************************************** +// +// SPI_receive16Bits +// +//***************************************************************************** + +uint16_t +SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[2]; + uint16_t rxBuffer[2]; + uint16_t rxData = 0U; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 2U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 2U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = (rxBuffer[1] << 8) | rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = (rxBuffer[0] << 8) | rxBuffer[1]; + } + + return(rxData); +} +//***************************************************************************** +// +// SPI_receive24Bits +// +//***************************************************************************** + +uint32_t +SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[3]; + uint16_t rxBuffer[3]; + uint32_t rxData = 0; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 3U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // Two 8-bits make a 16-bit + // Character length = 8 + // number of bytes = 2 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 3U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = ((uint32_t)rxBuffer[2] << 16) | + ((uint32_t)rxBuffer[1] << 8) | + (uint32_t)rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = ((uint32_t)rxBuffer[0] << 16) | + ((uint32_t)rxBuffer[1] << 8) | + (uint32_t)rxBuffer[2]; + } + + return(rxData); +} +//***************************************************************************** +// +// SPI_transmit32Bits +// +//***************************************************************************** + +void +SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[2]; + uint16_t rxBuffer[2]; + + // + // Empty Receive buffer + // + for(i = 0U; i < 2U; i++) + { + rxBuffer[i] = 0U; + } + + // + // Fill Transmit buffer with appropriate data + // + txBuffer[0] = (uint16_t)(data >> 16U); // data[31:16] + txBuffer[1] = (uint16_t)(data); // data[15:0] + + // + // Two 16-bits make a 32-bit + // Character length = 16 + // number of bytes = 2 + // + SPI_pollingFIFOTransaction(base, 16U, txBuffer, rxBuffer, 2U, txDelay); +} +//***************************************************************************** +// +// SPI_receive32Bits +// +//***************************************************************************** + +uint32_t +SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay) +{ + uint16_t i; + uint16_t txBuffer[4]; + uint16_t rxBuffer[4]; + uint32_t rxData = 0U; + + ASSERT(dummyData <= 0xFFU); + + // + // Empty Transmit buffer + // + for(i = 0U; i < 4U; i++) + { + txBuffer[i] = dummyData; + rxBuffer[i] = 0U; + } + + // + // Send dummy words to receive data from peripheral + // Four 8-bits make a 32-bit + // Character length = 8 + // number of bytes = 4 + // + SPI_pollingFIFOTransaction(base, 8U, txBuffer, rxBuffer, 4U, txDelay); + + if(endianness == SPI_DATA_LITTLE_ENDIAN) + { + // + // LITTLE_ENDIAN + // + rxData = ((uint32_t)rxBuffer[3] << 24U) | + ((uint32_t)rxBuffer[2] << 16U) | + ((uint32_t)rxBuffer[1] << 8U) | + (uint32_t)rxBuffer[0]; + } + else + { + // + // BIG_ENDIAN + // + rxData = ((uint32_t)rxBuffer[0] << 24U) | + ((uint32_t)rxBuffer[1] << 16U) | + ((uint32_t)rxBuffer[2] << 8U) | + (uint32_t)rxBuffer[3]; + } + + return(rxData); +} diff --git a/gpio_driverlib_cpu1/device/driverlib/spi.h b/gpio_driverlib_cpu1/device/driverlib/spi.h new file mode 100644 index 0000000..b9e0d38 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/spi.h @@ -0,0 +1,1743 @@ +//########################################################################### +// +// FILE: spi.h +// +// TITLE: C28x SPI driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SPI_H +#define SPI_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup spi_api SPI +//! \brief This module is used for SPI configurations. +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_spi.h" +#include "debug.h" +#include "hw_reg_inclusive_terminology.h" + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// Values that can be passed to SPI_enableInterrupt(), SPI_disableInterrupt(), +// and SPI_clearInterruptStatus() as the intFlags parameter, and returned by +// SPI_getInterruptStatus(). +// +//***************************************************************************** +#define SPI_INT_RX_OVERRUN 0x0001U //!< Receive overrun interrupt +#define SPI_INT_RX_DATA_TX_EMPTY 0x0002U //!< Data received, transmit empty +#define SPI_INT_RXFF 0x0004U //!< RX FIFO level interrupt +#define SPI_INT_TXFF 0x0008U //!< TX FIFO level interrupt +#define SPI_INT_RXFF_OVERFLOW 0x0010U //!< RX FIFO overflow +#endif + + +//***************************************************************************** +// +//! This macro definition is used to transmit a byte of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! +//! This macro definition is to transmit a byte of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitByte(base, txData) \ + SPI_pollingNonFIFOTransaction(base, 8U, txData) + +//***************************************************************************** +// +//! This macro definition is used to transmit a 16-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! +//! This macro definition is to transmit a 16-bit word of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmit16Bits(base, txData) \ + SPI_pollingNonFIFOTransaction(base, 16U, txData) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' bytes of data +//! +//! \param base specifies the SPI module base address. +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of bytes to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This macro definition can be used to transmit 'N' bytes of data. +//! This macro definition uses SPI_pollingFIFOTransaction function. +//! +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitNBytes(base, txBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 8U, txBuffer, NULL, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' 16-bit words of data +//! +//! \param base specifies the SPI module base address. +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of 16-bit word to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit 'N' 16-bit words of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitN16BitWord(base, txBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 16U, txBuffer, NULL, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition can be used to transmit 'N' with previously +//! configured SPI character length +//! +//! \param base specifies the SPI module base address +//! \param charLength specifies the SPI character length +//! \param txBuffer is the transmit buffer to be transmitted over SPI +//! \param numOfWords is the number of 16-bit word to be transmitted +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This macro definition can be used to transmit 'N' with configurable +//! SPI character length. +//! +//! This macro uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to required value BEFORE calling +//! the function, and passed as the charLength parameter. +//! +//! \return None. +// +//***************************************************************************** +#define SPI_transmitNWordsWithCharLength(base, charLength, txBuffer, \ + numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, charLength, txBuffer, NULL, \ + numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro definition is used to receive a byte of data +//! +//! \param base specifies the SPI module base address. +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! +//! This macro definition is to receive a byte of data. +//! This macro uses SPI_pollingNonFIFOTransaction function +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received byte. +// +//***************************************************************************** +#define SPI_receiveByte(base, dummyData) \ + SPI_pollingNonFIFOTransaction(base, 8U, dummyData) + +//***************************************************************************** +// +//! This macro is used to receive 'N' bytes of data +//! +//! \param base specifies the SPI module base address. +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of bytes to be received +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' bytes of data +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveNBytes(base, rxBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 8U, NULL, rxBuffer, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro is used to receive 'N' 16-bits words of data +//! +//! \param base specifies the SPI module base address. +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of 16-bit words to be received +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' 16-bit words of data +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveN16BitWord(base, rxBuffer, numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, 16U, NULL, rxBuffer, numOfWords, txDelay) + +//***************************************************************************** +// +//! This macro is used to receive 'N' words with previously configured character +//! length +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param rxBuffer specifies receive buffer which will store the received bytes +//! \param numOfWords specifies the number of words with specified character +//! length +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive 'N' words with specified character length +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to required value BEFORE calling +//! the function, and passed as the charLength parameter. +//! +//! \return None. +// +//***************************************************************************** +#define SPI_receiveNWordsWithcharLength(base, charLength, rxBuffer, \ + numOfWords, txDelay) \ + SPI_pollingFIFOTransaction(base, charLength, NULL, rxBuffer, \ + numOfWords, txDelay) + +//***************************************************************************** +// +//! Values that can be passed to SPI_setConfig() as the \e protocol parameter. +// +//***************************************************************************** +typedef enum +{ + //! Mode 0. Polarity 0, phase 0. Rising edge without delay. + SPI_PROT_POL0PHA0 = 0x0000U, + //! Mode 1. Polarity 0, phase 1. Rising edge with delay. + SPI_PROT_POL0PHA1 = 0x0002U, + //! Mode 2. Polarity 1, phase 0. Falling edge without delay. + SPI_PROT_POL1PHA0 = 0x0001U, + //! Mode 3. Polarity 1, phase 1. Falling edge with delay. + SPI_PROT_POL1PHA1 = 0x0003U +} SPI_TransferProtocol; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setConfig() as the \e mode parameter. +// +//***************************************************************************** +typedef enum +{ + SPI_MODE_PERIPHERAL = 0x0002U, //!< SPI peripheral + SPI_MODE_CONTROLLER = 0x0006U, //!< SPI controller + SPI_MODE_PERIPHERAL_OD = 0x0000U, //!< SPI peripheral w/ output disabled + SPI_MODE_CONTROLLER_OD = 0x0004U //!< SPI controller w/ output disabled +} SPI_Mode; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e txLevel +//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e txLevel +//! parameter, and returned by SPI_getTxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SPI_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty + SPI_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty + SPI_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full + SPI_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full + SPI_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full + SPI_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full + SPI_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full + SPI_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full + SPI_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full + SPI_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full + SPI_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full + SPI_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full + SPI_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full + SPI_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full + SPI_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full + SPI_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full + SPI_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full + SPI_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full + SPI_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full +} SPI_TxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e rxLevel +//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e rxLevel +//! parameter, and returned by SPI_getRxFIFOStatus(). +// +//***************************************************************************** +typedef enum +{ + SPI_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty + SPI_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty + SPI_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full + SPI_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full + SPI_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full + SPI_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full + SPI_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full + SPI_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full + SPI_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full + SPI_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full + SPI_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full + SPI_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full + SPI_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full + SPI_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full + SPI_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full + SPI_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full + SPI_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full + SPI_FIFO_RX16 = 0x0010U, //!< Receive FIFO full + SPI_FIFO_RXFULL = 0x0010U, //!< Receive FIFO full + SPI_FIFO_RXDEFAULT = 0x001FU //!< To prevent interrupt at reset +} SPI_RxFIFOLevel; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setEmulationMode() as the \e mode +//! parameter. +// +//***************************************************************************** +typedef enum +{ + //! Transmission stops after midway in the bit stream + SPI_EMULATION_STOP_MIDWAY = 0x0000U, + //! Continue SPI operation regardless + SPI_EMULATION_FREE_RUN = 0x0010U, + //! Transmission will stop after a started transmission completes + SPI_EMULATION_STOP_AFTER_TRANSMIT = 0x0020U +} SPI_EmulationMode; + +//***************************************************************************** +// +//! Values that can be passed to SPI_setPTESignalPolarity() as the \e polarity +//! parameter. +// +//***************************************************************************** +typedef enum +{ + SPI_PTE_ACTIVE_LOW = 0x0000U, //!< SPIPTE is active low (normal) + SPI_PTE_ACTIVE_HIGH = SPI_PRI_PTEINV //!< SPIPTE is active high (inverted) +} SPI_PTEPolarity; + +//***************************************************************************** +// +//! Values that can be passed to SPI_receive16Bits(), SPI_receive24Bits(), +//! SPI_receive32Bits() +// +//***************************************************************************** +typedef enum +{ + SPI_DATA_LITTLE_ENDIAN = 0U, //!< LITTLE ENDIAN + SPI_DATA_BIG_ENDIAN = 1U, //!< BIG ENDIAN +} SPI_endianess; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! \internal +//! Checks an SPI base address. +//! +//! \param base specifies the SPI module base address. +//! +//! This function determines if a SPI module base address is valid. +//! +//! \return Returns \b true if the base address is valid and \b false +//! otherwise. +// +//***************************************************************************** +#ifdef DEBUG +static inline bool +SPI_isBaseValid(uint32_t base) +{ + return( + (base == SPIA_BASE) || + (base == SPIB_BASE) || + (base == SPIC_BASE) + ); +} +#endif + +//***************************************************************************** +// +//! Enables the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! +//! This function enables operation of the serial peripheral interface. The +//! serial peripheral interface must be configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPISWRESET; +} + +//***************************************************************************** +// +//! Disables the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! +//! This function disables operation of the serial peripheral interface. Call +//! this function before doing any configuration. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableModule(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + HWREGH(base + SPI_O_CCR) &= ~(SPI_CCR_SPISWRESET); +} + +//***************************************************************************** +// +//! Sets the character length of SPI transaction +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the character length of SPI transaction +//! +//! This function configures the character length of SPI transaction. +//! SPI character length can be from anywhere between 1-bit word to 16 bit word +//! of character length +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setcharLength(uint32_t base, uint16_t charLength) +{ + // + // Check the arguments. + // + ASSERT((charLength >= 1U) && (charLength <= 16U)); + + bool originalStatus = ((HWREGH(base + SPI_O_CCR) & (SPI_CCR_SPISWRESET)) + == SPI_CCR_SPISWRESET ); + + SPI_disableModule(base); + HWREGH(base + SPI_O_CCR) = (HWREGH(base + SPI_O_CCR) & ~SPI_CCR_SPICHAR_M) | + (charLength - 1U); + // + // Restore original status + // + if(originalStatus){ + SPI_enableModule(base); + } +} + + +//***************************************************************************** +// +//! Enables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SPI port. +//! +//! This functions enables the transmit and receive FIFOs in the SPI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Enable the FIFO. + // + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO; + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Disables the transmit and receive FIFOs. +//! +//! \param base is the base address of the SPI port. +//! +//! This functions disables the transmit and receive FIFOs in the SPI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Disable the FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~(SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO); + HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Resets the transmit FIFO. +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the transmit FIFO, setting the FIFO pointer back to +//! zero. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_resetTxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Reset the TX FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_TXFIFO; + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFIFO; +} + +//***************************************************************************** +// +//! Resets the receive FIFO. +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the receive FIFO, setting the FIFO pointer back to +//! zero. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_resetRxFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Reset the RX FIFO. + // + HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; + HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; +} + +//***************************************************************************** +// +//! Sets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the SPI port. +//! \param txLevel is the transmit FIFO interrupt level, specified as +//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, . . . or +//! \b SPI_FIFO_TX16. +//! \param rxLevel is the receive FIFO interrupt level, specified as +//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, . . . or +//! \b SPI_FIFO_RX16. +//! +//! This function sets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel txLevel, + SPI_RxFIFOLevel rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the FIFO interrupt levels. + // + HWREGH(base + SPI_O_FFTX) = (HWREGH(base + SPI_O_FFTX) & + (~SPI_FFTX_TXFFIL_M)) | (uint16_t)txLevel; + HWREGH(base + SPI_O_FFRX) = (HWREGH(base + SPI_O_FFRX) & + (~SPI_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; +} + +//***************************************************************************** +// +//! Gets the FIFO level at which interrupts are generated. +//! +//! \param base is the base address of the SPI port. +//! \param txLevel is a pointer to storage for the transmit FIFO level, +//! returned as one of \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, +//! \b SPI_FIFO_TX2, . . . or \b SPI_FIFO_TX16. +//! \param rxLevel is a pointer to storage for the receive FIFO level, +//! returned as one of \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, +//! \b SPI_FIFO_RX2, . . . or \b SPI_FIFO_RX16. +//! +//! This function gets the FIFO level at which transmit and receive interrupts +//! are generated. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_getFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel *txLevel, + SPI_RxFIFOLevel *rxLevel) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Extract the transmit and receive FIFO levels. + // + *txLevel = (SPI_TxFIFOLevel)((uint16_t)(HWREGH(base + SPI_O_FFTX) & + SPI_FFTX_TXFFIL_M)); + *rxLevel = (SPI_RxFIFOLevel)((uint16_t)(HWREGH(base + SPI_O_FFRX) & + SPI_FFRX_RXFFIL_M)); +} + +//***************************************************************************** +// +//! Get the transmit FIFO status +//! +//! \param base is the base address of the SPI port. +//! +//! This function gets the current number of words in the transmit FIFO. +//! +//! \return Returns the current number of words in the transmit FIFO specified +//! as one of the following: +//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, \b SPI_FIFO_TX3, +//! ..., or \b SPI_FIFO_TX16 +// +//***************************************************************************** +static inline SPI_TxFIFOLevel +SPI_getTxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SPI_TxFIFOLevel)((uint16_t)((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) >> + SPI_FFTX_TXFFST_S))); +} + +//***************************************************************************** +// +//! Get the receive FIFO status +//! +//! \param base is the base address of the SPI port. +//! +//! This function gets the current number of words in the receive FIFO. +//! +//! \return Returns the current number of words in the receive FIFO specified +//! as one of the following: +//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, \b SPI_FIFO_RX3, +//! ..., or \b SPI_FIFO_RX16 +// +//***************************************************************************** +static inline SPI_RxFIFOLevel +SPI_getRxFIFOStatus(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Get the current FIFO status + // + return((SPI_RxFIFOLevel)((uint16_t)((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFST_M) >> + SPI_FFRX_RXFFST_S))); +} + +//***************************************************************************** +// +//! Determines whether the SPI transmitter is busy or not. +//! +//! \param base is the base address of the SPI port. +//! +//! This function allows the caller to determine whether all transmitted bytes +//! have cleared the transmitter hardware. If \b false is returned, then the +//! transmit FIFO is empty and all bits of the last transmitted word have left +//! the hardware shift register. This function is only valid when operating in +//! FIFO mode. +//! +//! \return Returns \b true if the SPI is transmitting or \b false if all +//! transmissions are complete. +// +//***************************************************************************** +static inline bool +SPI_isBusy(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Determine if the SPI is busy. + // + return((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) != 0U); +} + +//***************************************************************************** +// +//! Puts a data element into the SPI transmit buffer. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataNonBlocking(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Gets a data element from the SPI receive buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function gets received data from the receive buffer of the specified +//! SPI module and returns it. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataNonBlocking(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Waits for space in the FIFO and then puts data into the transmit buffer. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module once space is available in the transmit FIFO. This +//! function should only be used when the FIFO is enabled. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until space is available in the receive FIFO. + // + while(SPI_getTxFIFOStatus(base) == SPI_FIFO_TXFULL) + { + } + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits for data in the FIFO and then reads it from the receive buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function waits until there is data in the receive FIFO and then reads +//! received data from the receive buffer. This function should only be used +//! when FIFO mode is enabled. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataBlockingFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until data is available in the receive FIFO. + // + while(SPI_getRxFIFOStatus(base) == SPI_FIFO_RXEMPTY) + { + } + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Waits for the transmit buffer to empty and then writes data to it. +//! +//! \param base specifies the SPI module base address. +//! \param data is the left-justified data to be transmitted over SPI. +//! +//! This function places the supplied data into the transmit buffer of the +//! specified SPI module once it is empty. This function should not be used +//! when FIFO mode is enabled. +//! +//! \note The data being sent must be left-justified in \e data. The lower +//! 16 - N bits will be discarded where N is the data width selected in +//! SPI_setConfig(). For example, if configured for a 6-bit data width, the +//! lower 10 bits of data will be discarded. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_writeDataBlockingNonFIFO(uint32_t base, uint16_t data) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until the transmit buffer is not full. + // + while((HWREGH(base + SPI_O_STS) & SPI_STS_BUFFULL_FLAG) != 0U) + { + } + + // + // Write data to the transmit buffer. + // + HWREGH(base + SPI_O_TXBUF) = data; +} + +//***************************************************************************** +// +//! Waits for data to be received and then reads it from the buffer. +//! +//! \param base specifies the SPI module base address. +//! +//! This function waits for data to be received and then reads it from the +//! receive buffer of the specified SPI module. This function should not be +//! used when FIFO mode is enabled. +//! +//! \note Only the lower N bits of the value written to \e data contain valid +//! data, where N is the data width as configured by SPI_setConfig(). For +//! example, if the interface is configured for 8-bit data width, only the +//! lower 8 bits of the value written to \e data contain valid data. +//! +//! \return Returns the word of data read from the SPI receive buffer. +// +//***************************************************************************** +static inline uint16_t +SPI_readDataBlockingNonFIFO(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Wait until data has been received. + // + while((HWREGH(base + SPI_O_STS) & SPI_STS_INT_FLAG) == 0U) + { + } + + // + // Check for data to read. + // + return(HWREGH(base + SPI_O_RXBUF)); +} + +//***************************************************************************** +// +//! Enables SPI 3-wire mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables 3-wire mode. When in controller mode, this allows +//! SPIPICO to become SPICOCI and SPIPOCI to become free for non-SPI use. +//! When in peripheral mode, SPIPOCI because the SPIPIPO pin and SPIPICO is +//! free for non-SPI use. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableTriWire(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the tri-wire bit to enable 3-wire mode. + // + HWREGH(base + SPI_O_PRI) |= SPI_PRI_TRIWIRE; +} + +//***************************************************************************** +// +//! Disables SPI 3-wire mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables 3-wire mode. SPI will operate in normal 4-wire mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableTriWire(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the tri-wire bit to disable 3-wire mode. + // + HWREGH(base + SPI_O_PRI) &= ~SPI_PRI_TRIWIRE; +} + +//***************************************************************************** +// +//! Enables SPI loopback mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables loopback mode. This mode is only valid during +//! controller mode and is helpful during device testing as it internally +//! connects PICO and POCI. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the bit that enables loopback mode. + // + HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPILBK; +} + +//***************************************************************************** +// +//! Disables SPI loopback mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables loopback mode. Loopback mode is disabled by default +//! after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableLoopback(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the bit that enables loopback mode. + // + HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_SPILBK; +} + +//***************************************************************************** +// +//! Set the peripheral select (SPIPTE) signal polarity. +//! +//! \param base is the base address of the SPI port. +//! \param polarity is the SPIPTE signal polarity. +//! +//! This function sets the polarity of the peripheral select (SPIPTE) signal. +//! The two modes to choose from for the \e polarity parameter are +//! \b SPI_PTE_ACTIVE_LOW for active-low polarity (typical) and +//! \b SPI_PTE_ACTIVE_HIGH for active-high polarity (considered inverted). +//! +//! \note This has no effect on the PTE signal when in controller mode. It is +//! only applicable to peripheral mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setPTESignalPolarity(uint32_t base, SPI_PTEPolarity polarity) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write the polarity of the SPIPTE signal to the register. + // + HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & ~SPI_PRI_PTEINV) | + (uint16_t)polarity; +} + +//***************************************************************************** +// +//! Enables SPI high speed mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function enables high speed mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_enableHighSpeedMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the bit that enables high speed mode. + // + HWREGH(base + SPI_O_CCR) |= SPI_CCR_HS_MODE; +} + +//***************************************************************************** +// +//! Disables SPI high speed mode. +//! +//! \param base is the base address of the SPI port. +//! +//! This function disables high speed mode. High speed mode is disabled by +//! default after reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_disableHighSpeedMode(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Clear the bit that enables high speed mode. + // + HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_HS_MODE; +} + +//***************************************************************************** +// +//! Sets SPI emulation mode. +//! +//! \param base is the base address of the SPI port. +//! \param mode is the emulation mode. +//! +//! This function sets the behavior of the SPI operation when an emulation +//! suspend occurs. The \e mode parameter can be one of the following: +//! +//! - \b SPI_EMULATION_STOP_MIDWAY - Transmission stops midway through the bit +//! stream. The rest of the bits will be transmitting after the suspend is +//! deasserted. +//! - \b SPI_EMULATION_STOP_AFTER_TRANSMIT - If the suspend occurs before the +//! first SPICLK pulse, the transmission will not start. If it occurs later, +//! the transmission will be completed. +//! - \b SPI_EMULATION_FREE_RUN - SPI operation continues regardless of a +//! the suspend. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SPI_setEmulationMode(uint32_t base, SPI_EmulationMode mode) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write the desired emulation mode to the register. + // + HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & + ~(SPI_PRI_FREE | SPI_PRI_SOFT)) | + (uint16_t)mode; +} + +//***************************************************************************** +// +//! Configures the FIFO Transmit Delay +//! +//! \param base is the base address of the SPI port. +//! \param delay Tx FIFO delay to be configured in cycles (0..0xFF) +//! +//! This function sets the delay between every transfer from FIFO +//! transmit buffer to transmit shift register. The delay is defined in +//! number SPI serial clock cycles. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_setTxFifoTransmitDelay(uint32_t base, uint16_t delay) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + ASSERT(delay <= 0xFFU); + + // + // Configure the FIFO Transmit Delay Bits + // + HWREGH(base + SPI_O_FFCT) = delay; +} + +//***************************************************************************** +// +//! Returns the Emulation Buffer Received Data +//! +//! \param base is the base address of the SPI port. +//! +//! This function returns the Emulation Buffer Received Data +//! +//! \return Rx emulation buffer data +// +//***************************************************************************** +static inline uint16_t +SPI_readRxEmulationBuffer(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Return Emulation Buffer Received Data + // + return(HWREGH(base + SPI_O_RXEMU)); +} + +//***************************************************************************** +// +//! Enable Trasnmit +//! +//! \param base is the base address of the SPI port. +//! +//! This function sets the TALK bit enabling the data trasnmission. +//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as +//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_enableTalk(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the TALK bit + // + HWREGH(base + SPI_O_CTL) |= SPI_CTL_TALK; +} + +//***************************************************************************** +// +//! Disable Trasnmit +//! +//! \param base is the base address of the SPI port. +//! +//! This function clears the TALK bit disabling the data trasnmission. The +//! output pin will be put in high-impedance state. +//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as +//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_disableTalk(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Set the TALK bit + // + HWREGH(base + SPI_O_CTL) &= ~SPI_CTL_TALK; +} + +//***************************************************************************** +// +//! Reset SPI transmit and receive channels +//! +//! \param base is the base address of the SPI port. +//! +//! This function resets the SPI transmit and receive channels. +//! +//! \return None +// +//***************************************************************************** +static inline void +SPI_reset(uint32_t base) +{ + // + // Check the arguments. + // + ASSERT(SPI_isBaseValid(base)); + + // + // Write to SPRST bit the TX FIFO. + // + HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_SPIRST; + HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIRST; +} + +//***************************************************************************** +// +//! Configures the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! \param lspclkHz is the rate of the clock supplied to the SPI module +//! (LSPCLK) in Hz. +//! \param protocol specifies the data transfer protocol. +//! \param mode specifies the mode of operation. +//! \param bitRate specifies the clock rate in Hz. +//! \param dataWidth specifies number of bits transferred per frame. +//! +//! This function configures the serial peripheral interface. It sets the SPI +//! protocol, mode of operation, bit rate, and data width. +//! +//! The \e protocol parameter defines the data frame format. The \e protocol +//! parameter can be one of the following values: \b SPI_PROT_POL0PHA0, +//! \b SPI_PROT_POL0PHA1, \b SPI_PROT_POL1PHA0, or +//! \b SPI_PROT_POL1PHA1. These frame formats encode the following polarity +//! and phase configurations: +//! +//!

    +//! Polarity Phase       Mode
    +//!   0       0   SPI_PROT_POL0PHA0
    +//!   0       1   SPI_PROT_POL0PHA1
    +//!   1       0   SPI_PROT_POL1PHA0
    +//!   1       1   SPI_PROT_POL1PHA1
    +//! 
    +//! +//! The \e mode parameter defines the operating mode of the SPI module. The +//! SPI module can operate as a controller or peripheral; the SPI can also be be +//! configured to disable output on its serial output line. The \e mode +//! parameter can be one of the following values: \b SPI_MODE_CONTROLLER, +//! \b SPI_MODE_PERIPHERAL, \b SPI_MODE_CONTROLLER_OD or +//! \b SPI_MODE_PERIPHERAL_OD ("OD" indicates "output disabled"). +//! +//! The \e bitRate parameter defines the bit rate for the SPI. This bit rate +//! must satisfy the following clock ratio criteria: +//! +//! - \e bitRate can be no greater than lspclkHz divided by 4. +//! - \e lspclkHz / \e bitRate cannot be greater than 128. +//! +//! The \e dataWidth parameter defines the width of the data transfers and +//! can be a value between 1 and 16, inclusive. +//! +//! The peripheral clock is the low speed peripheral clock. This value is +//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded +//! if it is constant and known (to save the code/execution overhead of a call +//! to SysCtl_getLowSpeedClock()). +//! +//! \note SPI operation should be disabled via SPI_disableModule() before any +//! changes to its configuration. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol, + SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth); + +//***************************************************************************** +// +//! Configures the baud rate of the serial peripheral interface. +//! +//! \param base specifies the SPI module base address. +//! \param lspclkHz is the rate of the clock supplied to the SPI module +//! (LSPCLK) in Hz. +//! \param bitRate specifies the clock rate in Hz. +//! +//! This function configures the SPI baud rate. The \e bitRate parameter +//! defines the bit rate for the SPI. This bit rate must satisfy the following +//! clock ratio criteria: +//! +//! - \e bitRate can be no greater than \e lspclkHz divided by 4. +//! - \e lspclkHz / \e bitRate cannot be greater than 128. +//! +//! The peripheral clock is the low speed peripheral clock. This value is +//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded +//! if it is constant and known (to save the code/execution overhead of a call +//! to SysCtl_getLowSpeedClock()). +//! +//! \note SPI_setConfig() also sets the baud rate. Use SPI_setBaudRate() +//! if you wish to configure it separately from protocol and mode. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate); + +//***************************************************************************** +// +//! Enables individual SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be enabled. +//! +//! This function enables the indicated SPI interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. The \e intFlags parameter can be +//! any of the following values: +//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt +//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty +//! - \b SPI_INT_RXFF (also enables \b SPI_INT_RXFF_OVERFLOW) - RX FIFO level +//! interrupt (and RX FIFO overflow) +//! - \b SPI_INT_TXFF - TX FIFO level interrupt +//! +//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_enableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Disables individual SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be disabled. +//! +//! This function disables the indicated SPI interrupt sources. The +//! \e intFlags parameter can be any of the following values: +//! - \b SPI_INT_RX_OVERRUN +//! - \b SPI_INT_RX_DATA_TX_EMPTY +//! - \b SPI_INT_RXFF (also disables \b SPI_INT_RXFF_OVERFLOW) +//! - \b SPI_INT_TXFF +//! +//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_disableInterrupt(uint32_t base, uint32_t intFlags); + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param base specifies the SPI module base address. +//! +//! This function returns the interrupt status for the SPI module. +//! +//! \return The current interrupt status, enumerated as a bit field of the +//! following values: +//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt +//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty +//! - \b SPI_INT_RXFF - RX FIFO level interrupt +//! - \b SPI_INT_RXFF_OVERFLOW - RX FIFO overflow +//! - \b SPI_INT_TXFF - TX FIFO level interrupt +// +//***************************************************************************** +extern uint32_t +SPI_getInterruptStatus(uint32_t base); + +//***************************************************************************** +// +//! Clears SPI interrupt sources. +//! +//! \param base specifies the SPI module base address. +//! \param intFlags is a bit mask of the interrupt sources to be cleared. +//! +//! This function clears the specified SPI interrupt sources so that they no +//! longer assert. This function must be called in the interrupt handler to +//! keep the interrupts from being triggered again immediately upon exit. The +//! \e intFlags parameter can consist of a bit field of the following values: +//! - \b SPI_INT_RX_OVERRUN +//! - \b SPI_INT_RX_DATA_TX_EMPTY +//! - \b SPI_INT_RXFF +//! - \b SPI_INT_RXFF_OVERFLOW +//! - \b SPI_INT_TXFF +//! +//! \note \b SPI_INT_RX_DATA_TX_EMPTY is cleared by a read of the receive +//! receive buffer, so it usually doesn't need to be cleared using this +//! function. +//! +//! \note Also note that \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, +//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with +//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags); + + +//***************************************************************************** +// +//! This function can be used to transmit a 24-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit a 24-bit word of data. +//! 24-bit word data is divided into three bytes of data. +//! +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay); + +//***************************************************************************** +// +//! This function can be used to transmit a 32-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param txData is the data to be transmitted over SPI +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function can be used to transmit a 32-bit word of data. +//! 32-bit word data is divided into four bytes of data. +//! +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 16 bits BEFORE calling the +//! function +//! +//! \return None. +// +//***************************************************************************** +extern void +SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay); + + + +//***************************************************************************** +// +//! This function is used to receive a 16-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 16-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 16-bit word. +// +//***************************************************************************** +extern uint16_t +SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + +//***************************************************************************** +// +//! This function is used to receive a 24-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 24-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 24-bit word. +// +//***************************************************************************** +extern uint32_t +SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + +//***************************************************************************** +// +//! This function is used to receive a 32-bit word of data +//! +//! \param base specifies the SPI module base address. +//! \param endianness specifies the endianess of received data +//! \param dummyData is the data which is transmitted to initiate +//! SPI transaction to receive SPI data +//! \param txDelay specifies the number of serial clock cycles delay time after +//! completion of perious word +//! +//! This function is used to receive a 32-bit word of data. +//! This function uses SPI_pollingFIFOTransaction function. +//! SPI character length must be configured to 8 bits BEFORE calling the +//! function +//! +//! \return the received 32-bit word. +// +//***************************************************************************** +extern uint32_t +SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, + uint16_t txDelay); + + + +//***************************************************************************** +// +//! This function is used to initiate SPI transaction of specified character +//! length +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param data specified the data to be transmitted +//! +//! The SPI must be configured to the provided charLength BEFORE the function +//! is called. This function does not set/change the SPI char length. +//! +//! \return . +// +//***************************************************************************** +extern uint16_t +SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t data); + +//***************************************************************************** +// +//! This function is used to initiate SPI transaction of specified character +//! length and 'N' words of transaction +//! +//! \param base specifies the SPI module base address. +//! \param charLength specifies the SPI character length of SPI transaction +//! \param pTxBuffer specifies the pointer to transmit buffer +//! \param pRxBuffer specifies the pointer to receive buffer +//! \param numOfWords specified the number of data to be transmitted / received +//! +//! The SPI must be configured to the provided charLength BEFORE the function +//! is called. This function does not set/change the SPI char length. +//! +//! \return none +// +//***************************************************************************** +extern void +SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, + uint16_t *pTxBuffer, uint16_t *pRxBuffer, + uint16_t numOfWords, uint16_t txDelay); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SPI_H diff --git a/gpio_driverlib_cpu1/device/driverlib/sysctl.c b/gpio_driverlib_cpu1/device/driverlib/sysctl.c new file mode 100644 index 0000000..f4708f2 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sysctl.c @@ -0,0 +1,1469 @@ +//########################################################################### +// +// FILE: sysctl.c +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "cputimer.h" +#include "sysctl.h" + +// +// Define to isolate inline assembly +// +#define SYSCTL_DELAY __asm(" .if __TI_EABI__\n" \ + " .asg SysCtl_delay , _SysCtl_delay\n" \ + " .endif\n" \ + " .def _SysCtl_delay\n" \ + " .sect \".TI.ramfunc\"\n" \ + " .global _SysCtl_delay\n" \ + "_SysCtl_delay:\n" \ + " SUB ACC,#1\n" \ + " BF _SysCtl_delay, GEQ\n" \ + " LRETR\n") +#define SYSCTL_CLRC_DBGM __asm(" CLRC DBGM") + +// +// Define Timer1 and Timer2 seed values +// +#define TMR1SYSCLKCTR 0xF0000000U +#define TMR2INPCLKCTR 0x800U + +#define XTAL_CPUTIMER_PERIOD 1023U + +//***************************************************************************** +// +// SysCtl_delay() +// +//***************************************************************************** +SYSCTL_DELAY; + + +static void +SysCtl_pollCpuTimer(void) +{ + // + // Delay for 1 ms while the XTAL powers up + // + // 2000 loops, 5 cycles per loop + 9 cycles overhead = 10009 cycles + // + SysCtl_delay(2000); + + // + // Wait for cpu timer 2 to overflow + // + while(CPUTimer_getTimerOverflowStatus(CPUTIMER2_BASE) == false); + { + // + // If your application is stuck in this loop, please check if the + // input clock source is valid. + // + } + + // + // Clear cpu timer 2 overflow flag + // + CPUTimer_clearOverflowFlag(CPUTIMER2_BASE); +} + +//***************************************************************************** +// +// SysCtl_getClock() +// +//***************************************************************************** +uint32_t +SysCtl_getClock(uint32_t clockInHz) +{ + uint32_t temp; + uint32_t oscSource; + uint32_t clockOut; + + // + // Don't proceed if an MCD failure is detected. + // + if(SysCtl_isMCDClockFailureDetected()) + { + // + // OSCCLKSRC2 failure detected. Returning the INTOSC1 rate. You need + // to handle the MCD and clear the failure. + // + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + // + // If one of the internal oscillators is being used, start from the + // known default frequency. Otherwise, use clockInHz parameter. + // + oscSource = HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (uint32_t)SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M; + + if((oscSource == (SYSCTL_OSCSRC_OSC2 >> SYSCTL_OSCSRC_S)) || + (oscSource == (SYSCTL_OSCSRC_OSC1 >> SYSCTL_OSCSRC_S))) + { + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + clockOut = clockInHz; + } + + // + // If the PLL is enabled calculate its effect on the clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) & + (SYSCTL_SYSPLLCTL1_PLLEN | SYSCTL_SYSPLLCTL1_PLLCLKEN)) == 3U) + { + // + // Calculate portion from fractional multiplier + // + temp = (clockInHz * ((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) & + SYSCTL_SYSPLLMULT_FMULT_M) >> + SYSCTL_SYSPLLMULT_FMULT_S)) / 4U; + + // + // Calculate integer multiplier and fixed divide by 2 + // + clockOut = clockOut * ((HWREG(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) & + SYSCTL_SYSPLLMULT_IMULT_M) >> + SYSCTL_SYSPLLMULT_IMULT_S); + + // + // Add in fractional portion + // + clockOut += temp; + } + + if((HWREG(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) != 0U) + { + clockOut /= (2U * (HWREG(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M)); + } + } + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_getAuxClock() +// +//***************************************************************************** +uint32_t SysCtl_getAuxClock(uint32_t clockInHz) +{ + uint32_t temp; + uint32_t oscSource; + uint32_t clockOut; + + oscSource = HWREG(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + (uint32_t)SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M; + + // + // If one of the internal oscillators is being used, start from the + // known default frequency. Otherwise, use clockInHz parameter. + // + if(oscSource == (SYSCTL_AUXPLL_OSCSRC_OSC2 >> SYSCTL_OSCSRC_S)) + { + // + // 10MHz Internal Clock + // + clockOut = SYSCTL_DEFAULT_OSC_FREQ; + } + else + { + clockOut = clockInHz; + } + + // + // If the PLL is enabled calculate its effect on the clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) & + (SYSCTL_AUXPLLCTL1_PLLEN | SYSCTL_AUXPLLCTL1_PLLCLKEN)) == 3U) + { + // + // Calculate portion from fractional multiplier + // + temp = (clockInHz * ((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_FMULT_M) >> + SYSCTL_AUXPLLMULT_FMULT_S)) / 4U; + + // + // Calculate integer multiplier + // + clockOut = clockOut * ((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_IMULT_M) >> + SYSCTL_AUXPLLMULT_IMULT_S); + + // + // Add in fractional portion + // + clockOut += temp; + } + + clockOut /= (1U << (HWREG(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) & + SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M)); + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_setClock() +// +//***************************************************************************** +bool +SysCtl_setClock(uint32_t config) +{ + uint16_t divSel; + uint16_t iMult = 0U, fMult = 0U, pllMult = 0U, div; + bool status, sysclkInvalidFreq = true; + uint16_t i, tempSCSR, tempWDCR, tempWDWCR, intStatus; + uint16_t t1TCR, t1TPR, t1TPRH, t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t1PRD, t2PRD, ctr1; + float32_t sysclkToInClkError, mult; + + // + // Check the arguments. + // + ASSERT((config & SYSCTL_OSCSRC_M) != SYSCTL_OSCSRC_M); // 3 is not valid + + // + // Don't proceed to the PLL initialization if an MCD failure is detected. + // + if(SysCtl_isMCDClockFailureDetected()) + { + // + // OSCCLKSRC2 failure detected. Returning false. You'll need to clear + // the MCD error. + // + status = false; + } + else + { + // + // Configure oscillator source + // + SysCtl_selectOscSource(config & SYSCTL_OSCSRC_M); + + // + // Bypass PLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLCLKEN; + EDIS; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Configure PLL if enabled + // + EALLOW; + if((config & SYSCTL_PLL_ENABLE) == SYSCTL_PLL_ENABLE) + { + if((HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) & + SYSCTL_SYSDBGCTL_BIT_0) != 0U) + { + // + // The user can optionally insert handler code here. This will + // only be executed if a watchdog reset occurred after a failed + // system PLL initialization. See your device user's guide for + // more information. + // + // If the application has a watchdog reset handler, this bit + // should be checked to determine if the watchdog reset + // occurred because of the PLL. + // + // No action here will continue with retrying the PLL as + // normal. + // + } + + // + // Set dividers to /1 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = 0U; + + // + // Get the PLL multiplier settings from config + // + iMult |= (uint16_t)(config & SYSCTL_IMULT_M); + fMult |= (uint16_t)((config & SYSCTL_FMULT_M) >> SYSCTL_FMULT_S); + pllMult |= (iMult << SYSCTL_SYSPLLMULT_IMULT_S) | + (fMult << SYSCTL_SYSPLLMULT_FMULT_S); + + // + // Lock the PLL five times. This helps ensure a successful start. + // Five is the minimum recommended number. The user can increase + // this number according to allotted system initialization time. + // + for(i = 0U; i < 5U; i++) + { + // + // Turn off PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLEN; + + asm(" RPT #60 || NOP"); + + // + // Write multiplier, which automatically turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) = pllMult; + + // + // Wait for the SYSPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_LOCKS) == 0U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + } + } + + // + // Configure Dividers. Set divider to produce slower output frequency + // to limit current increase. + // + divSel = (uint16_t)(config & SYSCTL_SYSDIV_M) >> SYSCTL_SYSDIV_S; + + if(divSel != (126U / 2U)) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(uint16_t)SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | (divSel + 1U); + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(uint16_t)SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | divSel; + } + + // + // *CAUTION* + // It is recommended to use the following watchdog code to monitor the + // PLLstartup sequence. If your application has already cleared the + // watchdog SCRS[WDOVERRIDE] bit this cannot be done. It is recommended + // not to clear this bit until after the PLL has been initiated. + // + + // + // Backup User Watchdog + // + tempSCSR = HWREGH(WD_BASE + SYSCTL_O_SCSR); + tempWDCR = HWREGH(WD_BASE + SYSCTL_O_WDCR); + tempWDWCR = HWREGH(WD_BASE + SYSCTL_O_WDWCR); + + // + // Disable windowed functionality, reset counter + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) = 0x0U; + SysCtl_serviceWatchdog(); + + // + // Disable global interrupts + // + intStatus = __disable_interrupts(); + + // + // Configure for watchdog reset and to run at max frequency + // + EALLOW; + HWREGH(WD_BASE + SYSCTL_O_SCSR) = 0x0U; + HWREGH(WD_BASE + SYSCTL_O_WDCR) = SYSCTL_WD_CHKBITS; + + // + // This bit is reset only by power-on-reset (POR) and will not be + // cleared by a WD reset + // + HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) |= SYSCTL_SYSDBGCTL_BIT_0; + + // + // Enable PLLSYSCLK is fed from system PLL clock + // + HWREGH(CLKCFG_BASE + + SYSCTL_O_SYSPLLCTL1) |= SYSCTL_SYSPLLCTL1_PLLCLKEN; + + EDIS; + + // + // Delay to ensure system is clocking from PLL prior to clearing + // status bit + // + SysCtl_delay(3U); + + // + // Slip Bit Monitor and SYSCLK Frequency Check using timers + // Re-lock routine for SLIP condition or if SYSCLK and CLKSRC timer + // counts are off by +/- 10%. At a minimum, SYSCLK check is performed. + // Re-lock attempt is carried out if SLIPS bit is set. + // This while loop is monitored by watchdog. + // In the event that the PLL does not successfully lock, the loop will + // be aborted by watchdog reset. + // + while(((config & SYSCTL_PLL_ENABLE) == SYSCTL_PLL_ENABLE) && + (sysclkInvalidFreq == true)) + { + EALLOW; + + // + // Perform PLL re-lock only if SLIPS bit is set, otherwise monitor + // SYSCLK frequency with timers + // + if((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_SLIPS) == 1U) + { + // + // Bypass PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLCLKEN; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Turn off PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~SYSCTL_SYSPLLCTL1_PLLEN; + + SysCtl_delay(12U); + + // + // Write multiplier, which automatically turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLMULT) |= pllMult; + + // + // Wait for the SYSPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLSTS) & + SYSCTL_SYSPLLSTS_LOCKS) == 0U) + { + ; + } + + // + // Enable PLLSYSCLK is fed from system PLL clock + // + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) |= + SYSCTL_SYSPLLCTL1_PLLCLKEN; + + // + // Delay to ensure system is clocking from PLL prior to + // clearing status bit + // + SysCtl_delay(12U); + } + + // + // Backup timer1 and timer2 settings + // + t1TCR = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR); + t1PRD = HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD); + t1TPR = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPR); + t1TPRH = HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPRH); + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Set up timers 1 and 2 + // Configure timer1 to count SYSCLK cycles + // + + // + // Stop timer 1 + // Seed timer1 counter + // Set sysclock divider + // Reload timer with value in PRD + // Clear interrupt flag + // Enable interrupt + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD) = (uint32_t)TMR1SYSCLKCTR; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIE; + + // + // Configure timer2 to count Input clock cycles + // + switch (config & SYSCTL_OSCSRC_M) + { + case SYSCTL_OSCSRC_OSC1: + // + // Clk Src = INT_OSC1 + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 1U; + break; + + case SYSCTL_OSCSRC_OSC2: + // + // Clk Src = INT_OSC2 + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 2U; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Clk Src = XTAL + // + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M) | 3U; + break; + + default: + // + // Do nothing. Not a valid clock source value. + // + break; + } + + // + // Clear interrupt flag + // Enable interrupt + // Stop timer 2 + // Seed timer2 counter + // Set sysclock divider + // Reload timer with value in PRD + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIE; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = (uint32_t)TMR2INPCLKCTR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + + // + // Stop/Start timer counters + // + + // + // Stop timer 1 + // Stop timer 2 + // Reload timer1 with value in PRD + // Reload timer2 with value in PRD + // Clear timer2 interrupt flag + // Start timer2 + // Start timer1 + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + + // + // Wait for Timers - Stop if either timer overflows + // + while(((HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) == 0U) && + ((HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) == 0U)) + { + ; + } + + // + // Stop timer 1 and 2 + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + + // + // Calculate elapsed counts on timer1 + // + ctr1 = (uint32_t)TMR1SYSCLKCTR - HWREG(CPUTIMER1_BASE + + CPUTIMER_O_TIM); + + // + // Restore timer settings + // + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TCR) = t1TCR; + HWREG(CPUTIMER1_BASE + CPUTIMER_O_PRD) = t1PRD; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPR) = t1TPR; + HWREGH(CPUTIMER1_BASE + CPUTIMER_O_TPRH) = t1TPRH; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + + // + // Calculate Clock Error: + // Error = (mult/div) - (timer1 count/timer2 count) + // + mult = (float32_t)iMult + ((float32_t)fMult / 4.0F); + + if((HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & 0x3FU) == 0U) + { + div = 1U; + } + else + { + div = (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + 0x3FU) << 1; + } + + sysclkToInClkError = (mult / (float32_t)div) - + ((float32_t)ctr1 / (float32_t)TMR2INPCLKCTR); + + // + // sysclkInvalidFreq will be set to true if sysclkToInClkError is + // off by 10% + // + sysclkInvalidFreq = ((sysclkToInClkError > 0.10F) || + (sysclkToInClkError < -0.10F)); + + EDIS; + } + + // + // Clear bit + // + EALLOW; + HWREGH(DEVCFG_BASE + SYSCTL_O_SYSDBGCTL) &= ~SYSCTL_SYSDBGCTL_BIT_0; + EDIS; + + // + // Restore user watchdog, first resetting counter + // + SysCtl_serviceWatchdog(); + + // + // Set the KEY bits and make sure not to set the WDOVERRIDE bit + // + EALLOW; + HWREGH(WD_BASE + SYSCTL_O_WDCR) = tempWDCR | SYSCTL_WD_CHKBITS; + HWREGH(WD_BASE + SYSCTL_O_WDWCR) = tempWDWCR; + HWREGH(WD_BASE + SYSCTL_O_SCSR) = tempSCSR & ~SYSCTL_SCSR_WDOVERRIDE; + EDIS; + + // + // Restore state of ST1[INTM]. This was set by the + // __disable_interrupts() intrinsic previously. + // + if((intStatus & 0x1U) == 0U) + { + EINT; + } + + // + // Restore state of ST1[DBGM]. This was set by the + // __disable_interrupts() intrinsic previously. + // + if((intStatus & 0x2U) == 0U) + { + SYSCTL_CLRC_DBGM; + } + + // + // ~200 PLLSYSCLK delay to allow voltage regulator to stabilize prior + // to increasing entire system clock frequency. + // + SysCtl_delay(40U); + + // + // Set the divider to user value + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M) | divSel; + SYSCTL_REGWRITE_DELAY; + EDIS; + + status = true; + } + + return(status); +} +//***************************************************************************** +// +// SysCtl_setAuxClock() +// +//***************************************************************************** +void SysCtl_setAuxClock(uint32_t config) +{ + uint16_t pllMult = 0U; + uint16_t counter = 0U, started = 0U, attempts = 0U; + uint16_t mult; + uint16_t i, t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t2PRD; + + // + // Check the arguments + // + ASSERT((config & SYSCTL_OSCSRC_M) != SYSCTL_OSCSRC_M); // 3 is not valid + + // + // Bypass PLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLCLKEN; + EDIS; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Configure oscillator source + // + SysCtl_selectOscSourceAuxPLL(config & SYSCTL_OSCSRC_M); + + // + // Get the PLL multiplier settings from config + // + pllMult |= (uint16_t)((config & SYSCTL_IMULT_M) << + SYSCTL_AUXPLLMULT_IMULT_S); + pllMult |= (uint16_t)(((config & SYSCTL_FMULT_M) >> SYSCTL_FMULT_S) << + SYSCTL_AUXPLLMULT_FMULT_S); + + // + // Get the PLL multipliers currently programmed + // + mult = (uint16_t)((HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + (uint32_t)SYSCTL_AUXPLLMULT_IMULT_M) >> + (uint32_t)SYSCTL_AUXPLLMULT_IMULT_S); + mult |= (uint16_t)(HWREG(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) & + SYSCTL_AUXPLLMULT_FMULT_M); + + // + // Lock PLL only if the multipliers need update + // + if(mult != pllMult) + { + + // + // Configure PLL if enabled + // + if((config & SYSCTL_AUXPLL_ENABLE) == SYSCTL_AUXPLL_ENABLE) + { + // + // Backup Timer 2 settings + // + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Configure Timer 2 for AUXPLL as source in known configuration + // - Clock source to AUXPLL + // - Clock divider to divide by 1 + // - Small period to detect overflow + // - Interrupt disabled + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = 6U; + + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = 10U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = 0U; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TIE; + + // + // Set AUX Divide by 8 to ensure that AUXPLLCLK <= SYSCLK / 2 + // while using Timer 2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = 0x3U; + SYSCTL_REGWRITE_DELAY; + EDIS; + + // + // Lock the PLL up to five times. + //CPU Timer 2 will monitor a successful + // lock and break out of the loop earlier if detected. + // + while((counter < 5U) && (started == 0U)) + { + EALLOW; + + // + // Turn off AUXPLL and delay for it to power down. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= + ~SYSCTL_AUXPLLCTL1_PLLEN; + SysCtl_delay(3U); + + // + // Set integer and fractional multiplier, which automatically + // turns on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) |= pllMult; + SYSCTL_REGWRITE_DELAY; + + // + // Enable AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= + SYSCTL_AUXPLLCTL1_PLLEN; + EDIS; + + // + // Wait for the AUXPLL lock counter + // + + while((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_LOCKS) != 1U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + + + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= + SYSCTL_AUXPLLCTL1_PLLCLKEN; + SysCtl_delay(3U); + + // + // CPU Timer 2 will now be setup to be clocked from AUXPLLCLK. + // This is used to test that the PLL has successfully started. + // + // Reload and start the timer + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) &= ~CPUTIMER_TCR_TSS; + + // + // Check to see timer is counting properly + // + for(i = 0U; i < 1000U; i++) + { + // + // Check overflow flag + // + if((HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) & + CPUTIMER_TCR_TIF) != 0U) + { + // + // Clear overflow flag + // + HWREGH(CPUTIMER2_BASE + + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TIF; + + // + // Set flag to indicate PLL started and break out of + // for-loop + // + started = 1U; + break; + } + } + + // + // Stop timer + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TSS; + counter++; + EDIS; + } + + if(started == 0U) + { + // + // AUX PLL may not have started. Reset multiplier to 0 (bypass + // PLL). + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) = 0U; + EDIS; + + // + // The user should put some handler code here based on how + // this condition should be handled in their application. + // + ESTOP0; + } + + // + // Restore Timer 2 configuration + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + + // + // Reload period value + // + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + EDIS; + } + } + else + { + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLCLKEN; + SysCtl_delay(3U); + EDIS; + } + + // + // Slip Bit Monitor + // Re-lock routine for SLIP condition + // + while(((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_SLIPS) != 0U) && (attempts < 10U) && + ((config & SYSCTL_AUXPLL_ENABLE) == SYSCTL_AUXPLL_ENABLE)) + { + EALLOW; + + // + // Bypass AUXPLL + // + HWREGH(CLKCFG_BASE + + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLCLKEN; + + // + // Delay of at least 120 OSCCLK cycles required post PLL bypass + // + SysCtl_delay(23U); + + // + // Turn off AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) &= ~SYSCTL_AUXPLLCTL1_PLLEN; + SysCtl_delay(3U); + + // + // Set integer and fractional multiplier, which automatically turns + // on the PLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLMULT) |= pllMult; + + // + // Enable AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLEN; + + // + // Wait for the AUXPLL lock counter + // + while((HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLSTS) & + SYSCTL_AUXPLLSTS_LOCKS) != 1U) + { + // + // Consider to servicing the watchdog using + // SysCtl_serviceWatchdog() + // + } + + // + // Enable AUXPLLCLK to be fed from AUXPLL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) |= SYSCTL_AUXPLLCTL1_PLLCLKEN; + + SysCtl_delay(3U); + + attempts++; + + EDIS; + } + + // + // Set divider to desired value + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = + (uint16_t)(config & SYSCTL_SYSDIV_M) >> SYSCTL_SYSDIV_S; + SYSCTL_REGWRITE_DELAY; + EDIS; + +} + + +//***************************************************************************** +// +// SysCtl_selectXTAL() +// +//***************************************************************************** +void +SysCtl_selectXTAL(void) +{ + uint16_t t2TCR, t2TPR, t2TPRH, t2CLKCTL; + uint32_t t2PRD; + + // + // Backup CPU timer2 settings + // + t2CLKCTL = HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL); + t2TCR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR); + t2PRD = HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD); + t2TPR = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR); + t2TPRH = HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH); + + // + // Backup AUX clock settings + // + uint16_t clksrcctl2 = HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2); + uint16_t auxpllctl1 = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1); + uint16_t auxclkdivsel = HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL); + + // + // Set AUX clock source to XTAL, bypass mode. + // AUXCLK is used as the CPUTimer Clock source. SYSCLK frequency must be + // atleast twice the frequency of AUXCLK. SYSCLK = INTOSC2(10MHz) + // Set the AUX divider to 8. The above condition will be met for XTAL + // frequencies up to 40MHz + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (1U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = 0x0U; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = SYSCTL_AUXPLLCLK_DIV_8; + SYSCTL_REGWRITE_DELAY; + + + // + // Disable cpu timer 2 interrupt + // + CPUTimer_disableInterrupt(CPUTIMER2_BASE); + + // + // Stop cpu timer 2 if running + // + CPUTimer_stopTimer(CPUTIMER2_BASE); + + // + // Initialize cpu timer 2 period + // + CPUTimer_setPeriod(CPUTIMER2_BASE, XTAL_CPUTIMER_PERIOD); + + // + // Set cpu timer 2 clock source to XTAL + // + CPUTimer_selectClockSource(CPUTIMER2_BASE, CPUTIMER_CLOCK_SOURCE_AUX, + CPUTIMER_CLOCK_PRESCALER_1); + + // + // Clear cpu timer 2 overflow flag + // + CPUTimer_clearOverflowFlag(CPUTIMER2_BASE); + + // + // Start cpu timer 2 + // + CPUTimer_startTimer(CPUTIMER2_BASE); + + EALLOW; + // + // Turn on XTAL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= ~SYSCTL_CLKSRCCTL1_XTALOFF; + EDIS; + + // + // Wait for the X1 clock to overflow cpu timer 2 + // + SysCtl_pollCpuTimer(); + + // + // Select XTAL as the oscillator source + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) | + (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S)); + EDIS; + + // + // If a missing clock failure was detected, try waiting for the cpu timer 2 + // to overflow again. + // + while(SysCtl_isMCDClockFailureDetected()) + { + // + // Clear the MCD failure + // + SysCtl_resetMCD(); + + // + // Wait for the X1 clock to overflow cpu timer 2 + // + SysCtl_pollCpuTimer(); + + // + // Select XTAL as the oscillator source + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + ((HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + (~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M)) | + (SYSCTL_OSCSRC_XTAL >> SYSCTL_OSCSRC_S)); + EDIS; + } + + // + // Stop cpu timer 2 + // + CPUTimer_stopTimer(CPUTIMER2_BASE); + + // + // Restore Timer 2 configuration + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = t2CLKCTL; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) = t2TCR; + HWREG(CPUTIMER2_BASE + CPUTIMER_O_PRD) = t2PRD; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPR) = t2TPR; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TPRH) = t2TPRH; + HWREGH(CPUTIMER2_BASE + CPUTIMER_O_TCR) |= CPUTIMER_TCR_TRB; + + // + // Restore AUX clock settings + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = clksrcctl2; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXPLLCTL1) = auxpllctl1; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = auxclkdivsel; + SYSCTL_REGWRITE_DELAY; + EDIS; + + EDIS; +} + +//***************************************************************************** +// +// SysCtl_selectOscSource() +// +//***************************************************************************** +void +SysCtl_selectOscSource(uint32_t oscSource) +{ + ASSERT((oscSource == SYSCTL_OSCSRC_OSC1) || + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL)); + + // + // Select the specified source. + // + EALLOW; + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_INTOSC2OFF; + + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M; + + SYSCTL_CLKSRCCTL_DELAY; + + // + // Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Select XTAL in crystal mode and wait for it to power up + // + SysCtl_selectXTAL(); + break; + + case SYSCTL_OSCSRC_OSC1: + // + // Clk Src = INTOSC1 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) & + ~SYSCTL_CLKSRCCTL1_OSCCLKSRCSEL_M) | + (SYSCTL_OSCSRC_OSC1 >> SYSCTL_OSCSRC_S); + + SYSCTL_CLKSRCCTL_DELAY; + + // + //Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// SysCtl_selectOscSourceAuxPLL() +// +//***************************************************************************** +void +SysCtl_selectOscSourceAuxPLL(uint32_t oscSource) +{ + bool status = false; + + EALLOW; + + switch(oscSource) + { + case SYSCTL_AUXPLL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~(SYSCTL_CLKSRCCTL1_INTOSC2OFF); + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &= + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M); + break; + + case SYSCTL_AUXPLL_OSCSRC_XTAL: + // + // Turn on XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~(SYSCTL_CLKSRCCTL1_XTALOFF); + SYSCTL_CLKSRCCTL_DELAY; + + // + // Clk Src = XTAL + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (1U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + break; + + case SYSCTL_AUXPLL_OSCSRC_AUXCLKIN: + // + // Clk Src = AUXCLKIN + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) & + ~(SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_M)) | + (2U << SYSCTL_CLKSRCCTL2_AUXOSCCLKSRCSEL_S); + SYSCTL_CLKSRCCTL_DELAY; + break; + + default: + // + // Do nothing. Not a valid clock source value. + // + break; + } + EDIS; +} + +//***************************************************************************** +// +// SysCtl_getLowSpeedClock() +// +//***************************************************************************** +uint32_t +SysCtl_getLowSpeedClock(uint32_t clockInHz) +{ + uint32_t clockOut; + + // + // Get the main system clock + // + clockOut = SysCtl_getClock(clockInHz); + + // + // Apply the divider to the main clock + // + if((HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + SYSCTL_LOSPCP_LSPCLKDIV_M) != 0U) + { + clockOut /= (2U * (HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + SYSCTL_LOSPCP_LSPCLKDIV_M)); + } + + return(clockOut); +} + +//***************************************************************************** +// +// SysCtl_getDeviceParametric() +// +//***************************************************************************** +uint16_t +SysCtl_getDeviceParametric(SysCtl_DeviceParametric parametric) +{ + uint32_t value; + + // + // Get requested parametric value + // + switch(parametric) + { + case SYSCTL_DEVICE_QUAL: + // + // Qualification Status + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_QUAL_M) >> SYSCTL_PARTIDL_QUAL_S); + break; + + case SYSCTL_DEVICE_PINCOUNT: + // + // Pin Count + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_PIN_COUNT_M) >> + SYSCTL_PARTIDL_PIN_COUNT_S); + break; + + case SYSCTL_DEVICE_INSTASPIN: + // + // InstaSPIN Feature Set + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_INSTASPIN_M) >> + SYSCTL_PARTIDL_INSTASPIN_S); + break; + + case SYSCTL_DEVICE_FLASH: + // + // Flash Size (KB) + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_FLASH_SIZE_M) >> + SYSCTL_PARTIDL_FLASH_SIZE_S); + break; + + case SYSCTL_DEVICE_PARTID: + // + // PARTID Format Revision + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDL) & + SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_M) >> + SYSCTL_PARTIDL_PARTID_FORMAT_REVISION_S); + break; + + case SYSCTL_DEVICE_FAMILY: + // + // Device Family + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_FAMILY_M) >> SYSCTL_PARTIDH_FAMILY_S); + break; + + case SYSCTL_DEVICE_PARTNO: + // + // Part Number + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_PARTNO_M) >> SYSCTL_PARTIDH_PARTNO_S); + break; + + case SYSCTL_DEVICE_CLASSID: + // + // Class ID + // + value = ((HWREG(DEVCFG_BASE + SYSCTL_O_PARTIDH) & + SYSCTL_PARTIDH_DEVICE_CLASS_ID_M) >> + SYSCTL_PARTIDH_DEVICE_CLASS_ID_S); + break; + + default: + // + // Not a valid value for PARTID register + // + value = 0U; + break; + } + + return((uint16_t)value); +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/sysctl.h b/gpio_driverlib_cpu1/device/driverlib/sysctl.h new file mode 100644 index 0000000..8b263eb --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/sysctl.h @@ -0,0 +1,3531 @@ +//########################################################################### +// +// FILE: sysctl.h +// +// TITLE: C28x system control driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef SYSCTL_H +#define SYSCTL_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup sysctl_api SysCtl +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_nmi.h" +#include "inc/hw_sysctl.h" +#include "inc/hw_otp.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" + + +// +// Macro used for adding delay between 2 consecutive writes to CLKSRCCTL1 +// register. +// Delay = 300 NOPs +// +#define SYSCTL_CLKSRCCTL_DELAY asm(" RPT #250 || NOP \n RPT #50 || NOP") + +// +// Macro used for adding delay between 2 consecutive writes to memory mapped +// register in System control +// Total delay = 3 * (DEVICE_SYSCLK_FREQ / INTOSC1 Freq) + 9 +// +#define SYSCTL_REGWRITE_DELAY asm(" RPT #69 || NOP") + +//***************************************************************************** +// +// Defines for system control functions. Not intended for use by application +// code. +// +//***************************************************************************** + +// +// Shifted pattern for WDCR register's WDCHK field. +// +#define SYSCTL_WD_CHKBITS 0x0028U + +// +// Keys for WDKEY field. The first enables resets and the second resets. +// +#define SYSCTL_WD_ENRSTKEY 0x0055U +#define SYSCTL_WD_RSTKEY 0x00AAU + +// +// Values to help decode peripheral parameter +// +#define SYSCTL_PERIPH_REG_M 0x001FU +#define SYSCTL_PERIPH_REG_S 0x0000U +#define SYSCTL_PERIPH_BIT_M 0x1F00U +#define SYSCTL_PERIPH_BIT_S 0x0008U + +// +//Keys for the System control registers write protection +// +#define SYSCTL_REG_KEY 0xA5A50000U +#define SYSCTL_PLL_KEY 0XCAFE0000U + +// +//Values to help access shifting of bits +// +#define SYSCTL_TYPE_LOCK_S 0xFU + + +// +// LPM defines for LPMCR.LPM +// +#define SYSCTL_LPM_IDLE 0x0000U +#define SYSCTL_LPM_STANDBY 0x0001U +#define SYSCTL_LPM_HALT 0x0002U +#define SYSCTL_LPM_HIB 0x0003U + +// +// Bit shift for DAC to configure the CPUSEL register +// +#define SYSCTL_CPUSEL_DAC_S 0x10U + +// +// Default internal oscillator frequency, 10 MHz +// +#define SYSCTL_DEFAULT_OSC_FREQ 10000000U + +// +// Mask for SYNCSELECT.SYNCIN +// +#define SYSCTL_SYNCSELECT_SYNCIN_M SYSCTL_SYNCSELECT_EPWM4SYNCIN_M + +// +// Boot ROM Booting and Reset Status +// +#if defined(CPU2) +#define SYSCTL_BOOT_ROM_STATUS 0x0002U +#else +#define SYSCTL_BOOT_ROM_STATUS 0x002CU +#endif +#define SYSCTL_BOOT_ROM_POR 0x8000U +#define SYSCTL_BOOT_ROM_XRS 0x4000U + +#define SYSCTL_DEVICECAL_CONTEXT_SAVE asm(" PUSH ACC \n\ + PUSH DP \n\ + PUSH XAR0 \n\ + PUSH XAR2 \n\ + PUSH XAR3 \n\ + PUSH XAR4 \n\ + PUSH XAR5 \n\ + ") + +#define SYSCTL_DEVICECAL_CONTEXT_RESTORE asm(" POP XAR5 \n\ + POP XAR4 \n\ + POP XAR3 \n\ + POP XAR2 \n\ + POP XAR0 \n\ + POP DP \n\ + POP ACC \n\ + ") + +// +// Device_cal function which is available in OTP memory +// This function is called in SysCtl_resetPeripheral after resetting +// analog peripherals +// +#define Device_cal ((void (*)(void))((uintptr_t)0x070282)) + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_setClock() API as +// the config parameter. +// +//***************************************************************************** +// +// System clock divider (SYSDIV) +// + + + +#define SYSCTL_SYSDIV_M 0x00001F80UL // Mask for SYSDIV value in config +#define SYSCTL_SYSDIV_S 7U // Shift for SYSDIV value in config + +//! Macro to format system clock divider value. x must be 1 or even values up +//! to 126. +#define SYSCTL_SYSDIV(x) ((((x) / 2U) << SYSCTL_SYSDIV_S) & SYSCTL_SYSDIV_M) + +// +// Integer multiplier (IMULT) +// +#define SYSCTL_IMULT_M 0x0000007FUL // Mask for IMULT value in config +#define SYSCTL_IMULT_S 0U // Shift for IMULT value in config +//! Macro to format integer multiplier value. x is a number from 1 to 127. +//! +#define SYSCTL_IMULT(x) (((x) << SYSCTL_IMULT_S) & SYSCTL_IMULT_M) + +#ifndef DOXYGEN_PDF_IGNORE +// +// Fractional multiplier (FMULT) +// +#define SYSCTL_FMULT_M 0x00006000UL // Mask for FMULT value in config +#define SYSCTL_FMULT_S 13U // Shift for FMULT value in config +#define SYSCTL_FMULT_NONE 0x00000000UL //!< No fractional multiplier +#define SYSCTL_FMULT_0 0x00000000UL //!< No fractional multiplier +#define SYSCTL_FMULT_1_4 0x00002000UL //!< Fractional multiplier of 0.25 +#define SYSCTL_FMULT_1_2 0x00004000UL //!< Fractional multiplier of 0.50 +#define SYSCTL_FMULT_3_4 0x00006000UL //!< Fractional multiplier of 0.75 + +// +// Oscillator source +// +// Also used with the SysCtl_selectOscSource(), SysCtl_turnOnOsc(), +// and SysCtl_turnOffOsc() functions as the oscSource parameter. +// +#define SYSCTL_OSCSRC_M 0x00030000UL // Mask for OSCSRC value in config +#define SYSCTL_OSCSRC_S 16U // Shift for OSCSRC value in config +//! Internal oscillator INTOSC2 +#define SYSCTL_OSCSRC_OSC2 0x00000000UL +//! External oscillator (XTAL) in crystal mode +#define SYSCTL_OSCSRC_XTAL 0x00010000U +//! Internal oscillator INTOSC1 +#define SYSCTL_OSCSRC_OSC1 0x00020000UL + +// +// Enable/disable PLL +// +#define SYSCTL_PLL_ENABLE 0x80000000U //!< Enable PLL +#define SYSCTL_PLL_DISABLE 0x00000000U //!< Disable PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_setAuxClock() API +// as the config parameter. +// +//***************************************************************************** +// +// Auxiliary clock divider (AUXCLKDIV) +// +#define SYSCTL_AUXPLL_DIV_1 0x00000000UL //!< Auxiliary PLL divide by 1 +#define SYSCTL_AUXPLL_DIV_2 0x00000080UL //!< Auxiliary PLL divide by 2 +#define SYSCTL_AUXPLL_DIV_4 0x00000100UL //!< Auxiliary PLL divide by 4 +#define SYSCTL_AUXPLL_DIV_8 0x00000180UL //!< Auxiliary PLL divide by 8 + +// +// Integer multiplier (IMULT) +// +//! Macro to format integer multiplier value. x is a number from 1 to 127. +//! +#define SYSCTL_AUXPLL_IMULT(x) SYSCTL_IMULT((x)) + +// +// Fractional multiplier (FMULT) +// +#define SYSCTL_AUXPLL_FMULT_NONE 0x00000000U //!< No fractional multiplier +#define SYSCTL_AUXPLL_FMULT_0 0x00000000U //!< No fractional multiplier +#define SYSCTL_AUXPLL_FMULT_1_4 0x00002000UL //!< Fractional multiplier - 0.25 +#define SYSCTL_AUXPLL_FMULT_1_2 0x00004000UL //!< Fractional multiplier - 0.50 +#define SYSCTL_AUXPLL_FMULT_3_4 0x00006000UL //!< Fractional multiplier - 0.75 + +// +// Oscillator source +// +//! Internal oscillator INTOSC2 as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_OSC2 0x00000000UL +//! External oscillator (XTAL) as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_XTAL 0x00010000UL +//! AUXCLKIN (from GPIO) as auxiliary clock input +#define SYSCTL_AUXPLL_OSCSRC_AUXCLKIN 0x00020000U + +// +// Enable/disable PLL +// +#define SYSCTL_AUXPLL_ENABLE 0x80000000U //!< Enable AUXPLL +#define SYSCTL_AUXPLL_DISABLE 0x00000000U //!< Disable AUXPLL + +//***************************************************************************** +// +// Values that can be passed to SysCtl_selectSecController() as the +// periFrame1Config and periFrame2Config parameters. +// +//***************************************************************************** +//! Configure CLA as the secondary controller +#define SYSCTL_SEC_CONTROLLER_CLA 0x0U +//! Configure DMA a secondary controller +#define SYSCTL_SEC_CONTROLLER_DMA 0x1U + +//***************************************************************************** +// +// Values that can be passed to SysCtl_clearNMIStatus(), +// SysCtl_forceNMIFlags(), SysCtl_isNMIFlagSet(), and +// SysCtl_isNMIShadowFlagSet() as the nmiFlags parameter and returned by +// SysCtl_getNMIFlagStatus() and SysCtl_getNMIShadowFlagStatus(). +// +//***************************************************************************** +#define SYSCTL_NMI_NMIINT 0x1U //!< NMI Interrupt Flag +#define SYSCTL_NMI_CLOCKFAIL 0x2U //!< Clock Fail Interrupt Flag +#define SYSCTL_NMI_RAMUNCERR 0x4U //!< RAM Uncorrectable Error NMI Flag +#define SYSCTL_NMI_FLUNCERR 0x8U //!< Flash Uncorrectable Error NMI Flag +#define SYSCTL_NMI_CPU1HWBISTERR 0x10U //!< HW BIST Error NMI Flag +#define SYSCTL_NMI_CPU2HWBISTERR 0x20U //!< HW BIST Error NMI Flag +#define SYSCTL_NMI_PIEVECTERR 0x40U //!< PIE Vector Fetch Error Flag +#define SYSCTL_NMI_CLBNMI 0x100U //!< Configurable Logic Block NMI Flag +#define SYSCTL_NMI_CPU2WDRSN 0x200U //!< CPU2 WDRSn Reset Indication Flag +#define SYSCTL_NMI_CPU2NMIWDRSN 0x400U //!< CPU2 NMIWDRSn Reset Indication Flag + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtl_clearResetCause() +// API as rstCauses or returned by the SysCtl_getResetCause() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_POR 0x00000001U //!< Power-on reset +#define SYSCTL_CAUSE_XRS 0x00000002U //!< External reset pin +#define SYSCTL_CAUSE_WDRS 0x00000004U //!< Watchdog reset +#define SYSCTL_CAUSE_NMIWDRS 0x00000008U //!< NMI watchdog reset +#define SYSCTL_CAUSE_SCCRESET 0x00000100U //!< SCCRESETn by DCSM +//***************************************************************************** +// +//! The following are values that can be passed to SysCtl_enablePeripheral() +//! and SysCtl_disablePeripheral() as the \e peripheral parameter. +//! The EPWM Clock enable bit is also used to enable clocking for CLB. +//! The EPWM and CLB clock enable bits are mapped to same value, +// +//***************************************************************************** +#define SYSCTL_PERIPH_CLK_CLB1 SYSCTL_PERIPH_CLK_EPWM1 //!< CLB1 clock +#define SYSCTL_PERIPH_CLK_CLB2 SYSCTL_PERIPH_CLK_EPWM2 //!< CLB2 clock +#define SYSCTL_PERIPH_CLK_CLB3 SYSCTL_PERIPH_CLK_EPWM3 //!< CLB3 clock +#define SYSCTL_PERIPH_CLK_CLB4 SYSCTL_PERIPH_CLK_EPWM4 //!< CLB4 clock +//***************************************************************************** +// +// The following values define the adcsocSrc parameter for +// SysCtl_enableExtADCSOCSource() and SysCtl_disableExtADCSOCSource(). +// +//***************************************************************************** +#define SYSCTL_ADCSOC_SRC_PWM1SOCA 0x1U //! EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM4SYNCOUT, //!< EPWM4SYNCOUT --> EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM7SYNCOUT, //!< EPWM7SYNCOUT --> EXTSYNCOUT + SYSCTL_SYNC_OUT_SRC_EPWM10SYNCOUT //!< EPWM10SYNCOUT --> EXTSYNCOUT + +} SysCtl_SyncOutputSource; + +//***************************************************************************** +// +//! The following values define the \e parametric parameter for +//! SysCtl_getDeviceParametric(). +// +//***************************************************************************** +typedef enum +{ + SYSCTL_DEVICE_QUAL, //!< Device Qualification Status + SYSCTL_DEVICE_PINCOUNT, //!< Device Pin Count + SYSCTL_DEVICE_INSTASPIN, //!< Device InstaSPIN Feature Set + SYSCTL_DEVICE_FLASH, //!< Device Flash size (KB) + SYSCTL_DEVICE_PARTID, //!< Device Part ID Format Revision + SYSCTL_DEVICE_FAMILY, //!< Device Family + SYSCTL_DEVICE_PARTNO, //!< Device Part Number + SYSCTL_DEVICE_CLASSID //!< Device Class ID +} SysCtl_DeviceParametric; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setXClk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_XCLKOUT_DIV_1 = 0, //!< XCLKOUT = XCLKOUT / 1 + SYSCTL_XCLKOUT_DIV_2 = 1, //!< XCLKOUT = XCLKOUT / 2 + SYSCTL_XCLKOUT_DIV_4 = 2, //!< XCLKOUT = XCLKOUT / 4 + SYSCTL_XCLKOUT_DIV_8 = 3 //!< XCLKOUT = XCLKOUT / 8 + +}SysCtl_XClkDivider; + + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setAuxPLLClk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_AUXPLLCLK_DIV_1, //!< AUXPLL clock = AUXPLL clock / 1 + SYSCTL_AUXPLLCLK_DIV_2, //!< AUXPLL clock = AUXPLL clock / 2 + SYSCTL_AUXPLLCLK_DIV_4, //!< AUXPLL clock = AUXPLL clock / 4 + SYSCTL_AUXPLLCLK_DIV_8, //!< AUXPLL clock = AUXPLL clock / 8 + SYSCTL_AUXPLLCLK_DIV_3, //!< AUXPLL clock = AUXPLL clock / 3 + SYSCTL_AUXPLLCLK_DIV_5, //!< AUXPLL clock = AUXPLL clock / 5 + SYSCTL_AUXPLLCLK_DIV_6, //!< AUXPLL clock = AUXPLL clock / 6 + SYSCTL_AUXPLLCLK_DIV_7 //!< AUXPLL clock = AUXPLL clock / 7 + +}SysCtl_AuxPLLClkDivider; + +//***************************************************************************** +// +//! The following are values that can be passed to +//! SysCtl_setCputimer2Clk() as \e divider parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_TMR2CLKPRESCALE_1, //!< Cputimer2 clock = Cputimer2 clock / 1 + SYSCTL_TMR2CLKPRESCALE_2, //!< Cputimer2 clock = Cputimer2 clock / 2 + SYSCTL_TMR2CLKPRESCALE_4, //!< Cputimer2 clock = Cputimer2 clock / 4 + SYSCTL_TMR2CLKPRESCALE_8, //!< Cputimer2 clock = Cputimer2 clock / 8 + SYSCTL_TMR2CLKPRESCALE_16 //!< Cputimer2 clock = Cputimer2 clock / 16 + +}SysCtl_Cputimer2ClkDivider; + +//***************************************************************************** +// +//! The following are values that can be passed to SysCtl_setCputimer2Clk() +//! as \e source parameter. +// +//***************************************************************************** +typedef enum +{ + SYSCTL_TMR2CLKSRCSEL_SYSCLK = 0U, //!< System Clock + SYSCTL_TMR2CLKSRCSEL_INTOSC1 = 1U, //!< Internal Oscillator 1 + SYSCTL_TMR2CLKSRCSEL_INTOSC2 = 2U, //!< Internal Oscillator 2 + SYSCTL_TMR2CLKSRCSEL_XTAL = 3U, //!< Crystal oscillator + SYSCTL_TMR2CLKSRCSEL_AUXPLLCLK = 6U //!< Aux PLL CLock + +}SysCtl_Cputimer2ClkSource; + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Wrapper function for Device_cal function +//! +//! \param None +//! +//! This is a wrapper function for the Device_cal function available in the OTP +//! memory. +//! The function saves and restores the core registers which are being +//! used by the Device_cal function +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_deviceCal(void) +{ + // + // Save the core registers used by Device_cal function in the stack + // + SYSCTL_DEVICECAL_CONTEXT_SAVE; + + // + // Call the Device_cal function + // + Device_cal(); + + // + // Restore the core registers + // + SYSCTL_DEVICECAL_CONTEXT_RESTORE; +} + +//***************************************************************************** +// +//! Resets a peripheral +//! +//! \param peripheral is the peripheral to reset. +//! +//! This function uses the SOFTPRESx registers to reset a specified peripheral. +//! Module registers will be returned to their reset states. +//! +//! \note This includes registers containing trim values.The peripheral +//! software reset needed by CPU2 can be communicated to CPU1 via +//! IPC for all shared peripherals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetPeripheral(SysCtl_PeripheralSOFTPRES peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Sets the appropriate reset bit and then clears it. + // + HWREG(DEVCFG_BASE + SYSCTL_O_SOFTPRES0 + regIndex) |= (1UL << bitIndex); + HWREG(DEVCFG_BASE + SYSCTL_O_SOFTPRES0 + regIndex) &= ~(1UL << bitIndex); + + // + // Call Device_cal function + // + if((((uint16_t)peripheral & SYSCTL_PERIPH_REG_M) == 0xDU) || // ADCx + (((uint16_t)peripheral & SYSCTL_PERIPH_REG_M) == 0x10U) // DACx + ) + { + SysCtl_deviceCal(); + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables a peripheral. +//! +//! \param peripheral is the peripheral to enable. +//! +//! Peripherals are enabled with this function. At power-up, all peripherals +//! are disabled; they must be enabled in order to operate or respond to +//! register reads/writes. +//! +//! \note Note that there should be atleast 5 cycles delay between enabling the +//! peripheral clock and accessing the peripheral registers. The delay should be +//! added by the user if the peripheral is accessed immediately after this +//! function call. +//! Use asm(" RPT #5 || NOP"); to add 5 cycle delay post this function call. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Turn on the module clock. + // + HWREG(CPUSYS_BASE + SYSCTL_O_PCLKCR0 + regIndex) |= (1UL << bitIndex); + EDIS; +} + +//***************************************************************************** +// +//! Disables a peripheral. +//! +//! \param peripheral is the peripheral to disable. +//! +//! Peripherals are disabled with this function. Once disabled, they will not +//! operate or respond to register reads/writes. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Decode the peripheral variable. + // + regIndex = (uint16_t)2U * ((uint16_t)peripheral & + (uint16_t)SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Turn off the module clock. + // + HWREG(CPUSYS_BASE + SYSCTL_O_PCLKCR0 + regIndex) &= ~(1UL << bitIndex); + EDIS; +} + +//***************************************************************************** +// +//! Resets the device. +//! +//! This function performs a watchdog reset of the device. +//! +//! \return This function does not return. +// +//***************************************************************************** +static inline void +SysCtl_resetDevice(void) +{ + // + // Write an incorrect check value to the watchdog control register + // This will cause a device reset + // + EALLOW; + + // + // Enable the watchdog + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = SYSCTL_WD_CHKBITS; + SYSCTL_REGWRITE_DELAY; + + // + // Write a bad check value + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = 0U; + SYSCTL_REGWRITE_DELAY; + + EDIS; + + // + // The device should have reset, so this should never be reached. Just in + // case, loop forever. + // + while((bool)1) + { + } +} + +//***************************************************************************** +// +//! Gets the reason for a reset. +//! +//! This function will return the reason(s) for a reset. Since the reset +//! reasons are sticky until either cleared by software or an external reset, +//! multiple reset reasons may be returned if multiple resets have occurred. +//! The reset reason will be a logical OR of +//! - \b SYSCTL_CAUSE_POR - Power-on reset +//! - \b SYSCTL_CAUSE_XRS - External reset pin +//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset +//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset +//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM +//! +//! \note If you re-purpose the reserved boot ROM RAM, the POR and XRS reset +//! statuses won't be accurate. +//! +//! \return Returns the reason(s) for a reset. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getResetCause(void) +{ + uint32_t resetCauses; + + // + // Read CPU reset register + // + resetCauses = HWREG(CPUSYS_BASE + SYSCTL_O_RESC) & + ((uint32_t)SYSCTL_RESC_POR | (uint32_t)SYSCTL_RESC_XRSN | + (uint32_t)SYSCTL_RESC_WDRSN | + (uint32_t)SYSCTL_RESC_NMIWDRSN | + (uint32_t)SYSCTL_RESC_SCCRESETN + ); + + // + // Set POR and XRS Causes from boot ROM Status + // + if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_POR) == + (uint32_t)SYSCTL_BOOT_ROM_POR) + { + resetCauses |= SYSCTL_RESC_POR; + } + if((HWREG(SYSCTL_BOOT_ROM_STATUS) & (uint32_t)SYSCTL_BOOT_ROM_XRS) == + (uint32_t)SYSCTL_BOOT_ROM_XRS) + { + resetCauses |= SYSCTL_RESC_XRSN; + } + + // + // Return the reset reasons. + // + return(resetCauses); +} + +//***************************************************************************** +// +//! Clears reset reasons. +//! +//! \param rstCauses are the reset causes to be cleared; must be a logical +//! OR of +//! - \b SYSCTL_CAUSE_POR - Power-on reset +//! - \b SYSCTL_CAUSE_XRS - External reset pin +//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset +//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset +//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM +//! +//! This function clears the specified sticky reset reasons. Once cleared, +//! another reset for the same reason can be detected, and a reset for a +//! different reason can be distinguished (instead of having two reset causes +//! set). If the reset reason is used by an application, all reset causes +//! should be cleared after they are retrieved with SysCtl_getResetCause(). +//! +//! \note Some reset causes are cleared by the boot ROM. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearResetCause(uint32_t rstCauses) +{ + // + // Clear the given reset reasons. + // + HWREG(CPUSYS_BASE + SYSCTL_O_RESC) = rstCauses; +} + +//***************************************************************************** +// +//! Sets the low speed peripheral clock rate prescaler. +//! +//! \param prescaler is the LSPCLK rate relative to SYSCLK +//! +//! This function configures the clock rate of the low speed peripherals. The +//! \e prescaler parameter is the value by which the SYSCLK rate is divided to +//! get the LSPCLK rate. For example, a \e prescaler of +//! \b SYSCTL_LSPCLK_PRESCALE_4 will result in a LSPCLK rate that is a quarter +//! of the SYSCLK rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setLowSpeedClock(SysCtl_LSPCLKPrescaler prescaler) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) = + (HWREG(CLKCFG_BASE + SYSCTL_O_LOSPCP) & + ~(uint32_t)SYSCTL_LOSPCP_LSPCLKDIV_M) | (uint32_t)prescaler; + EDIS; +} + +//***************************************************************************** +// +//! Sets the ePWM clock divider. +//! +//! \param divider is the value by which PLLSYSCLK is divided +//! +//! This function configures the clock rate of the EPWMCLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EPWMCLK rate. For example, \b SYSCTL_EPWMCLK_DIV_2 will select an +//! EPWMCLK rate that is half the PLLSYSCLK rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEPWMClockDivider(SysCtl_EPWMCLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) & + ~SYSCTL_PERCLKDIVSEL_EPWMCLKDIV_M) | (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets the EMIF1 clock divider. +//! +//! \param divider is the value by which PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) is divided +//! +//! This function configures the clock rate of the EMIF1CLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EMIF1CLK rate. For example, \b SYSCTL_EMIF1CLK_DIV_2 will select an +//! EMIF1CLK rate that is half the PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEMIF1ClockDivider(SysCtl_EMIF1CLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + if(divider == SYSCTL_EMIF1CLK_DIV_2) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) |= + SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) &= + ~SYSCTL_PERCLKDIVSEL_EMIF1CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + EDIS; +} + +//***************************************************************************** +// +//! Sets the EMIF2 clock divider. +//! +//! \param divider is the value by which PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) is divided +//! +//! This function configures the clock rate of the EMIF2CLK. The +//! \e divider parameter is the value by which the SYSCLK rate is divided to +//! get the EMIF2CLK rate. For example, \b SYSCTL_EMIF2CLK_DIV_2 will select an +//! EMIF2CLK rate that is half the PLLSYSCLK (or CPU1.SYSCLK on a dual +//! core device) rate. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setEMIF2ClockDivider(SysCtl_EMIF2CLKDivider divider) +{ + // + // Write the divider selection to the appropriate register. + // + EALLOW; + if(divider == SYSCTL_EMIF2CLK_DIV_2) + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) |= + SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + else + { + HWREGH(CLKCFG_BASE + SYSCTL_O_PERCLKDIVSEL) &= + ~SYSCTL_PERCLKDIVSEL_EMIF2CLKDIV; + SYSCTL_REGWRITE_DELAY; + } + EDIS; +} + +//***************************************************************************** +// +//! Selects a clock source to mux to an external GPIO pin (XCLKOUT). +//! +//! \param source is the internal clock source to be configured. +//! +//! This function configures the specified clock source to be muxed to an +//! external clock out (XCLKOUT) GPIO pin. The \e source parameter may take a +//! value of one of the following values: +//! - \b SYSCTL_CLOCKOUT_PLLSYS +//! - \b SYSCTL_CLOCKOUT_PLLRAW +//! - \b SYSCTL_CLOCKOUT_SYSCLK +//! - \b SYSCTL_CLOCKOUT_INTOSC1 +//! - \b SYSCTL_CLOCKOUT_INTOSC2 +//! - \b SYSCTL_CLOCKOUT_XTALOSC +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectClockOutSource(SysCtl_ClockOut source) +{ + EALLOW; + + // + // Clear clock out source + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL3) &= + ~SYSCTL_CLKSRCCTL3_XCLKOUTSEL_M; + SYSCTL_CLKSRCCTL_DELAY; + + // + // Set clock out source + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL3) |= (uint16_t)source; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the external oscillator counter value. +//! +//! This function returns the X1 clock counter value. When the return value +//! reaches 0x3FF, it freezes. Before switching from INTOSC2 to an external +//! oscillator (XTAL), an application should call this function to make sure +//! the counter is saturated. +//! +//! \return Returns the value of the 10-bit X1 clock counter. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getExternalOscCounterValue(void) +{ + return(HWREGH(CLKCFG_BASE + SYSCTL_O_X1CNT) & SYSCTL_X1CNT_X1CNT_M); +} + +//***************************************************************************** +// +//! Turns on the specified oscillator sources. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function turns on the oscillator specified by the \e oscSource +//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL +//! or \b SYSCTL_OSCSRC_OSC2. +//! +//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_turnOnOsc(uint32_t oscSource) +{ + ASSERT( + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL) + ); + + EALLOW; + + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn on INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_INTOSC2OFF; + SYSCTL_CLKSRCCTL_DELAY; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Turn on XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= + ~SYSCTL_CLKSRCCTL1_XTALOFF; + + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +//! Turns off the specified oscillator sources. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function turns off the oscillator specified by the \e oscSource +//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL +//! or \b SYSCTL_OSCSRC_OSC2. +//! +//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_turnOffOsc(uint32_t oscSource) +{ + ASSERT( + (oscSource == SYSCTL_OSCSRC_OSC2) || + (oscSource == SYSCTL_OSCSRC_XTAL) + ); + + EALLOW; + + switch(oscSource) + { + case SYSCTL_OSCSRC_OSC2: + // + // Turn off INTOSC2 + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_INTOSC2OFF; + SYSCTL_CLKSRCCTL_DELAY; + break; + + case SYSCTL_OSCSRC_XTAL: + // + // Turn off XTALOSC + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= + SYSCTL_CLKSRCCTL1_XTALOFF; + break; + + default: + // + // Do nothing. Not a valid oscSource value. + // + break; + } + + EDIS; +} + +//***************************************************************************** +// +//! Enters IDLE mode. +//! +//! This function puts the device into IDLE mode. The CPU clock is gated while +//! all peripheral clocks are left running. Any enabled interrupt will wake the +//! CPU up from IDLE mode. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterIdleMode(void) +{ + EALLOW; + + // + // Configure the device to go into IDLE mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_IDLE; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +} + +//***************************************************************************** +// +//! Enters STANDBY mode. +//! +//! This function puts the device into STANDBY mode. This will gate both the +//! CPU clock and any peripheral clocks derived from SYSCLK. The watchdog is +//! left active, and an NMI or an optional watchdog interrupt will wake the +//! CPU subsystem from STANDBY mode. +//! +//! GPIOs may be configured to wake the CPU subsystem. See +//! SysCtl_enableLPMWakeupPin(). +//! +//! The CPU will receive an interrupt (WAKEINT) on wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterStandbyMode(void) +{ + EALLOW; + + // + // Configure the device to go into STANDBY mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_STANDBY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +} + +//***************************************************************************** +// +//! Enters HALT mode. +//! +//! This function puts the device into HALT mode. This will gate almost all +//! systems and clocks and allows for the power-down of oscillators and analog +//! blocks. The watchdog may be left clocked to produce a reset. See +//! SysCtl_enableWatchdogInHalt() to enable this. GPIOs should be +//! configured to wake the CPU subsystem. See SysCtl_enableLPMWakeupPin(). +//! +//! Enter HALT mode (dual CPU). Puts CPU2 in IDLE mode first. +//! +//! The CPU will receive an interrupt (WAKEINT) on wakeup. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterHaltMode(void) +{ +#if defined(CPU2) + EALLOW; + // + // Configure the device to go into IDLE mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_IDLE; + + EDIS; + asm(" IDLE"); + +#elif defined(CPU1) + EALLOW; + + // + // Configure the device to go into HALT mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_HALT; + + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~(SYSCTL_SYSPLLCTL1_PLLCLKEN | SYSCTL_SYSPLLCTL1_PLLEN); + SYSCTL_REGWRITE_DELAY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +#endif +} + +//***************************************************************************** +// +//! Enters Hibernate mode. +//! +//! This function puts the device into Hibernate mode. Hibernate (HIB) is a +//! global low-power mode that gates the supply voltages to most of the system. +//! This mode affects both CPU subsystems. HIB is essentially a controlled +//! power-down with remote wakeup capability, and can be used to save power +//! during long periods of inactivity. +//! +//! To wake the device from HIB mode: +//! 1. Assert the dedicated GPIOHIBWAKE pin (GPIO41) low to enable the +//! power-up of the device clock sources. +//! 2. Assert GPIOHIBWAKE pin high again. This triggers the power-up of the +//! rest of the device. +//! +//! To enter Hibernate mode in dual CPU put CPU2 in STANDBY mode first. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enterHibernateMode(void) +{ +#if defined(CPU2) + EALLOW; + // + // Configure the device to go into STANDBY mode when IDLE is executed. + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_STANDBY; + + EDIS; + asm(" IDLE"); +#elif defined(CPU1) + EALLOW; + + // + // Configure the device to go into Hibernate mode when IDLE is executed + // + HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREG(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint32_t)SYSCTL_LPMCR_LPM_M) | SYSCTL_LPM_HIB; + + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSPLLCTL1) &= + ~(SYSCTL_SYSPLLCTL1_PLLCLKEN | SYSCTL_SYSPLLCTL1_PLLEN); + SYSCTL_REGWRITE_DELAY; + + EDIS; + +#ifndef _DUAL_HEADERS + IDLE; +#else + IDLE_ASM; +#endif +#endif +} + +//***************************************************************************** +//! Enables a pin to wake up the device from the following mode(s): +//! - STANDBY +//! - HALT +//! +//! \param pin is the identifying number of the pin. +//! +//! This function connects a pin to the LPM circuit, allowing an event on the +//! pin to wake up the device when when it is in following mode(s): +//! - STANDBY +//! - HALT +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are capable of +//! being connected to the LPM circuit. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableLPMWakeupPin(uint32_t pin) +{ + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(pin <= 63U); + + pinMask = 1UL << (pin % 32U); + + EALLOW; + + if(pin < 32U) + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL0) |= pinMask; + } + else + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL1) |= pinMask; + } + + EDIS; +} + +//***************************************************************************** +//! Disables a pin to wake up the device from the following mode(s): +//! - STANDBY +//! - HALT +//! +//! \param pin is the identifying number of the pin. +//! +//! This function disconnects a pin to the LPM circuit, disallowing an event on +//! the pin to wake up the device when when it is in following mode(s): +//! - STANDBY +//! - HALT +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are valid. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableLPMWakeupPin(uint32_t pin) +{ + uint32_t pinMask; + + // + // Check the arguments. + // + ASSERT(pin <= 63U); + + pinMask = 1UL << (pin % 32U); + + EALLOW; + + if(pin < 32U) + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL0) &= ~pinMask; + } + else + { + HWREG(CPUSYS_BASE + SYSCTL_O_GPIOLPMSEL1) &= ~pinMask; + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the number of cycles to qualify an input on waking from STANDBY mode. +//! +//! \param cycles is the number of OSCCLK cycles. +//! +//! This function sets the number of OSCCLK clock cycles used to qualify the +//! selected inputs when waking from STANDBY mode. The \e cycles parameter +//! should be passed a cycle count between 2 and 65 cycles inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setStandbyQualificationPeriod(uint16_t cycles) +{ + // + // Check the arguments. + // + ASSERT((cycles >= 2U) && (cycles <= 65U)); + + EALLOW; + + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) & + ~(uint16_t)SYSCTL_LPMCR_QUALSTDBY_M) | + ((cycles - 2U) << SYSCTL_LPMCR_QUALSTDBY_S); + + EDIS; +} + +//***************************************************************************** +// +//! Enable the device to wake from STANDBY mode upon a watchdog interrupt. +//! +//! \note In order to use this option, you must configure the watchdog to +//! generate an interrupt using SysCtl_setWatchdogMode(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogStandbyWakeup(void) +{ + EALLOW; + + // + // Set the bit enables the watchdog to wake up the device from STANDBY. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) |= SYSCTL_LPMCR_WDINTE; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the device from waking from STANDBY mode upon a watchdog interrupt. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdogStandbyWakeup(void) +{ + EALLOW; + + // + // Clear the bit enables the watchdog to wake up the device from STANDBY. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_LPMCR) &= ~SYSCTL_LPMCR_WDINTE; + + EDIS; +} + +//***************************************************************************** +// +//! Enable the watchdog to run while in HALT mode. +//! +//! This function configures the watchdog to continue to run while in HALT +//! mode. Additionally, INTOSC1 and INTOSC2 are not powered down when the +//! system enters HALT mode. By default the watchdog is gated when the system +//! enters HALT. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogInHalt(void) +{ + EALLOW; + + // + // Set the watchdog HALT mode ignore bit. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) |= SYSCTL_CLKSRCCTL1_WDHALTI; + SYSCTL_CLKSRCCTL_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Disable the watchdog from running while in HALT mode. +//! +//! This function gates the watchdog when the system enters HALT mode. INTOSC1 +//! and INTOSC2 will be powered down. This is the default behavior of the +//! device. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdogInHalt(void) +{ + EALLOW; + + // + // Clear the watchdog HALT mode ignore bit. + // + HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL1) &= ~SYSCTL_CLKSRCCTL1_WDHALTI; + SYSCTL_CLKSRCCTL_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Configures whether the watchdog generates a reset or an interrupt signal. +//! +//! \param mode is a flag to select the watchdog mode. +//! +//! This function configures the action taken when the watchdog counter reaches +//! its maximum value. When the \e mode parameter is +//! \b SYSCTL_WD_MODE_INTERRUPT, the watchdog is enabled to generate a watchdog +//! interrupt signal and disables the generation of a reset signal. This will +//! allow the watchdog module to wake up the device from IDLE +//! or STANDBY if desired (see SysCtl_enableWatchdogStandbyWakeup()). +//! +//! When the \e mode parameter is \b SYSCTL_WD_MODE_RESET, the watchdog will +//! be put into reset mode and generation of a watchdog interrupt signal will +//! be disabled. This is how the watchdog is configured by default. +//! +//! \note Check the status of the watchdog interrupt using +//! SysCtl_isWatchdogInterruptActive() before calling this function. If the +//! interrupt is still active, switching from interrupt mode to reset mode will +//! immediately reset the device. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogMode(SysCtl_WDMode mode) +{ + EALLOW; + + // + // Either set or clear the WDENINT bit to that will determine whether the + // watchdog will generate a reset signal or an interrupt signal. Take care + // not to write a 1 to WDOVERRIDE. + // + if(mode == SYSCTL_WD_MODE_INTERRUPT) + { + HWREGH(WD_BASE + SYSCTL_O_SCSR) = + (HWREGH(WD_BASE + SYSCTL_O_SCSR) & ~SYSCTL_SCSR_WDOVERRIDE) | + SYSCTL_SCSR_WDENINT; + } + else + { + HWREGH(WD_BASE + SYSCTL_O_SCSR) &= ~(SYSCTL_SCSR_WDENINT | + SYSCTL_SCSR_WDOVERRIDE); + } + + EDIS; +} + +//***************************************************************************** +// +//! Gets the status of the watchdog interrupt signal. +//! +//! This function returns the status of the watchdog interrupt signal. If the +//! interrupt is active, this function will return \b true. If \b false, the +//! interrupt is NOT active. +//! +//! \note Make sure to call this function to ensure that the interrupt is not +//! active before making any changes to the configuration of the watchdog to +//! prevent any unexpected behavior. For instance, switching from interrupt +//! mode to reset mode while the interrupt is active will immediately reset the +//! device. +//! +//! \return \b true if the interrupt is active and \b false if it is not. +// +//***************************************************************************** +static inline bool +SysCtl_isWatchdogInterruptActive(void) +{ + // + // If the status bit is cleared, the WDINTn signal is active. + // + return((HWREGH(WD_BASE + SYSCTL_O_SCSR) & SYSCTL_SCSR_WDINTS) == 0U); +} + +//***************************************************************************** +// +//! Disables the watchdog. +//! +//! This function disables the watchdog timer. Note that the watchdog timer is +//! enabled on reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableWatchdog(void) +{ + EALLOW; + + // + // Set the disable bit. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) |= SYSCTL_WD_CHKBITS | SYSCTL_WDCR_WDDIS; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Enables the watchdog. +//! +//! This function enables the watchdog timer. Note that the watchdog timer is +//! enabled on reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdog(void) +{ + EALLOW; + + // + // Clear the disable bit. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = (HWREGH(WD_BASE + SYSCTL_O_WDCR) & + ~SYSCTL_WDCR_WDDIS) | SYSCTL_WD_CHKBITS; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Checks if the watchdog is enabled or not +//! +//! This function returns the watchdog status whether it is enabled or disabled +//! +//! \return \b true if the watchdog is enabled & \b false if the watchdog is +//! disabled +// +//***************************************************************************** +static inline bool +SysCtl_isWatchdogEnabled(void) +{ + + // + // Get the watchdog enable status + // + return ((HWREGH(WD_BASE + SYSCTL_O_WDCR) & SYSCTL_WDCR_WDDIS) == 0U); +} + +//***************************************************************************** +// +//! Services the watchdog. +//! +//! This function resets the watchdog. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_serviceWatchdog(void) +{ + EALLOW; + + // + // Enable the counter to be reset and then reset it. + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_ENRSTKEY; + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_RSTKEY; + + EDIS; +} + +//***************************************************************************** +// +//! Writes the first key to enter the watchdog reset. +//! +//! This function writes the first key to enter the watchdog reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableWatchdogReset(void) +{ + EALLOW; + + // + // Enable the counter to be reset + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_ENRSTKEY; + + EDIS; +} + +//***************************************************************************** +// +//! Writes the second key to reset the watchdog. +//! +//! This function writes the second key to reset the watchdog. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetWatchdog(void) +{ + EALLOW; + + // + // Reset the watchdog counter + // + HWREGH(WD_BASE + SYSCTL_O_WDKEY) = SYSCTL_WD_RSTKEY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up watchdog clock (WDCLK) prescaler. +//! +//! \param prescaler is the value that configures the watchdog clock relative +//! to the value from the pre-divider. +//! +//! This function sets up the watchdog clock (WDCLK) prescaler. The +//! \e prescaler parameter divides INTOSC1 down to WDCLK. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogPrescaler(SysCtl_WDPrescaler prescaler) +{ + uint16_t regVal; + + regVal = (uint16_t)prescaler | (uint16_t)SYSCTL_WD_CHKBITS; + + EALLOW; + + // + // Write the prescaler to the appropriate register. + // + HWREGH(WD_BASE + SYSCTL_O_WDCR) = (HWREGH(WD_BASE + SYSCTL_O_WDCR) & + ~(SYSCTL_WDCR_WDPS_M)) | regVal; + SYSCTL_REGWRITE_DELAY; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the watchdog counter value. +//! +//! \return Returns the current value of the 8-bit watchdog counter. If this +//! count value overflows, a watchdog output pulse is generated. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getWatchdogCounterValue(void) +{ + // + // Read and return the value of the watchdog counter. + // + return(HWREGH(WD_BASE + SYSCTL_O_WDCNTR)); +} + +//***************************************************************************** +// +//! Gets the watchdog reset status. +//! +//! This function returns the watchdog reset status. If this function returns +//! \b true, that indicates that a watchdog reset generated the last reset +//! condition. Otherwise, it was an external device or power-up reset +//! condition. +//! +//! \return Returns \b true if the watchdog generated the last reset condition. +// +//***************************************************************************** +static inline bool +SysCtl_getWatchdogResetStatus(void) +{ + // + // Read and return the status of the watchdog reset status flag. + // + return((HWREGH(CPUSYS_BASE + SYSCTL_O_RESC) & SYSCTL_RESC_WDRSN) != 0U); +} + +//***************************************************************************** +// +//! Clears the watchdog reset status. +//! +//! This function clears the watchdog reset status. To check if it was set +//! first, see SysCtl_getWatchdogResetStatus(). +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearWatchdogResetStatus(void) +{ + EALLOW; + + // + // Read and return the status of the watchdog reset status flag. + // + HWREGH(CPUSYS_BASE + SYSCTL_O_RESC) = SYSCTL_RESC_WDRSN; + + EDIS; +} + +//***************************************************************************** +// +//! Set the minimum threshold value for windowed watchdog +//! +//! \param value is the value to set the window threshold +//! +//! This function sets the minimum threshold value used to define the lower +//! limit of the windowed watchdog functionality. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setWatchdogWindowValue(uint16_t value) +{ + EALLOW; + + // + // Clear the windowed value + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) &= ~SYSCTL_WDWCR_MIN_M; + + // + // Set the windowed value + // + HWREGH(WD_BASE + SYSCTL_O_WDWCR) |= (value & SYSCTL_WDWCR_MIN_M); + + EDIS; +} + +//***************************************************************************** +// +//! Clears the watchdog override. +//! +//! This function clears the watchdog override and locks the watchdog timer +//! module to remain in its prior state which could be either enable /disable. +//! The watchdog timer will remain in this state until the next system reset. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearWatchdogOverride(void) +{ + EALLOW; + + HWREGH(WD_BASE + SYSCTL_O_SCSR) |= SYSCTL_SCSR_WDOVERRIDE; + + EDIS; +} + +//***************************************************************************** +// +//! Enable the NMI Global interrupt bit +//! +//! \b Note: This bit should be set after the device security related +//! initialization is complete. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableNMIGlobalInterrupt(void) +{ + EALLOW; + + HWREGH(NMI_BASE + NMI_O_CFG) |= NMI_CFG_NMIE; + + EDIS; +} + +//***************************************************************************** +// +//! Read NMI interrupts. +//! +//! Read the current state of NMI interrupt. +//! +//! \return \b true if NMI interrupt is triggered, \b false if not. +// +//***************************************************************************** +static inline bool +SysCtl_getNMIStatus(void) +{ + // + // Read and return the current value of the NMI flag register, masking out + // all but the NMI bit. + // + return((HWREGH(NMI_BASE + NMI_O_FLG) & NMI_FLG_NMIINT) != 0U); +} + +//***************************************************************************** +// +//! Read NMI Flags. +//! +//! Read the current state of individual NMI interrupts +//! +//! \return Value of NMIFLG register. These defines are provided to decode +//! the value: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIFlagStatus(void) +{ + // + // Read and return the current value of the NMI flag register. + // + return(HWREGH(NMI_BASE + NMI_O_FLG)); +} + +//***************************************************************************** +// +//! Check if the individual NMI interrupts are set. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Check if interrupt flags corresponding to the passed in bit mask are +//! asserted. +//! +//! \return \b true if any of the NMI asked for in the parameter bit mask +//! is set. \b false if none of the NMI requested in the parameter bit mask are +//! set. +// +//***************************************************************************** +static inline bool +SysCtl_isNMIFlagSet(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + // + // Read the flag register and return true if any of them are set. + // + return((HWREGH(NMI_BASE + NMI_O_FLG) & nmiFlags) != 0U); +} + +//***************************************************************************** +// +//! Function to clear individual NMI interrupts. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Clear NMI interrupt flags that correspond with the passed in bit mask. +//! +//! \b Note: The NMI Interrupt flag is always cleared by default and +//! therefore doesn't have to be included in the bit mask. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearNMIStatus(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + EALLOW; + + // + // Clear the individual flags as well as NMI Interrupt flag + // + HWREGH(NMI_BASE + NMI_O_FLGCLR) = nmiFlags; + HWREGH(NMI_BASE + NMI_O_FLGCLR) = NMI_FLG_NMIINT; + + EDIS; +} + +//***************************************************************************** +// +//! Clear all the NMI Flags that are currently set. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_clearAllNMIFlags(void) +{ + uint16_t nmiFlags; + + // + // Read the flag status register and then write to the clear register, + // clearing all the flags that were returned plus the NMI flag. + // + EALLOW; + + nmiFlags = SysCtl_getNMIFlagStatus(); + HWREGH(NMI_BASE + NMI_O_FLGCLR) = nmiFlags; + HWREGH(NMI_BASE + NMI_O_FLGCLR) = NMI_FLG_NMIINT; + + EDIS; +} + +//***************************************************************************** +// +//! Function to force individual NMI interrupt fail flags +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_forceNMIFlags(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + EALLOW; + + // + // Set the Flags for the individual interrupts in the NMI flag + // force register + // + HWREGH(NMI_BASE + NMI_O_FLGFRC) |= nmiFlags; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the NMI watchdog counter value. +//! +//! \b Note: The counter is clocked at the SYSCLKOUT rate. +//! +//! \return Returns the NMI watchdog counter register's current value. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIWatchdogCounter(void) +{ + // + // Read and return the NMI watchdog counter register's value. + // + return(HWREGH(NMI_BASE + NMI_O_WDCNT)); +} + +//***************************************************************************** +// +//! Sets the NMI watchdog period value. +//! +//! \param wdPeriod is the 16-bit value at which a reset is generated. +//! +//! This function writes to the NMI watchdog period register that holds the +//! value to which the NMI watchdog counter is compared. When the two registers +//! match, a reset is generated. By default, the period is 0xFFFF. +//! +//! \note If a value smaller than the current counter value is passed into the +//! \e wdPeriod parameter, a NMIRSn will be forced. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setNMIWatchdogPeriod(uint16_t wdPeriod) +{ + EALLOW; + + // + // Write to the period register. + // + HWREGH(NMI_BASE + NMI_O_WDPRD) = wdPeriod; + + EDIS; +} + +//***************************************************************************** +// +//! Gets the NMI watchdog period value. +//! +//! \return Returns the NMI watchdog period register's current value. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getNMIWatchdogPeriod(void) +{ + // + // Read and return the NMI watchdog period register's value. + // + return(HWREGH(NMI_BASE + NMI_O_WDPRD)); +} + +//***************************************************************************** +// +//! Read NMI Shadow Flags. +//! +//! Read the current state of individual NMI interrupts +//! +//! \return Value of NMISHDFLG register. These defines are provided to decode +//! the value: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +// +//***************************************************************************** +static inline uint32_t +SysCtl_getNMIShadowFlagStatus(void) +{ + // + // Read and return the current value of the NMI shadow flag register. + // + return(HWREGH(NMI_BASE + NMI_O_SHDFLG)); +} + +//***************************************************************************** +// +//! Check if the individual NMI shadow flags are set. +//! +//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear. +//! The bit format of this parameter is same as of the NMIFLG register. These +//! defines are provided: +//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag +//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag +//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag +//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_CPU2HWBISTERR - HW BIST Error NMI Flag +//! - \b SYSCTL_NMI_PIEVECTERR - PIE Vector Fetch Error Flag +//! - \b SYSCTL_NMI_CLBNMI - Configurable Logic Block NMI Flag +//! - \b SYSCTL_NMI_CPU2WDRSN - CPU2 WDRSn Reset Indication Flag +//! - \b SYSCTL_NMI_CPU2NMIWDRSN - CPU2 NMIWDRSn Reset Indication Flag +//! +//! Check if interrupt flags corresponding to the passed in bit mask are +//! asserted. +//! +//! \return \b true if any of the NMI asked for in the parameter bit mask +//! is set. \b false if none of the NMI requested in the parameter bit mask are +//! set. +// +//***************************************************************************** +static inline bool +SysCtl_isNMIShadowFlagSet(uint16_t nmiFlags) +{ + // + // Check the arguments. + // Make sure if reserved bits are not set in nmiFlags. + // + ASSERT((nmiFlags & ~( + SYSCTL_NMI_NMIINT | + SYSCTL_NMI_CLOCKFAIL | + SYSCTL_NMI_RAMUNCERR | + SYSCTL_NMI_FLUNCERR | + SYSCTL_NMI_CPU1HWBISTERR | + SYSCTL_NMI_CPU2HWBISTERR | + SYSCTL_NMI_PIEVECTERR | + SYSCTL_NMI_CLBNMI | + SYSCTL_NMI_CPU2WDRSN | + SYSCTL_NMI_CPU2NMIWDRSN + )) == 0U); + + // + // Read the flag register and return true if any of them are set. + // + return((HWREGH(NMI_BASE + NMI_O_SHDFLG) & nmiFlags) != 0U); +} + +//***************************************************************************** +// +//! Enable the missing clock detection (MCD) Logic +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) &= ~(SYSCTL_MCDCR_MCLKOFF); + + EDIS; +} + +//***************************************************************************** +// +//! Disable the missing clock detection (MCD) Logic +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_MCLKOFF; + + EDIS; +} + +//***************************************************************************** +// +//! Get the missing clock detection Failure Status +//! +//! \note A failure means the oscillator clock is missing +//! +//! \return Returns \b true if a failure is detected or \b false if a +//! failure isn't detected +// +//***************************************************************************** +static inline bool +SysCtl_isMCDClockFailureDetected(void) +{ + // + // Check the status bit to determine failure + // + return((HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) & SYSCTL_MCDCR_MCLKSTS) != 0U); +} + +//***************************************************************************** +// +//! Reset the missing clock detection logic after clock failure +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_resetMCD(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_MCLKCLR; + + EDIS; +} + +//***************************************************************************** +// +//! Re-connect missing clock detection clock source to stop simulating clock +//! failure +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_connectMCDClockSource(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) &= ~(SYSCTL_MCDCR_OSCOFF); + + EDIS; +} + +//***************************************************************************** +// +//! Disconnect missing clock detection clock source to simulate clock failure. +//! This is for testing the MCD functionality. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disconnectMCDClockSource(void) +{ + EALLOW; + + HWREGH(CLKCFG_BASE + SYSCTL_O_MCDCR) |= SYSCTL_MCDCR_OSCOFF; + + EDIS; +} + +//***************************************************************************** +// +//! Configures the sync input source for the ePWM and eCAP signals. +//! +//! \param syncInput is the sync input being configured +//! \param syncSrc is sync input source selection. +//! +//! This function configures the sync input source for the ePWM and eCAP +//! modules. The \e syncInput parameter is the sync input being configured. It +//! should be passed a value of \b SYSCTL_SYNC_IN_XXXX, where XXXX is the ePWM +//! or eCAP instance the sync signal is entering. +//! +//! The \e syncSrc parameter is the sync signal selected as the source of the +//! sync input. It should be passed a value of \b SYSCTL_SYNC_IN_SRC_XXXX, +//! XXXX is a sync signal coming from an ePWM, eCAP or external sync output. +//! where For example, a \e syncInput value of \b SYSCTL_SYNC_IN_ECAP1 and a +//! \e syncSrc value of \b SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT will make the +//! EPWM1SYNCOUT signal drive eCAP1's SYNCIN signal. +//! +//! Note that some \e syncSrc values are only valid for certain values of +//! \e syncInput. See device technical reference manual for details on +//! time-base counter synchronization. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setSyncInputConfig(SysCtl_SyncInput syncInput, + SysCtl_SyncInputSource syncSrc) +{ + uint32_t clearMask; + + // + // Write the input sync source selection to the appropriate register. + // + EALLOW; + clearMask = (uint32_t)SYSCTL_SYNCSELECT_SYNCIN_M << (uint32_t)syncInput; + + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) = + (HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) & ~clearMask) | + ((uint32_t)syncSrc << (uint32_t)syncInput); + + EDIS; +} +//***************************************************************************** +// +//! Configures the sync output source. +//! +//! \param syncSrc is sync output source selection. +//! +//! This function configures the sync output source from the ePWM modules. The +//! \e syncSrc parameter is a value \b SYSCTL_SYNC_OUT_SRC_XXXX, where XXXX is +//! a sync signal coming from an ePWM such as SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setSyncOutputConfig(SysCtl_SyncOutputSource syncSrc) +{ + // + // Write the sync output source selection to the appropriate register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) = + (HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSELECT) & + ~((uint32_t)SYSCTL_SYNCSELECT_SYNCOUT_M)) | + ((uint32_t)syncSrc << SYSCTL_SYNCSELECT_SYNCOUT_S); + EDIS; + +} +//***************************************************************************** +// +//! Enables ePWM SOC signals to drive an external (off-chip) ADCSOC signal. +//! +//! \param adcsocSrc is a bit field of the selected signals to be enabled +//! +//! This function configures which ePWM SOC signals are enabled as a source for +//! either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical OR +//! of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different +//! signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_enableExtADCSOCSource(uint32_t adcsocSrc) +{ + // + // Set the bits that correspond to signal to be enabled. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_ADCSOCOUTSELECT) |= adcsocSrc; + EDIS; +} + +//***************************************************************************** +// +//! Disables ePWM SOC signals from driving an external ADCSOC signal. +//! +//! \param adcsocSrc is a bit field of the selected signals to be disabled +//! +//! This function configures which ePWM SOC signals are disabled as a source +//! for either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical +//! OR of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different +//! signals. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_disableExtADCSOCSource(uint32_t adcsocSrc) +{ + // + // Clear the bits that correspond to signal to be disabled. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_ADCSOCOUTSELECT) &= ~adcsocSrc; + EDIS; +} + +//***************************************************************************** +// +//! Locks the SOC Select of the Trig X-BAR. +//! +//! This function locks the external ADC SOC select of the Trig X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockExtADCSOCSelect(void) +{ + // + // Lock the ADCSOCOUTSELECT bit of the SYNCSOCLOCK register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSOCLOCK) = + SYSCTL_SYNCSOCLOCK_ADCSOCOUTSELECT; + EDIS; +} + +//***************************************************************************** +// +//! Configures whether the dual ported bridge is connected with DMA or +//! CLA as the secondary controller. +//! +//! \param periFrame1Config indicates whether CLA or DMA is configured as +//! secondary controller on peripheral frame 1. +//! \param periFrame2Config indicates whether CLA or DMA is configured as +//! secondary controller on peripheral frame 2. +//! +//! One of the following values can be passed as parameter. +//! \b SYSCTL_SEC_CONTROLLER_CLA +//! \b SYSCTL_SEC_CONTROLLER_DMA +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectSecController(uint16_t periFrame1Config, uint16_t periFrame2Config) +{ + EALLOW; + + HWREG(CPUSYS_BASE + SYSCTL_O_SECMSEL) = + (((periFrame1Config << SYSCTL_SECMSEL_PF1SEL_S) & + SYSCTL_SECMSEL_PF1SEL_M) | + ((periFrame2Config << SYSCTL_SECMSEL_PF2SEL_S) & + SYSCTL_SECMSEL_PF2SEL_M)); + + EDIS; +} + +//***************************************************************************** +// +//! Locks the Sync Select of the Trig X-BAR. +//! +//! This function locks Sync Input and Output Select of the Trig X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockSyncSelect(void) +{ + // + // Lock the SYNCSELECT register. + // + EALLOW; + HWREG(SYNCSOC_BASE + SYSCTL_O_SYNCSOCLOCK) = SYSCTL_SYNCSOCLOCK_SYNCSELECT; + EDIS; +} +//***************************************************************************** +// +//! Configures whether a peripheral is connected to CPU1 or CPU2. +//! +//! \param peripheral is the peripheral for which CPU needs to be configured. +//! \param cpuInst is the CPU to which the peripheral instance need to be +//! connected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeriphInstance +//! +//! The \e cpuInst parameter can have one the following values: +//! - \b SYSCTL_CPUSEL_CPU1 - to connect to CPU1 +//! - \b SYSCTL_CPUSEL_CPU2 - to connect to CPU2 +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectCPUForPeripheralInstance(SysCtl_CPUSelPeriphInstance peripheral, + SysCtl_CPUSel cpuInst) +{ + uint16_t regIndex; + uint16_t bitIndex; + + // + // Identify the register index and bit position + // + regIndex = 2U * ((uint16_t)peripheral & SYSCTL_PERIPH_REG_M); + bitIndex = ((uint16_t)peripheral & SYSCTL_PERIPH_BIT_M) >> + SYSCTL_PERIPH_BIT_S; + + EALLOW; + + // + // Configure the CPU owner for the specified peripheral instance + // + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + regIndex) = + (HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + regIndex) & ~(1UL << bitIndex)) | + ((uint32_t)cpuInst << bitIndex); + + EDIS; + +} +//***************************************************************************** +// +//! Configures whether a peripheral is connected to CPU1 or CPU2. +//! +//! \param peripheral is the peripheral for which CPU needs to be configured. +//! \param peripheralInst is the instance for which CPU needs to be configured. +//! \param cpuInst is the CPU to which the peripheral instance need to be +//! connected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeripheral +//! +//! The \e peripheralInst parameter is the instance number for example +//! 1 for EPWM1, 2 for EPWM2 so on.For instances which are named with alphabets +//! (instead of numbers) the following convention needs to be followed. +//! 1 for A (SPI_A), 2 for B (SPI_B), 3 for C (SPI_C) so on... +//! +//! The \e cpuInst parameter can have one the following values: +//! - \b SYSCTL_CPUSEL_CPU1 - to connect to CPU1 +//! - \b SYSCTL_CPUSEL_CPU2 - to connect to CPU2 +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \note This function is retained for compatibility puposes. Recommended to +//! to use the function \e SysCtl_selectCPUForPeripheralInstance() +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_selectCPUForPeripheral(SysCtl_CPUSelPeripheral peripheral, + uint16_t peripheralInst, SysCtl_CPUSel cpuInst) +{ + uint32_t tempValue; + uint16_t shift; + + if(SYSCTL_CPUSEL14_DAC == peripheral) + { + shift = peripheralInst + SYSCTL_CPUSEL_DAC_S - 1U; + } + else + { + shift = peripheralInst - 1U; + } + + tempValue = + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + ((uint32_t)peripheral * 2U)) & + (~(1UL << shift)); + + EALLOW; + HWREG(DEVCFG_BASE + SYSCTL_O_CPUSEL0 + ((uint32_t)peripheral * 2U)) = + tempValue | ((uint32_t)cpuInst << shift); + EDIS; +} +//***************************************************************************** +// +//! Get the Device Silicon Revision ID +//! +//! This function returns the silicon revision ID for the device. +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Returns the silicon revision ID value. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getDeviceRevision(void) +{ + // + // Returns the device silicon revision ID + // + return(HWREG(DEVCFG_BASE + SYSCTL_O_REVID)); +} + +//***************************************************************************** +// +//! Locks the CPU select registers for the peripherals +//! +//! \param peripheral is the peripheral for which CPU needs to be selected. +//! +//! The \e peripheral parameter can have one enumerated value from +//! SysCtl_CPUSelPeripheral +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_lockCPUSelectRegs(SysCtl_CPUSelPeripheral peripheral) +{ + EALLOW; + HWREG(DEVCFG_BASE + SYSCTL_O_DEVCFGLOCK1) |= (1UL << (uint32_t)peripheral); + EDIS; +} + + +//***************************************************************************** +// +//! Gets the error status of the Efuse +//! +//! The function provides both the Efuse Autoload & the Efuse Self Test +//! Error Status. +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Fuse Error status. +// +//***************************************************************************** +static inline uint16_t +SysCtl_getEfuseError(void) +{ + return(HWREGH(DEVCFG_BASE + SYSCTL_O_FUSEERR)); +} + +//***************************************************************************** +// +//! Sets up XCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the XCLK divider. There is only one +//! divider that scales INTOSC1 to XCLK. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_XClkDivider +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setXClk(SysCtl_XClkDivider divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_XCLKOUTDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_XCLKOUTDIVSEL) & + ~(SYSCTL_XCLKOUTDIVSEL_XCLKOUTDIV_M)) | + (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up PLLSYSCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the PLLSYSCLK divider. There is only one +//! divider that scales PLLSYSCLK to generate the system clock. +//! +//! The \e divider parameter can have one value from the set below: +//! 0x0 = /1 +//! 0x1 = /2 +//! 0x2 = /4 (default on reset) +//! 0x3 = /6 +//! 0x4 = /8 +//! ...... +//! 0x3F =/126 +//! +//! \return None. +//! +//! \note Please make sure to check if the PLL is locked and valid using the +//! SysCtl_isPLLValid() before setting the divider. +// +//***************************************************************************** +static inline void +SysCtl_setPLLSysClk(uint16_t divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_SYSCLKDIVSEL) & + ~(SYSCTL_SYSCLKDIVSEL_PLLSYSCLKDIV_M)) | divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up AUXPLLCLK divider. +//! +//! \param divider is the value that configures the divider. +//! +//! This function sets up the AUXPLLCLK divider. There is only one +//! divider that scales AUXPLLCLK to generate the system clock. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_AuxPLLClkDivider +//! +//! \return None. +//! +//! \note Please make sure to check if the PLL is locked and valid using the +//! SysCtl_isPLLValid() before setting the divider. +// +//***************************************************************************** +static inline void +SysCtl_setAuxPLLClk(SysCtl_AuxPLLClkDivider divider) +{ + // + // Clears the divider then configures it. + // + EALLOW; + HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) = + (HWREGH(CLKCFG_BASE + SYSCTL_O_AUXCLKDIVSEL) & + ~(SYSCTL_AUXCLKDIVSEL_AUXPLLDIV_M)) | (uint16_t)divider; + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Sets up CPU Timer 2 CLK source & divider. +//! +//! \param divider is the value that configures the divider. +//! \param source is the source for the clock divider +//! +//! This function sets up the CPU Timer 2 CLK divider based on the source that +//! is selected. There is only one divider that scales the "source" to +//! CPU Timer 2 CLK. +//! +//! The \e divider parameter can have one enumerated value from +//! SysCtl_Cputimer2ClkDivider +//! The \e source parameter can have one enumerated value from +//! SysCtl_Cputimer2ClkSource +//! +//! \return None. +// +//***************************************************************************** +static inline void +SysCtl_setCputimer2Clk(SysCtl_Cputimer2ClkDivider divider, + SysCtl_Cputimer2ClkSource source) +{ + // + // Clears the divider & the source, then configures it. + // + EALLOW; + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) = + (HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) & + ~(SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_M | + SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_M)); + SYSCTL_REGWRITE_DELAY; + + HWREGH(CPUSYS_BASE + SYSCTL_O_TMR2CLKCTL) |= + ((uint16_t)divider << SYSCTL_TMR2CLKCTL_TMR2CLKPRESCALE_S) | + ((uint16_t)source << SYSCTL_TMR2CLKCTL_TMR2CLKSRCSEL_S); + SYSCTL_REGWRITE_DELAY; + EDIS; +} + +//***************************************************************************** +// +//! Gets the PIE Vector Fetch Error Handler Routine Address. +//! +//! The function indicates the address of the PIE Vector Fetch Error +//! handler routine. +//! +//! \return Error Handler Address. +//! +//! \note Its the responsibility of user to initialize this register. If this +//! register is not initialized, a default error handler at address +//! 0x3fffbe will get executed. +// +//***************************************************************************** +static inline uint32_t +SysCtl_getPIEVErrAddr(void) +{ + return(HWREG(CPUSYS_BASE + SYSCTL_O_PIEVERRADDR)); +} + +//***************************************************************************** +// +//! Check if the Internal PHY is present or not for the USB module +//! +//! Provides the USB module Internal PHY presence +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return \b true if Internal USB PHY Module is present \b false if +//! Internal USB PHY Module is not present +// +//***************************************************************************** +static inline bool +SysCtl_isPresentUSBPHY(void) +{ + return((HWREG(DEVCFG_BASE + SYSCTL_O_PERCNF1) & + SYSCTL_PERCNF1_USB_A_PHY) != 0U); +} + +//***************************************************************************** +// +//! Get the device UID_UNIQUE value +//! +//! This function returns the device UID_UNIQUE value +//! +//! \return Returns the device UID_UNIQUE value +// +//***************************************************************************** +static inline uint32_t +SysCtl_getDeviceUID(void) +{ + // + // Returns the device UID_UNIQUE value + // + return(HWREG(UID_BASE + OTP_O_UID_UNIQUE)); +} + +//***************************************************************************** +// +//! Delays for a fixed number of cycles. +//! +//! \param count is the number of delay loop iterations to perform. +//! +//! This function generates a constant length delay using assembly code. The +//! loop takes 5 cycles per iteration plus 9 cycles of overhead. +//! +//! \note If count is equal to zero, the loop will underflow and run for a +//! very long time. +//! +//! \note Refer to the macro DEVICE_DELAY_US(x) in device.h which can be used to +//! insert a delay in microseconds. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_delay(uint32_t count); + +//***************************************************************************** +// +//! Calculates the system clock frequency (SYSCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK). +//! +//! This function determines the frequency of the system clock based on the +//! frequency of the oscillator clock source (from \e clockInHz) and the PLL +//! and clock divider configuration registers. +//! +//! \return Returns the system clock frequency. If a missing clock is detected, +//! the function will return the INTOSC1 frequency. This needs to be +//! corrected and cleared (see SysCtl_resetMCD()) before trying to call this +//! function again. +// +//***************************************************************************** +extern uint32_t +SysCtl_getClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Calculates the system auxiliary clock frequency (AUXPLLCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source +//! (AUXOSCCLK). +//! +//! This function determines the frequency of the auxiliary clock based on the +//! frequency of the oscillator clock source (from \e clockInHz) and the AUXPLL +//! and clock divider configuration registers. +//! +//! \return Returns the auxiliary clock frequency. +// +//***************************************************************************** +extern uint32_t +SysCtl_getAuxClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Configures the clocking of the device. +//! +//! \param config is the required configuration of the device clocking. +//! +//! This function configures the clocking of the device. The input crystal +//! frequency, oscillator to be used, use of the PLL, and the system clock +//! divider are all configured with this function. +//! +//! The \e config parameter is the OR of several different values, many of +//! which are grouped into sets where only one can be chosen. +//! +//! - The system clock divider is chosen with the macro \b SYSCTL_SYSDIV(x) +//! where x is either 1 or an even value up to 126. +//! +//! - The use of the PLL is chosen with either \b SYSCTL_PLL_ENABLE or +//! \b SYSCTL_PLL_DISABLE. +//! +//! - The integer multiplier is chosen \b SYSCTL_IMULT(x) where x is a value +//! from 1 to 127. +//! +//! - The fractional multiplier is chosen with either \b SYSCTL_FMULT_0, +//! \b SYSCTL_FMULT_1_4, \b SYSCTL_FMULT_1_2, or \b SYSCTL_FMULT_3_4. +//! +//! - The oscillator source chosen with \b SYSCTL_OSCSRC_OSC2, +//! \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! This function uses the watchdog as a monitor for the PLL. The user +//! watchdog settings will be modified and restored upon completion. Make sure +//! that the WDOVERRIDE bit isn't set before calling this function. Re-lock +//! attempt is carried out if either SLIP condition occurs or SYSCLK to input +//! clock ratio is off by 10%. +//! +//! This function uses the following resources to support PLL initialization: +//! - Watchdog +//! - CPU Timer 1 +//! - CPU Timer 2 +//! +//! +//! \note See your device errata for more details about locking the PLL. +//! +//! \return Returns \b false if a missing clock error is detected. This needs +//! to be cleared (see SysCtl_resetMCD()) before trying to call this function +//! again. Otherwise, returns \b true. +// +//***************************************************************************** +extern bool +SysCtl_setClock(uint32_t config); + +//***************************************************************************** +// +//! Configures the external oscillator for the clocking of the device. +//! +//! This function configures the external oscillator (XTAL) to be used for the +//! clocking of the device in crystal mode. It follows the procedure to turn on +//! the oscillator, wait for it to power up, and select it as the source of the +//! system clock. +//! +//! Please note that this function blocks while it waits for the XTAL to power +//! up. If the XTAL does not manage to power up properly, the function will +//! loop for a long time. It is recommended that you modify this function to +//! add an appropriate timeout and error-handling procedure. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectXTAL(void); + +//***************************************************************************** +// +//! Selects the oscillator to be used for the clocking of the device. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function configures the oscillator to be used in the clocking of the +//! device. The \e oscSource parameter may take a value of +//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! \sa SysCtl_turnOnOsc() +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectOscSource(uint32_t oscSource); + +//***************************************************************************** +// +//! Selects the oscillator to be used for the AUXPLL. +//! +//! \param oscSource is the oscillator source to be configured. +//! +//! This function configures the oscillator to be used in the clocking of the +//! AUXPLL. The \e oscSource parameter may take a value of +//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, or \b SYSCTL_OSCSRC_OSC1. +//! +//! \sa SysCtl_turnOnOsc() +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_selectOscSourceAuxPLL(uint32_t oscSource); + +//***************************************************************************** +// +//! Calculates the low-speed peripheral clock frequency (LSPCLK). +//! +//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK). +//! +//! This function determines the frequency of the low-speed peripheral clock +//! based on the frequency of the oscillator clock source (from \e clockInHz) +//! and the PLL and clock divider configuration registers. +//! +//! \return Returns the low-speed peripheral clock frequency. +// +//***************************************************************************** +extern uint32_t +SysCtl_getLowSpeedClock(uint32_t clockInHz); + +//***************************************************************************** +// +//! Get the device part parametric value +//! +//! \param parametric is the requested device parametric value +//! +//! This function gets the device part parametric value. +//! +//! The \e parametric parameter can have one the following enumerated values: +//! - \b SYSCTL_DEVICE_QUAL - Device Qualification Status +//! - \b SYSCTL_DEVICE_PINCOUNT - Device Pin Count +//! - \b SYSCTL_DEVICE_INSTASPIN - Device InstaSPIN Feature Set +//! - \b SYSCTL_DEVICE_FLASH - Device Flash size (KB) +//! - \b SYSCTL_DEVICE_PARTID - Device Part ID Format Revision +//! - \b SYSCTL_DEVICE_FAMILY - Device Family +//! - \b SYSCTL_DEVICE_PARTNO - Device Part Number +//! - \b SYSCTL_DEVICE_CLASSID - Device Class ID +//! +//! \note This API is applicable only for the CPU1 subsystem. +//! +//! \return Returns the specified parametric value. +// +//***************************************************************************** +extern uint16_t +SysCtl_getDeviceParametric(SysCtl_DeviceParametric parametric); + +//***************************************************************************** +// +//! Configures the auxiliary PLL for clocking USB. +//! +//! \param config is the required configuration of the device clocking. +//! +//! This function configures the clock source for auxiliary PLL, the integer +//! multiplier, fractional multiplier and divider. +//! +//! The \e config parameter is the OR of several different values, many of +//! which are grouped into sets where only one can be chosen. +//! +//! - The system clock divider is chosen with one of the following macros: +//! \b SYSCTL_AUXPLL_DIV_1, +//! \b SYSCTL_AUXPLL_DIV_2, +//! \b SYSCTL_AUXPLL_DIV_4, +//! \b SYSCTL_AUXPLL_DIV_8 +//! +//! - The use of the PLL is chosen with either \b SYSCTL_AUXPLL_ENABLE or +//! \b SYSCTL_AUXPLL_DISABLE. +//! +//! - The integer multiplier is chosen with \b SYSCTL_AUXPLL_IMULT(x) where x +//! is a value from 1 to 127. +//! +//! - The oscillator source chosen with one of +//! \b SYSCTL_AUXPLL_OSCSRC_OSC2, +//! \b SYSCTL_AUXPLL_OSCSRC_XTAL, +//! \b SYSCTL_AUXPLL_OSCSRC_AUXCLKIN, +//! +//! \note This function uses CPU Timer 2 to monitor a successful lock of the +//! AUXPLL. For this function to properly detect the PLL startup +//! SYSCLK >= 2*AUXPLLCLK after the AUXPLL is selected as the clocking source. +//! User configuration of CPU Timer 2 will be backed up and restored. +//! \note See your device errata for more details about locking the PLL. +//! +//! \return None. +// +//***************************************************************************** +extern void +SysCtl_setAuxClock(uint32_t config); + + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//**************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // SYSCTL_H diff --git a/gpio_driverlib_cpu1/device/driverlib/upp.c b/gpio_driverlib_cpu1/device/driverlib/upp.c new file mode 100644 index 0000000..a3fb8da --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/upp.c @@ -0,0 +1,298 @@ +//########################################################################### +// +// FILE: upp.c +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include +#include +#include "upp.h" + +//***************************************************************************** +// +// UPP_setDMAReadThreshold +// +//***************************************************************************** +void +UPP_setDMAReadThreshold(uint32_t base, UPP_DMAChannel channel, + UPP_ThresholdSize size) +{ + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Set DMA read threshold for channel I. + // + HWREGH(base + UPP_O_THCFG) = (HWREGH(base + UPP_O_THCFG) & + ~(uint16_t)UPP_THCFG_RDSIZEI_M) | + (uint16_t)size; + } + else + { + // + // Set DMA read threshold for channel Q. + // + HWREGH(base + UPP_O_THCFG) = (HWREGH(base + UPP_O_THCFG) & + ~(uint16_t)UPP_THCFG_RDSIZEQ_M) | + ((uint16_t)size << UPP_THCFG_RDSIZEQ_S); + } +} + +//***************************************************************************** +// +// UPP_setDMADescriptor +// +//***************************************************************************** +void +UPP_setDMADescriptor(uint32_t base, UPP_DMAChannel channel, + const UPP_DMADescriptor * const desc) +{ + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Sets DMA descriptors for channel I. + // + HWREG(base + UPP_O_CHIDESC0) = desc->addr; + HWREG(base + UPP_O_CHIDESC1) = ((uint32_t)desc->byteCount | + (((uint32_t)desc->lineCount) << + UPP_CHIDESC1_LCNT_S)); + HWREGH(base + UPP_O_CHIDESC2) = desc->lineOffset; + } + else + { + // + // Sets DMA descriptors for channel Q. + // + HWREG(base + UPP_O_CHQDESC0) = desc->addr; + HWREG(base + UPP_O_CHQDESC1) = ((uint32_t)desc->byteCount | + (((uint32_t)desc->lineCount) << + UPP_CHQDESC1_LCNT_S)); + HWREGH(base + UPP_O_CHQDESC2) = desc->lineOffset; + } +} + +//***************************************************************************** +// +// UPP_getDMAChannelStatus +// +//***************************************************************************** +void +UPP_getDMAChannelStatus(uint32_t base, UPP_DMAChannel channel, + UPP_DMAChannelStatus * const status) +{ + uint32_t cntStatus; + + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the current status for channel I. + // + cntStatus = HWREG(base + UPP_O_CHIST1); + status->curAddr = HWREG(base + UPP_O_CHIST0); + status->curByteCount = (uint16_t)(cntStatus & UPP_CHIDESC1_BCNT_M); + status->curLineCount = (uint16_t)(cntStatus >> UPP_CHIDESC1_LCNT_S); + } + else + { + // + // Return the current status for channel Q. + // + cntStatus = HWREG(base + UPP_O_CHQST1); + status->curAddr = HWREG(base + UPP_O_CHQST0); + status->curByteCount = (uint16_t)(cntStatus & UPP_CHQDESC1_BCNT_M); + status->curLineCount = (uint16_t)(cntStatus >> UPP_CHQDESC1_LCNT_S); + } +} + +//***************************************************************************** +// +// UPP_isDescriptorPending +// +//***************************************************************************** +bool +UPP_isDescriptorPending(uint32_t base, UPP_DMAChannel channel) +{ + bool status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the pend status for channel I descriptor. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_PEND) == UPP_CHIST2_PEND); + } + else + { + // + // Return the pend status for channel Q descriptor. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_PEND) == UPP_CHQST2_PEND); + } + return(status); +} + +//***************************************************************************** +// +// UPP_isDescriptorActive +// +//***************************************************************************** +bool +UPP_isDescriptorActive(uint32_t base, UPP_DMAChannel channel) +{ + bool status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Returns active status for channel I descriptor. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_ACT) == UPP_CHIST2_ACT); + } + else + { + // + // Returns active status for channel Q descriptor. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_ACT) == UPP_CHQST2_ACT); + } + return(status); +} + +//***************************************************************************** +// +// UPP_getDMAFIFOWatermark +// +//***************************************************************************** +uint16_t +UPP_getDMAFIFOWatermark(uint32_t base, UPP_DMAChannel channel) +{ + uint16_t status; + // + // Check the arguments. + // + ASSERT(UPP_isBaseValid(base)); + if(channel == UPP_DMA_CHANNEL_I) + { + // + // Return the watermark for FIFO block count for DMA Channel I. + // + status = ((HWREGH(base + UPP_O_CHIST2) & + (uint16_t)UPP_CHIST2_WM_M) >> UPP_CHIST2_WM_S); + } + else + { + // + // Return the watermark for FIFO block count for DMA Channel I. + // + status = ((HWREGH(base + UPP_O_CHQST2) & + (uint16_t)UPP_CHQST2_WM_M) >> UPP_CHQST2_WM_S); + } + return(status); +} + +//***************************************************************************** +// +// UPP_readRxMsgRAM +// +//***************************************************************************** +void +UPP_readRxMsgRAM(uint32_t rxBase, uint16_t array[], uint16_t length, + uint16_t offset) +{ + uint16_t i; + // + // Check the arguments. + // + ASSERT(UPP_isRxBaseValid(rxBase)); + ASSERT((length + offset) < UPP_RX_MSGRAM_MAX_SIZE); + + for(i = 0U; i < length; i++) + { + // + // Read one 16-bit word. + // + array[i] = HWREGH(rxBase + offset + i); + } +} + +//***************************************************************************** +// +// UPP_writeTxMsgRAM +// +//***************************************************************************** +void +UPP_writeTxMsgRAM(uint32_t txBase, const uint16_t array[], uint16_t length, + uint16_t offset) +{ + uint16_t i; + // + // Check the arguments. + // + ASSERT(UPP_isTxBaseValid(txBase)); + ASSERT((length + offset) < UPP_TX_MSGRAM_MAX_SIZE); + + for(i = 0U; i < length; i++) + { + // + // Write one 16-bit word. + // + HWREGH(txBase + offset + i) = array[i]; + } +} diff --git a/gpio_driverlib_cpu1/device/driverlib/upp.h b/gpio_driverlib_cpu1/device/driverlib/upp.h new file mode 100644 index 0000000..128d077 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/upp.h @@ -0,0 +1,1574 @@ +//########################################################################### +// +// FILE: upp.h +// +// TITLE: C28x uPP driver. +// +//########################################################################### +// +// +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef UPP_H +#define UPP_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup upp_api UPP +//! @{ +// +//***************************************************************************** + +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_upp.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Defines that can be passed as addr field of UPP_DMADescriptor to +// UPP_setDMADescriptor(). Since the addresses for Tx & Rx MSG RAMs are +// different for CPU & DMA views, these defines can be used as DMA descriptor +// addresses. +// +//***************************************************************************** +#define UPP_DMA_TX_MSGRAM_STARTADDR UPP_TX_MSG_RAM_BASE +#define UPP_DMA_RX_MSGRAM_STARTADDR 0x00007000U + +//***************************************************************************** +// +// Defines that can be used in user program as start address for CPU/CLA write +// to TX MSG RAM for transmitting data & for CPU/CLA read from RX MSG RAM for +// receiving data. Since the addresses for Tx & Rx MSG RAMs are different for +// CPU & DMA views, these defines can be used for CPU read/writes. +// +//***************************************************************************** +#define UPP_CPU_TX_MSGRAM_STARTADDR UPP_TX_MSG_RAM_BASE +#define UPP_CPU_RX_MSGRAM_STARTADDR UPP_RX_MSG_RAM_BASE + +//***************************************************************************** +// +// Defines to specify the size of the uPP Tx and Rx MSG RAMs. +// +//***************************************************************************** +#define UPP_TX_MSGRAM_MAX_SIZE 0x200U +#define UPP_RX_MSGRAM_MAX_SIZE 0x200U + +//***************************************************************************** +// +// Define to specify 32 cycle delay between software reset issue & release in +// UPP_performSoftReset(). +// +//***************************************************************************** +#ifndef UPP_32_CYCLE_NOP +#define UPP_32_CYCLE_NOP __asm(" RPT #31 || NOP") +#endif + +//***************************************************************************** +// +// Define to specify mask for setting emulation mode in UPP_setEmulationMode(). +// +//***************************************************************************** +#define UPP_SOFT_FREE_M ((uint16_t)UPP_PERCTL_SOFT | \ + (uint16_t)UPP_PERCTL_FREE) + +//***************************************************************************** +// +// Defines to specify masks for enabling/disabling uPP Tx/Rx control signals in +// UPP_setTxControlSignalMode() & UPP_setRxControlSignalMode() respectively. +// +//***************************************************************************** +#define UPP_TX_SIGNAL_MODE_M UPP_IFCFG_WAITA +#define UPP_RX_SIGNAL_MODE_M ((uint16_t)UPP_IFCFG_STARTA | \ + (uint16_t)UPP_IFCFG_ENAA) + +//***************************************************************************** +// +// Define to specify mask for configuring polarities for uPP control signals +// in UPP_setControlSignalPolarity(). +// +//***************************************************************************** +#define UPP_SIGNAL_POLARITY_M ((uint16_t)UPP_IFCFG_WAITPOLA | \ + (uint16_t)UPP_IFCFG_ENAPOLA | \ + (uint16_t)UPP_IFCFG_STARTPOLA) + +//***************************************************************************** +// +// Define to specify masks for returning interrupt status in +// UPP_getInterruptStatus() & UPP_getRawInterruptStatus(). +// +//***************************************************************************** +#define UPP_INT_M ((uint16_t)UPP_ENINTST_DPEI | (uint16_t)UPP_ENINTST_UOEI | \ + (uint16_t)UPP_ENINTST_EOWI | (uint16_t)UPP_ENINTST_EOLI | \ + (uint16_t)UPP_ENINTST_DPEQ | (uint16_t)UPP_ENINTST_UOEQ | \ + (uint16_t)UPP_ENINTST_EOWQ | (uint16_t)UPP_ENINTST_EOLQ) + +//***************************************************************************** +// +// Values that can be passed to UPP_enableInterrupt(), +// UPP_disableInterrupt() and UPP_clearInterruptStatus() as the +// intFlags parameter and returned by UPP_getInterruptStatus() & +// UPP_getRawInterruptStatus(). +// +//***************************************************************************** +#define UPP_INT_CHI_DMA_PROG_ERR 0x0001U //! +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_usb.h" +#include "debug.h" +#include "sysctl.h" +#include "usb.h" + +//***************************************************************************** +// +// Amount to shift the RX interrupt sources by in the flags used in the +// interrupt calls. +// +//***************************************************************************** +#define USB_INTEP_RX_SHIFT 16U + +//***************************************************************************** +// +// Amount to shift the RX endpoint status sources by in the flags used in the +// calls. +// +//***************************************************************************** +#define USB_RX_EPSTATUS_SHIFT 16U + +//***************************************************************************** +// +// Converts from an endpoint specifier to the offset of the endpoint's +// control/status registers. +// +//***************************************************************************** +#define EP_OFFSET(Endpoint) (Endpoint - 0x10U) + +//***************************************************************************** +// +// Sets one of the indexed registers. +// +// \param ui32Base specifies the USB module base address. +// \param ui32Endpoint is the endpoint index to target for this write. +// \param ui32IndexedReg is the indexed register to write to. +// \param ui8Value is the value to write to the register. +// +// This function is used to access the indexed registers for each endpoint. +// The only registers that are indexed are the FIFO configuration registers, +// which are not used after configuration. +// +// \return None. +// +//***************************************************************************** +static void +_USBIndexWrite(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32IndexedReg, uint32_t ui32Value, uint32_t ui32Size) +{ + uint32_t ui32Index; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == 0U) || (ui32Endpoint == 1U) || (ui32Endpoint == 2U) || + (ui32Endpoint == 3U)); + ASSERT((ui32Size == 1U) || (ui32Size == 2U)); + + // + // Save the old index in case it was in use. + // + ui32Index = HWREGB(ui32Base + USB_O_EPIDX); + + // + // Set the index. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Endpoint; + + // + // Determine the size of the register value. + // + if(ui32Size == 1) + { + // + // Set the value. + // + HWREGB(ui32Base + ui32IndexedReg) = ui32Value; + } + else + { + // + // Set the value. + // + HWREGH(ui32Base + ui32IndexedReg) = ui32Value; + } + + // + // Restore the old index in case it was in use. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Index; +} + +//***************************************************************************** +// +// Reads one of the indexed registers. +// +// \param ui32Base specifies the USB module base address. +// \param ui32Endpoint is the endpoint index to target for this write. +// \param ui32IndexedReg is the indexed register to write to. +// +// This function is used internally to access the indexed registers for each +// endpoint. The only registers that are indexed are the FIFO configuration +// registers, which are not used after configuration. +// +// \return The value in the register requested. +// +//***************************************************************************** +static uint32_t +_USBIndexRead(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32IndexedReg, uint32_t ui32Size) +{ + uint8_t ui8Index; + uint8_t ui8Value; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == 0) || (ui32Endpoint == 1) || (ui32Endpoint == 2) || + (ui32Endpoint == 3)); + ASSERT((ui32Size == 1) || (ui32Size == 2)); + + // + // Save the old index in case it was in use. + // + ui8Index = HWREGB(ui32Base + USB_O_EPIDX); + + // + // Set the index. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui32Endpoint; + + // + // Determine the size of the register value. + // + if(ui32Size == 1U) + { + // + // Get the value. + // + ui8Value = HWREGB(ui32Base + ui32IndexedReg); + } + else + { + // + // Get the value. + // + ui8Value = HWREGH(ui32Base + ui32IndexedReg); + } + + // + // Restore the old index in case it was in use. + // + HWREGB(ui32Base + USB_O_EPIDX) = ui8Index; + + // + // Return the register's value. + // + return(ui8Value); +} + +//***************************************************************************** +// +//! Puts the USB bus in a suspended state. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! When used in host mode, this function puts the USB bus in the suspended +//! state. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostSuspend(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send the suspend signaling to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_SUSPEND; +} + +//***************************************************************************** +// +//! Handles the USB bus reset condition. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies whether to start or stop signaling reset on the USB +//! bus. +//! +//! When this function is called with the \e bStart parameter set to \b true, +//! this function causes the start of a reset condition on the USB bus. +//! The caller must then delay at least 20ms before calling this function +//! again with the \e bStart parameter set to \b false. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostReset(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send a reset signal to the bus. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_RESET; + } + else + { + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_RESET; + } +} + +//***************************************************************************** +// +//! Handles the USB bus resume condition. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies if the USB controller is entering or leaving the +//! resume signaling state. +//! +//! When in device mode, this function brings the USB controller out of the +//! suspend state. This call must first be made with the \e bStart parameter +//! set to \b true to start resume signaling. The device application must +//! then delay at least 10ms but not more than 15ms before calling this +//! function with the \e bStart parameter set to \b false. +//! +//! When in host mode, this function signals devices to leave the suspend +//! state. This call must first be made with the \e bStart parameter set to +//! \b true to start resume signaling. The host application must then delay +//! at least 20ms before calling this function with the \e bStart parameter set +//! to \b false. This action causes the controller to complete the resume +//! signaling on the USB bus. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostResume(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Send a resume signal to the bus. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_RESUME; + } + else + { + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_RESUME; + } +} + +//***************************************************************************** +// +//! Returns the current speed of the USB device connected. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current speed of the USB bus in host mode. +//! +//! \b Example: Get the USB connection speed. +//! +//! \verbatim +//! // +//! // Get the connection speed of the device connected to the USB controller. +//! // +//! USBHostSpeedGet(USBA_BASE); +//! \endverbatim +//! +//! \note This function must only be called in host mode. +//! +//! \return Returns one of the following: \b USB_LOW_SPEED, \b USB_FULL_SPEED, +//! or \b USB_UNDEF_SPEED. +// +//***************************************************************************** +uint32_t +USBHostSpeedGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // If the Full Speed device bit is set, then this is a full speed device. + // + if(HWREGB(ui32Base + USB_O_DEVCTL) & USB_DEVCTL_FSDEV) + { + return(USB_FULL_SPEED); + } + + // + // If the Low Speed device bit is set, then this is a low speed device. + // + if(HWREGB(ui32Base + USB_O_DEVCTL) & USB_DEVCTL_LSDEV) + { + return(USB_LOW_SPEED); + } + + // + // The device speed is not known. + // + return(USB_UNDEF_SPEED); +} + +//***************************************************************************** +// +//! Disables control interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which control interrupts to disable. +//! +//! This function disables the control interrupts for the USB controller +//! specified by the \e ui32Base parameter. The \e ui32Flags parameter +//! specifies which control interrupts to disable. The flags passed in the +//! \e ui32Flags parameters must be the definitions that start with +//! \b USB_INTCTRL_* and not any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntDisableControl(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_INTCTRL_ALL)) == 0); + + // + // If any general interrupts were disabled then write the general interrupt + // settings out to the hardware. + // + if(ui32Flags & USB_INTCTRL_STATUS) + { + HWREGB(ui32Base + USB_O_IE) &= ~(ui32Flags & USB_INTCTRL_STATUS); + } + + // + // Disable the power fault interrupt. + // + if(ui32Flags & USB_INTCTRL_POWER_FAULT) + { + HWREG(ui32Base + USB_O_EPCIM) = 0U; + } + + // + // Disable the ID pin detect interrupt. + // + if(ui32Flags & USB_INTCTRL_MODE_DETECT) + { + HWREG(ui32Base + USB_O_IDVIM) = 0U; + } +} + +//***************************************************************************** +// +//! Enables control interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which control interrupts to enable. +//! +//! This function enables the control interrupts for the USB controller +//! specified by the \e ui32Base parameter. The \e ui32Flags parameter +//! specifies which control interrupts to enable. The flags passed in the +//! \e ui32Flags parameters must be the definitions that start with +//! \b USB_INTCTRL_* and not any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntEnableControl(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & (~USB_INTCTRL_ALL)) == 0U); + + // + // If any general interrupts were enabled, then write the general + // interrupt settings out to the hardware. + // + if(ui32Flags & USB_INTCTRL_STATUS) + { + HWREGB(ui32Base + USB_O_IE) |= ui32Flags; + } + + // + // Enable the power fault interrupt. + // + if(ui32Flags & USB_INTCTRL_POWER_FAULT) + { + HWREG(ui32Base + USB_O_EPCIM) = USB_EPCIM_PF; + } + + // + // Enable the ID pin detect interrupt. + // + if(ui32Flags & USB_INTCTRL_MODE_DETECT) + { + HWREG(ui32Base + USB_O_IDVIM) = USB_IDVIM_ID; + } +} + +//***************************************************************************** +// +//! Returns the control interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32IntStatusEP is a pointer to the variable which holds the +//! endpoint interrupt status from RXIS And TXIS. +//! +//! This function reads control interrupt status for a USB controller. This +//! call returns the current status for control interrupts only, the endpoint +//! interrupt status is retrieved by calling USBIntStatusEndpoint(). The bit +//! values returned are compared against the \b USB_INTCTRL_* values. +//! +//! The following are the meanings of all \b USB_INCTRL_ flags and the modes +//! for which they are valid. These values apply to any calls to +//! USBIntStatusControl(), USBIntEnableControl(), and USBIntDisableControl(). +//! Some of these flags are only valid in the following modes as indicated in +//! the parentheses: Host, Device, and OTG. +//! +//! - \b USB_INTCTRL_ALL - A full mask of all control interrupt sources. +//! - \b USB_INTCTRL_VBUS_ERR - A VBUS error has occurred (Host Only). +//! - \b USB_INTCTRL_SESSION - Session Start Detected on A-side of cable +//! (OTG Only). +//! - \b USB_INTCTRL_SESSION_END - Session End Detected (Device Only) +//! - \b USB_INTCTRL_DISCONNECT - Device Disconnect Detected (Host Only) +//! - \b USB_INTCTRL_CONNECT - Device Connect Detected (Host Only) +//! - \b USB_INTCTRL_SOF - Start of Frame Detected. +//! - \b USB_INTCTRL_BABBLE - USB controller detected a device signaling past +//! the end of a frame (Host Only) +//! - \b USB_INTCTRL_RESET - Reset signaling detected by device (Device Only) +//! - \b USB_INTCTRL_RESUME - Resume signaling detected. +//! - \b USB_INTCTRL_SUSPEND - Suspend signaling detected by device (Device +//! Only) +//! - \b USB_INTCTRL_MODE_DETECT - OTG cable mode detection has completed +//! (OTG Only) +//! - \b USB_INTCTRL_POWER_FAULT - Power Fault detected (Host Only) +//! +//! \note This call clears the source of all of the control status interrupts. +//! +//! \return Returns the status of the control interrupts for a USB controller. +//! This is the value of USBIS. +// +//***************************************************************************** +uint32_t +USBIntStatus(uint32_t ui32Base, uint32_t *pui32IntStatusEP) +{ + uint32_t ui32Status = 0U; + *pui32IntStatusEP = 0U; + uint32_t usbis = 0U; + uint32_t rxis = 0U; + uint32_t txis = 0U; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Do-While to make sure that all status registers are cleared before + // continuing. This eliminates the race condition which can cause the USB + // interrupt to stay high and never get triggered again. + // + do + { + // + // Get the general interrupt status. + // + usbis = (uint32_t)HWREGB(ui32Base + USB_O_IS); + + // + // Get the transmit interrupt status. + // + txis = (uint32_t)HWREGH(ui32Base + USB_O_TXIS); + + // + // Get the receive interrupt status. + // + rxis = (uint32_t)HWREGH(ui32Base + USB_O_RXIS); + + // + // Get the general interrupt status, these bits go into the lower 8 bits + // of the returned value. + // + ui32Status |= usbis; + + // + // Get the transmit interrupt status. + // + *pui32IntStatusEP |= txis; + + // + // Get the receive interrupt status, these bits go into the second byte + // of the returned value. + // + *pui32IntStatusEP |= ((uint32_t)rxis << USB_INTEP_RX_SHIFT); + + } while((usbis != 0x0000U) || (txis != 0x0000U) || (rxis != 0x0000U)); + + // + // Add the power fault status. + // + if(HWREG(ui32Base + USB_O_EPCISC) & USB_EPCISC_PF) + { + // + // Indicate a power fault was detected. + // + ui32Status |= USB_INTCTRL_POWER_FAULT; + + // + // Clear the power fault interrupt. + // + HWREGB(ui32Base + USB_O_EPCISC) |= USB_EPCISC_PF; + } + + if(HWREG(ui32Base + USB_O_IDVISC) & USB_IDVRIS_ID) + { + // + // Indicate an id detection. + // + ui32Status |= USB_INTCTRL_MODE_DETECT; + + // + // Clear the id detection interrupt. + // + HWREG(ui32Base + USB_O_IDVISC) |= USB_IDVRIS_ID; + } + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Returns the control interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function reads control interrupt status for a USB controller. This +//! call returns the current status for control interrupts only, the endpoint +//! interrupt status is retrieved by calling USBIntStatusEndpoint(). The bit +//! values returned are compared against the \b USB_INTCTRL_* values. +//! +//! The following are the meanings of all \b USB_INCTRL_ flags and the modes +//! for which they are valid. These values apply to any calls to +//! USBIntStatusControl(), USBIntEnableControl(), and USBIntDisableControl(). +//! Some of these flags are only valid in the following modes as indicated in +//! the parentheses: Host, Device, and OTG. +//! +//! - \b USB_INTCTRL_ALL - A full mask of all control interrupt sources. +//! - \b USB_INTCTRL_VBUS_ERR - A VBUS error has occurred (Host Only). +//! - \b USB_INTCTRL_SESSION - Session Start Detected on A-side of cable +//! (OTG Only). +//! - \b USB_INTCTRL_SESSION_END - Session End Detected (Device Only) +//! - \b USB_INTCTRL_DISCONNECT - Device Disconnect Detected (Host Only) +//! - \b USB_INTCTRL_CONNECT - Device Connect Detected (Host Only) +//! - \b USB_INTCTRL_SOF - Start of Frame Detected. +//! - \b USB_INTCTRL_BABBLE - USB controller detected a device signaling past +//! the end of a frame (Host Only) +//! - \b USB_INTCTRL_RESET - Reset signaling detected by device (Device Only) +//! - \b USB_INTCTRL_RESUME - Resume signaling detected. +//! - \b USB_INTCTRL_SUSPEND - Suspend signaling detected by device (Device +//! Only) +//! - \b USB_INTCTRL_MODE_DETECT - OTG cable mode detection has completed +//! (OTG Only) +//! - \b USB_INTCTRL_POWER_FAULT - Power Fault detected (Host Only) +//! +//! \note This call clears the source of all of the control status interrupts. +//! +//! \return Returns the status of the control interrupts for a USB controller. +// +//***************************************************************************** +uint32_t +USBIntStatusControl(uint32_t ui32Base) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Get the general interrupt status, these bits go into the upper 8 bits + // of the returned value. + // + ui32Status = HWREGB(ui32Base + USB_O_IS); + + // + // Add the power fault status. + // + if(HWREG(ui32Base + USB_O_EPCISC) & USB_EPCISC_PF) + { + // + // Indicate a power fault was detected. + // + ui32Status |= USB_INTCTRL_POWER_FAULT; + + // + // Clear the power fault interrupt. + // + HWREGB(ui32Base + USB_O_EPCISC) |= USB_EPCISC_PF; + } + + if(HWREG(ui32Base + USB_O_IDVISC) & USB_IDVRIS_ID) + { + // + // Indicate an id detection. + // + ui32Status |= USB_INTCTRL_MODE_DETECT; + + // + // Clear the id detection interrupt. + // + HWREG(ui32Base + USB_O_IDVISC) |= USB_IDVRIS_ID; + } + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Disables endpoint interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which endpoint interrupts to disable. +//! +//! This function disables endpoint interrupts for the USB controller specified +//! by the \e ui32Base parameter. The \e ui32Flags parameter specifies which +//! endpoint interrupts to disable. The flags passed in the \e ui32Flags +//! parameters must be the definitions that start with \b USB_INTEP_* and not +//! any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntDisableEndpoint(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // If any transmit interrupts were disabled, then write the transmit + // interrupt settings out to the hardware. + // + HWREGH(ui32Base + USB_O_TXIE) &= + ~(ui32Flags & (USB_INTEP_HOST_OUT | USB_INTEP_DEV_IN | USB_INTEP_0)); + + // + // If any receive interrupts were disabled, then write the receive + // interrupt settings out to the hardware. + // + HWREGH(ui32Base + USB_O_RXIE) &= + ~((ui32Flags & (USB_INTEP_HOST_IN | USB_INTEP_DEV_OUT)) >> + USB_INTEP_RX_SHIFT); +} + +//***************************************************************************** +// +//! Enables endpoint interrupts on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies which endpoint interrupts to enable. +//! +//! This function enables endpoint interrupts for the USB controller specified +//! by the \e ui32Base parameter. The \e ui32Flags parameter specifies which +//! endpoint interrupts to enable. The flags passed in the \e ui32Flags +//! parameters must be the definitions that start with \b USB_INTEP_* and not +//! any other \b USB_INT flags. +//! +//! \return None. +// +//***************************************************************************** +void +USBIntEnableEndpoint(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable any transmit endpoint interrupts. + // + HWREGH(ui32Base + USB_O_TXIE) |= + ui32Flags & (USB_INTEP_HOST_OUT | USB_INTEP_DEV_IN | USB_INTEP_0); + + // + // Enable any receive endpoint interrupts. + // + HWREGH(ui32Base + USB_O_RXIE) |= + ((ui32Flags & (USB_INTEP_HOST_IN | USB_INTEP_DEV_OUT)) >> + USB_INTEP_RX_SHIFT); +} + +//***************************************************************************** +// +//! Returns the endpoint interrupt status on a given USB controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function reads endpoint interrupt status for a USB controller. This +//! call returns the current status for endpoint interrupts only, the control +//! interrupt status is retrieved by calling USBIntStatusControl(). The bit +//! values returned are compared against the \b USB_INTEP_* values. +//! These values are grouped into classes for \b USB_INTEP_HOST_* and +//! \b USB_INTEP_DEV_* values to handle both host and device modes with all +//! endpoints. +//! +//! \note This call clears the source of all of the endpoint interrupts. +//! +//! \return Returns the status of the endpoint interrupts for a USB controller. +// +//***************************************************************************** +uint32_t +USBIntStatusEndpoint(uint32_t ui32Base) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Get the transmit interrupt status. + // + ui32Status = HWREGH(ui32Base + USB_O_TXIS); + ui32Status |= ((uint32_t)HWREGH(ui32Base + USB_O_RXIS) << + USB_INTEP_RX_SHIFT); + + // + // Return the combined interrupt status. + // + return(ui32Status); +} + + +//***************************************************************************** +// +//! Returns the current status of an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function returns the status of a given endpoint. If any of these +//! status bits must be cleared, then the USBDevEndpointStatusClear() or the +//! USBHostEndpointStatusClear() functions must be called. +//! +//! The following are the status flags for host mode: +//! +//! - \b USB_HOST_IN_PID_ERROR - PID error on the given endpoint. +//! - \b USB_HOST_IN_NOT_COMP - The device failed to respond to an IN request. +//! - \b USB_HOST_IN_STALL - A stall was received on an IN endpoint. +//! - \b USB_HOST_IN_DATA_ERROR - There was a CRC or bit-stuff error on an IN +//! endpoint in Isochronous mode. +//! - \b USB_HOST_IN_NAK_TO - NAKs received on this IN endpoint for more than +//! the specified timeout period. +//! - \b USB_HOST_IN_ERROR - Failed to communicate with a device using this IN +//! endpoint. +//! - \b USB_HOST_IN_FIFO_FULL - This IN endpoint's FIFO is full. +//! - \b USB_HOST_IN_PKTRDY - Data packet ready on this IN endpoint. +//! - \b USB_HOST_OUT_NAK_TO - NAKs received on this OUT endpoint for more than +//! the specified timeout period. +//! - \b USB_HOST_OUT_NOT_COMP - The device failed to respond to an OUT +//! request. +//! - \b USB_HOST_OUT_STALL - A stall was received on this OUT endpoint. +//! - \b USB_HOST_OUT_ERROR - Failed to communicate with a device using this +//! OUT endpoint. +//! - \b USB_HOST_OUT_FIFO_NE - This endpoint's OUT FIFO is not empty. +//! - \b USB_HOST_OUT_PKTPEND - The data transfer on this OUT endpoint has not +//! completed. +//! - \b USB_HOST_EP0_NAK_TO - NAKs received on endpoint zero for more than the +//! specified timeout period. +//! - \b USB_HOST_EP0_ERROR - The device failed to respond to a request on +//! endpoint zero. +//! - \b USB_HOST_EP0_IN_STALL - A stall was received on endpoint zero for an +//! IN transaction. +//! - \b USB_HOST_EP0_IN_PKTRDY - Data packet ready on endpoint zero for an IN +//! transaction. +//! +//! The following are the status flags for device mode: +//! +//! - \b USB_DEV_OUT_SENT_STALL - A stall was sent on this OUT endpoint. +//! - \b USB_DEV_OUT_DATA_ERROR - There was a CRC or bit-stuff error on an OUT +//! endpoint. +//! - \b USB_DEV_OUT_OVERRUN - An OUT packet was not loaded due to a full FIFO. +//! - \b USB_DEV_OUT_FIFO_FULL - The OUT endpoint's FIFO is full. +//! - \b USB_DEV_OUT_PKTRDY - There is a data packet ready in the OUT +//! endpoint's FIFO. +//! - \b USB_DEV_IN_NOT_COMP - A larger packet was split up, more data to come. +//! - \b USB_DEV_IN_SENT_STALL - A stall was sent on this IN endpoint. +//! - \b USB_DEV_IN_UNDERRUN - Data was requested on the IN endpoint and no +//! data was ready. +//! - \b USB_DEV_IN_FIFO_NE - The IN endpoint's FIFO is not empty. +//! - \b USB_DEV_IN_PKTPEND - The data transfer on this IN endpoint has not +//! completed. +//! - \b USB_DEV_EP0_SETUP_END - A control transaction ended before Data End +//! condition was sent. +//! - \b USB_DEV_EP0_SENT_STALL - A stall was sent on endpoint zero. +//! - \b USB_DEV_EP0_IN_PKTPEND - The data transfer on endpoint zero has not +//! completed. +//! - \b USB_DEV_EP0_OUT_PKTRDY - There is a data packet ready in endpoint +//! zero's OUT FIFO. +//! +//! \return The current status flags for the endpoint depending on mode. +// +//***************************************************************************** +uint32_t +USBEndpointStatus(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Status; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the TX portion of the endpoint status. + // + ui32Status = HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRL1); + + // + // Get the RX portion of the endpoint status. + // + ui32Status |= + (((uint32_t)HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRL1)) + << USB_RX_EPSTATUS_SHIFT); + + // + // Return the endpoint status. + // + return(ui32Status); +} + +//***************************************************************************** +// +//! Clears the status bits in this endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags are the status bits that are cleared. +//! +//! This function clears the status of any bits that are passed in the +//! \e ui32Flags parameter. The \e ui32Flags parameter can take the value +//! returned from the USBEndpointStatus() call. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Clear the specified flags for the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~ui32Flags; + } + else + { + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~ui32Flags; + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(ui32Flags >> USB_RX_EPSTATUS_SHIFT); + } +} + +//***************************************************************************** +// +//! Clears the status bits in this endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags are the status bits that are cleared. +//! +//! This function clears the status of any bits that are passed in the +//! \e ui32Flags parameter. The \e ui32Flags parameter can take the value +//! returned from the USBEndpointStatus() call. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // If this is endpoint 0, then the bits have different meaning and map + // into the TX memory location. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the Serviced RxPktRdy bit to clear the RxPktRdy. + // + if(ui32Flags & USB_DEV_EP0_OUT_PKTRDY) + { + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_RXRDYC; + } + + // + // Set the serviced Setup End bit to clear the SetupEnd status. + // + if(ui32Flags & USB_DEV_EP0_SETUP_END) + { + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_SETENDC; + } + + // + // Clear the Sent Stall status flag. + // + if(ui32Flags & USB_DEV_EP0_SENT_STALL) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~(USB_DEV_EP0_SENT_STALL); + } + } + else + { + // + // Clear out any TX flags that were passed in. Only + // USB_DEV_TX_SENT_STALL and USB_DEV_TX_UNDERRUN must be cleared. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(ui32Flags & (USB_DEV_TX_SENT_STALL | USB_DEV_TX_UNDERRUN)); + + // + // Clear out valid RX flags that were passed in. Only + // USB_DEV_RX_SENT_STALL, USB_DEV_RX_DATA_ERROR, and USB_DEV_RX_OVERRUN + // must be cleared. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~((ui32Flags & (USB_DEV_RX_SENT_STALL | USB_DEV_RX_DATA_ERROR | + USB_DEV_RX_OVERRUN)) >> USB_RX_EPSTATUS_SHIFT); + } +} + +//***************************************************************************** +// +//! Sets the value data toggle on an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to reset the data toggle. +//! \param bDataToggle specifies whether to set the state to DATA0 or DATA1. +//! \param ui32Flags specifies whether to set the IN or OUT endpoint. +//! +//! This function is used to force the state of the data toggle in host mode. +//! If the value passed in the \e bDataToggle parameter is \b false, then the +//! data toggle is set to the DATA0 state, and if it is \b true it is set to +//! the DATA1 state. The \e ui32Flags parameter can be \b USB_EP_HOST_IN or +//! \b USB_EP_HOST_OUT to access the desired portion of this endpoint. The +//! \e ui32Flags parameter is ignored for endpoint zero. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointDataToggle(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bDataToggle, uint32_t ui32Flags) +{ + uint32_t ui32DataToggle; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // The data toggle defaults to DATA0. + // + ui32DataToggle = 0; + + // + // See if the data toggle must be set to DATA1. + // + if(bDataToggle) + { + // + // Select the data toggle bit based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32DataToggle = USB_CSRH0_DT; + } + else if(ui32Flags == USB_EP_HOST_IN) + { + ui32DataToggle = USB_RXCSRH1_DT; + } + else + { + ui32DataToggle = USB_TXCSRH1_DT; + } + } + + // + // Set the data toggle based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the write enable and the bit value for endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRH0) = + ((HWREGB(ui32Base + USB_O_CSRH0) & + ~(USB_CSRH0_DTWE | USB_CSRH0_DT)) | + (ui32DataToggle | USB_CSRH0_DTWE)); + } + else if(ui32Flags == USB_EP_HOST_IN) + { + // + // Set the Write enable and the bit value for an IN endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRH1 + EP_OFFSET(ui32Endpoint)) = + ((HWREGB(ui32Base + USB_O_RXCSRH1 + EP_OFFSET(ui32Endpoint)) & + ~(USB_RXCSRH1_DTWE | USB_RXCSRH1_DT)) | + (ui32DataToggle | USB_RXCSRH1_DTWE)); + } + else + { + // + // Set the Write enable and the bit value for an OUT endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRH1 + EP_OFFSET(ui32Endpoint)) = + ((HWREGB(ui32Base + USB_O_TXCSRH1 + EP_OFFSET(ui32Endpoint)) & + ~(USB_TXCSRH1_DTWE | USB_TXCSRH1_DT)) | + (ui32DataToggle | USB_TXCSRH1_DTWE)); + } +} + +//***************************************************************************** +// +//! Sets the data toggle on an endpoint to zero. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to reset the data toggle. +//! \param ui32Flags specifies whether to access the IN or OUT endpoint. +//! +//! This function causes the USB controller to clear the data toggle for an +//! endpoint. This call is not valid for endpoint zero and can be made with +//! host or device controllers. +//! +//! The \e ui32Flags parameter must be one of \b USB_EP_HOST_OUT, +//! \b USB_EP_HOST_IN, \b USB_EP_DEV_OUT, or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDataToggleClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive data toggle must be cleared. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_CLRDT; + } + else + { + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Stalls the specified endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies the endpoint to stall. +//! \param ui32Flags specifies whether to stall the IN or OUT endpoint. +//! +//! This function causes the endpoint number passed in to go into a stall +//! condition. If the \e ui32Flags parameter is \b USB_EP_DEV_IN, then the +//! stall is issued on the IN portion of this endpoint. If the \e ui32Flags +//! parameter is \b USB_EP_DEV_OUT, then the stall is issued on the OUT portion +//! of this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStall(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_EP_DEV_IN | USB_EP_DEV_OUT)) == 0); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Determine how to stall this endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Perform a stall on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) |= USB_CSRL0_STALL | USB_CSRL0_RXRDYC; + } + else if(ui32Flags == USB_EP_DEV_IN) + { + // + // Perform a stall on an IN endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_STALL; + } + else + { + // + // Perform a stall on an OUT endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_STALL; + } +} + +//***************************************************************************** +// +//! Clears the stall condition on the specified endpoint in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint to remove the stall condition. +//! \param ui32Flags specifies whether to remove the stall condition from the +//! IN or the OUT portion of this endpoint. +//! +//! This function causes the endpoint number passed in to exit the stall +//! condition. If the \e ui32Flags parameter is \b USB_EP_DEV_IN, then the +//! stall is cleared on the IN portion of this endpoint. If the \e ui32Flags +//! parameter is \b USB_EP_DEV_OUT, then the stall is cleared on the OUT +//! portion of this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointStallClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + ASSERT((ui32Flags & ~(USB_EP_DEV_IN | USB_EP_DEV_OUT)) == 0U); + + // + // Determine how to clear the stall on this endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Clear the stall on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) &= ~USB_CSRL0_STALLED; + } + else if(ui32Flags == USB_EP_DEV_IN) + { + // + // Clear the stall on an IN endpoint. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_TXCSRL1_STALL | USB_TXCSRL1_STALLED); + + // + // Reset the data toggle. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_CLRDT; + } + else + { + // + // Clear the stall on an OUT endpoint. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_STALL | USB_RXCSRL1_STALLED); + + // + // Reset the data toggle. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Connects the USB controller to the bus in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function causes the soft connect feature of the USB controller to +//! be enabled. Call USBDevDisconnect() to remove the USB device from the bus. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevConnect(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable connection to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_SOFTCONN; +} + +//***************************************************************************** +// +//! Removes the USB controller from the bus in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function causes the soft connect feature of the USB controller to +//! remove the device from the USB bus. A call to USBDevConnect() is needed to +//! reconnect to the bus. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevDisconnect(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable connection to the USB bus. + // + HWREGB(ui32Base + USB_O_POWER) &= (~USB_POWER_SOFTCONN); +} + +//***************************************************************************** +// +//! Sets the address in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Address is the address to use for a device. +//! +//! This function configures the device address on the USB bus. This address +//! was likely received via a SET ADDRESS command from the host controller. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevAddrSet(uint32_t ui32Base, uint32_t ui32Address) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the function address in the correct location. + // + HWREGB(ui32Base + USB_O_FADDR) = (uint8_t)ui32Address; +} + +//***************************************************************************** +// +//! Returns the current device address in device mode. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current device address. This address was set +//! by a call to USBDevAddrSet(). +//! +//! \note This function must only be called in device mode. +//! +//! \return The current device address. +// +//***************************************************************************** +uint32_t +USBDevAddrGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Return the function address. + // + return(HWREGB(ui32Base + USB_O_FADDR)); +} + +//***************************************************************************** +// +//! Sets the base configuration for a host endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32MaxPayload is the maximum payload for this endpoint. +//! \param ui32NAKPollInterval is the either the NAK timeout limit or the +//! polling interval, depending on the type of endpoint. +//! \param ui32TargetEndpoint is the endpoint that the host endpoint is +//! targeting. +//! \param ui32Flags are used to configure other endpoint settings. +//! +//! This function sets the basic configuration for the transmit or receive +//! portion of an endpoint in host mode. The \e ui32Flags parameter determines +//! some of the configuration while the other parameters provide the rest. The +//! \e ui32Flags parameter determines whether this is an IN endpoint +//! (\b USB_EP_HOST_IN or \b USB_EP_DEV_IN) or an OUT endpoint +//! (\b USB_EP_HOST_OUT or \b USB_EP_DEV_OUT), whether this is a Full speed +//! endpoint (\b USB_EP_SPEED_FULL) or a Low speed endpoint +//! (\b USB_EP_SPEED_LOW). +//! +//! The \b USB_EP_MODE_ flags control the type of the endpoint. +//! - \b USB_EP_MODE_CTRL is a control endpoint. +//! - \b USB_EP_MODE_ISOC is an isochronous endpoint. +//! - \b USB_EP_MODE_BULK is a bulk endpoint. +//! - \b USB_EP_MODE_INT is an interrupt endpoint. +//! +//! The \e ui32NAKPollInterval parameter has different meanings based on the +//! \b USB_EP_MODE value and whether or not this call is being made for +//! endpoint zero or another endpoint. For endpoint zero or any Bulk +//! endpoints, this value always indicates the number of frames to allow a +//! device to NAK before considering it a timeout. If this endpoint is an +//! isochronous or interrupt endpoint, this value is the polling interval for +//! this endpoint. +//! +//! For interrupt endpoints, the polling interval is the number of frames +//! between interrupt IN requests to an endpoint and has a range of 1 to 255. +//! For isochronous endpoints this value represents a polling interval of +//! 2 ^ (\e ui32NAKPollInterval - 1) frames. When used as a NAK timeout, the +//! \e ui32NAKPollInterval value specifies 2 ^ (\e ui32NAKPollInterval - 1) +//! frames before issuing a time out. +//! +//! The \b USB_EP_DMA_MODE_ flags enable the type of DMA used to access the +//! endpoint's data FIFOs. The choice of the DMA mode depends on how the DMA +//! controller is configured and how it is being used. See the ``Using USB +//! with the uDMA Controller'' section for more information on DMA +//! configuration. +//! +//! When configuring the OUT portion of an endpoint, the \b USB_EP_AUTO_SET bit +//! is specified to cause the transmission of data on the USB bus to start +//! as soon as the number of bytes specified by \e ui32MaxPayload has been +//! written into the OUT FIFO for this endpoint. +//! +//! When configuring the IN portion of an endpoint, the \b USB_EP_AUTO_REQUEST +//! bit can be specified to trigger the request for more data once the FIFO has +//! been drained enough to fit \e ui32MaxPayload bytes. The +//! \b USB_EP_AUTO_CLEAR bit can be used to clear the data packet ready flag +//! automatically once the data has been read from the FIFO. If this option is +//! not used, this flag must be manually cleared via a call to +//! USBDevEndpointStatusClear() or USBHostEndpointStatusClear(). +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointConfig(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPayload, uint32_t ui32NAKPollInterval, + uint32_t ui32TargetEndpoint, uint32_t ui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero is configured differently than the other endpoints, so see + // if this is endpoint zero. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Set the NAK timeout. + // + HWREGB(ui32Base + USB_O_NAKLMT) = ui32NAKPollInterval; + + // + // Set the transfer type information. + // + HWREGB(ui32Base + USB_O_TYPE0) = + ((ui32Flags & USB_EP_SPEED_FULL) ? USB_TYPE0_SPEED_FULL : + USB_TYPE0_SPEED_LOW); + } + else + { + // + // Start with the target endpoint. + // + ui32Register = ui32TargetEndpoint; + + // + // Set the speed for the device using this endpoint. + // + if(ui32Flags & USB_EP_SPEED_FULL) + { + ui32Register |= USB_TXTYPE1_SPEED_FULL; + } + else + { + ui32Register |= USB_TXTYPE1_SPEED_LOW; + } + + // + // Set the protocol for the device using this endpoint. + // + switch(ui32Flags & USB_EP_MODE_MASK) + { + // + // The bulk protocol is being used. + // + case USB_EP_MODE_BULK: + { + ui32Register |= USB_TXTYPE1_PROTO_BULK; + break; + } + + // + // The isochronous protocol is being used. + // + case USB_EP_MODE_ISOC: + { + ui32Register |= USB_TXTYPE1_PROTO_ISOC; + break; + } + + // + // The interrupt protocol is being used. + // + case USB_EP_MODE_INT: + { + ui32Register |= USB_TXTYPE1_PROTO_INT; + break; + } + + // + // The control protocol is being used. + // + case USB_EP_MODE_CTRL: + { + ui32Register |= USB_TXTYPE1_PROTO_CTRL; + break; + } + } + + // + // See if the transmit or receive endpoint is being configured. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the transfer type information. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXTYPE1) = + ui32Register; + + // + // Set the NAK timeout or polling interval. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXINTERVAL1) = + ui32NAKPollInterval; + + // + // Set the Maximum Payload per transaction. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXMAXP1) = + ui32MaxPayload; + + // + // Set the transmit control value to zero. + // + ui32Register = 0; + + // + // Allow auto setting of TxPktRdy when max packet size has been + // loaded into the FIFO. + // + if(ui32Flags & USB_EP_AUTO_SET) + { + ui32Register |= USB_TXCSRH1_AUTOSET; + } + + // + // Configure the DMA Mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_TXCSRH1_DMAEN | USB_TXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_TXCSRH1_DMAEN; + } + + // + // Write out the transmit control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + (uint8_t)ui32Register; + } + else + { + // + // Set the transfer type information. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXTYPE1) = + ui32Register; + + // + // Set the NAK timeout or polling interval. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXINTERVAL1) = + ui32NAKPollInterval; + + // + // Set the Maximum Payload per transaction. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXMAXP1) = + ui32MaxPayload; + + // + // Set the receive control value to zero. + // + ui32Register = 0; + + // + // Allow auto clearing of RxPktRdy when packet of size max packet + // has been unloaded from the FIFO. + // + if(ui32Flags & USB_EP_AUTO_CLEAR) + { + ui32Register |= USB_RXCSRH1_AUTOCL; + } + + // + // Allow auto generation of DMA requests. + // + if(ui32Flags & USB_EP_AUTO_REQUEST) + { + ui32Register |= USB_RXCSRH1_AUTORQ; + } + + // + // Configure the DMA Mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_RXCSRH1_DMAEN | USB_RXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_RXCSRH1_DMAEN; + } + + // + // Write out the receive control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + (uint8_t)ui32Register; + } + } +} + +//***************************************************************************** +// +//! Sets the configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32MaxPacketSize is the maximum packet size for this endpoint. +//! \param ui32Flags are used to configure other endpoint settings. +//! +//! This function sets the basic configuration for an endpoint in device mode. +//! Endpoint zero does not have a dynamic configuration, so this function +//! must not be called for endpoint zero. The \e ui32Flags parameter +//! determines some of the configuration while the other parameters provide the +//! rest. +//! +//! The \b USB_EP_MODE_ flags define what the type is for the given endpoint. +//! +//! - \b USB_EP_MODE_CTRL is a control endpoint. +//! - \b USB_EP_MODE_ISOC is an isochronous endpoint. +//! - \b USB_EP_MODE_BULK is a bulk endpoint. +//! - \b USB_EP_MODE_INT is an interrupt endpoint. +//! +//! The \b USB_EP_DMA_MODE_ flags determine the type of DMA access to the +//! endpoint data FIFOs. The choice of the DMA mode depends on how the DMA +//! controller is configured and how it is being used. See the ``Using USB +//! with the uDMA Controller'' section for more information on DMA +//! configuration. +//! +//! When configuring an IN endpoint, the \b USB_EP_AUTO_SET bit can be +//! specified to cause the automatic transmission of data on the USB bus as +//! soon as \e ui32MaxPacketSize bytes of data are written into the FIFO for +//! this endpoint. This option is commonly used with DMA as no interaction is +//! required to start the transmission of data. +//! +//! When configuring an OUT endpoint, the \b USB_EP_AUTO_REQUEST bit is +//! specified to trigger the request for more data once the FIFO has been +//! drained enough to receive \e ui32MaxPacketSize more bytes of data. Also +//! for OUT endpoints, the \b USB_EP_AUTO_CLEAR bit can be used to clear the +//! data packet ready flag automatically once the data has been read from the +//! FIFO. If this option is not used, this flag must be manually cleared via a +//! call to USBDevEndpointStatusClear(). Both of these settings can be used to +//! remove the need for extra calls when using the controller in DMA mode. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, uint32_t ui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // Determine if a transmit or receive endpoint is being configured. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Set the maximum packet size. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXMAXP1) = + ui32MaxPacketSize; + + // + // The transmit control value is zero unless options are enabled. + // + ui32Register = 0; + + // + // Allow auto setting of TxPktRdy when max packet size has been loaded + // into the FIFO. + // + if(ui32Flags & USB_EP_AUTO_SET) + { + ui32Register |= USB_TXCSRH1_AUTOSET; + } + + // + // Configure the DMA mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_TXCSRH1_DMAEN | USB_TXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_TXCSRH1_DMAEN; + } + + // + // Enable isochronous mode if requested. + // + if((ui32Flags & USB_EP_MODE_MASK) == USB_EP_MODE_ISOC) + { + ui32Register |= USB_TXCSRH1_ISO; + } + + // + // Write the transmit control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + (uint8_t)ui32Register; + + // + // Reset the Data toggle to zero. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRL1) = + USB_TXCSRL1_CLRDT; + } + else + { + // + // Set the MaxPacketSize. + // + HWREGH(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXMAXP1) = + ui32MaxPacketSize; + + // + // The receive control value is zero unless options are enabled. + // + ui32Register = 0; + + // + // Allow auto clearing of RxPktRdy when packet of size max packet + // has been unloaded from the FIFO. + // + if(ui32Flags & USB_EP_AUTO_CLEAR) + { + ui32Register = USB_RXCSRH1_AUTOCL; + } + + // + // Configure the DMA mode. + // + if(ui32Flags & USB_EP_DMA_MODE_1) + { + ui32Register |= USB_RXCSRH1_DMAEN | USB_RXCSRH1_DMAMOD; + } + else if(ui32Flags & USB_EP_DMA_MODE_0) + { + ui32Register |= USB_RXCSRH1_DMAEN; + } + + // + // Enable isochronous mode if requested. + // + if((ui32Flags & USB_EP_MODE_MASK) == USB_EP_MODE_ISOC) + { + ui32Register |= USB_RXCSRH1_ISO; + } + + // + // Write the receive control value. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + (uint8_t)ui32Register; + + // + // Reset the Data toggle to zero. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRL1) = + USB_RXCSRL1_CLRDT; + } +} + +//***************************************************************************** +// +//! Gets the current configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui32MaxPacketSize is a pointer which is written with the maximum +//! packet size for this endpoint. +//! \param pui32Flags is a pointer which is written with the current endpoint +//! settings. On entry to the function, this pointer must contain either +//! \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT to indicate whether the IN or OUT +//! endpoint is to be queried. +//! +//! This function returns the basic configuration for an endpoint in device +//! mode. The values returned in \e *pui32MaxPacketSize and \e *pui32Flags are +//! equivalent to the \e ui32MaxPacketSize and \e ui32Flags previously passed +//! to USBDevEndpointConfigSet() for this endpoint. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32MaxPacketSize, uint32_t *pui32Flags) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT(pui32MaxPacketSize && pui32Flags); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + if((pui32Flags != NULL) && (pui32MaxPacketSize != NULL)) + { + + // + // Determine if a transmit or receive endpoint is being queried. + // + if(*pui32Flags & USB_EP_DEV_IN) + { + // + // Clear the flags other than the direction bit. + // + *pui32Flags = USB_EP_DEV_IN; + + // + // Get the maximum packet size. + // + *pui32MaxPacketSize = (uint32_t)HWREGH(ui32Base + + EP_OFFSET(ui32Endpoint) + + USB_O_TXMAXP1); + + // + // Get the current transmit control register value. + // + ui32Register = (uint32_t)HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + + USB_O_TXCSRH1); + + // + // Are we allowing auto setting of TxPktRdy when max packet size + // has been loaded into the FIFO? + // + if(ui32Register & USB_TXCSRH1_AUTOSET) + { + *pui32Flags |= USB_EP_AUTO_SET; + } + + // + // Get the DMA mode. + // + if(ui32Register & USB_TXCSRH1_DMAEN) + { + if(ui32Register & USB_TXCSRH1_DMAMOD) + { + *pui32Flags |= USB_EP_DMA_MODE_1; + } + else + { + *pui32Flags |= USB_EP_DMA_MODE_0; + } + } + + // + // Are we in isochronous mode? + // + if(ui32Register & USB_TXCSRH1_ISO) + { + *pui32Flags |= USB_EP_MODE_ISOC; + } + else + { + // + // The hardware doesn't differentiate between bulk, interrupt + // and control mode for the endpoint so we just set something + // that isn't isochronous. This protocol ensures that anyone + // modifying the returned flags in preparation for a call to + // USBDevEndpointConfigSet do not see an unexpected mode + // change. If they decode the returned mode, however, they + // may be in for a surprise. + // + *pui32Flags |= USB_EP_MODE_BULK; + } + } + else + { + // + // Clear the flags other than the direction bit. + // + *pui32Flags = USB_EP_DEV_OUT; + + // + // Get the MaxPacketSize. + // + *pui32MaxPacketSize = (uint32_t)HWREGH(ui32Base + + EP_OFFSET(ui32Endpoint) + + USB_O_RXMAXP1); + + // + // Get the current receive control register value. + // + ui32Register = (uint32_t)HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + + USB_O_RXCSRH1); + + // + // Are we allowing auto clearing of RxPktRdy when packet of size + // max packet has been unloaded from the FIFO? + // + if(ui32Register & USB_RXCSRH1_AUTOCL) + { + *pui32Flags |= USB_EP_AUTO_CLEAR; + } + + // + // Get the DMA mode. + // + if(ui32Register & USB_RXCSRH1_DMAEN) + { + if(ui32Register & USB_RXCSRH1_DMAMOD) + { + *pui32Flags |= USB_EP_DMA_MODE_1; + } + else + { + *pui32Flags |= USB_EP_DMA_MODE_0; + } + } + + // + // Are we in isochronous mode? + // + if(ui32Register & USB_RXCSRH1_ISO) + { + *pui32Flags |= USB_EP_MODE_ISOC; + } + else + { + // + // The hardware doesn't differentiate between bulk, interrupt + // and control mode for the endpoint so we just set something + // that isn't isochronous. This protocol ensures that anyone + // modifying the returned flags in preparation for a call to + // USBDevEndpointConfigSet do not see an unexpected mode + // change.If they decode the returned mode, however, they may + // be in for a surprise. + // + *pui32Flags |= USB_EP_MODE_BULK; + } + } + } +} + +//***************************************************************************** +// +//! Sets the FIFO configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32FIFOAddress is the starting address for the FIFO. +//! \param ui32FIFOSize is the size of the FIFO specified by one of the +//! USB_FIFO_SZ_ values. +//! \param ui32Flags specifies what information to set in the FIFO +//! configuration. +//! +//! This function configures the starting FIFO RAM address and size of the FIFO +//! for a given endpoint. Endpoint zero does not have a dynamically +//! configurable FIFO, so this function must not be called for endpoint zero. +//! The \e ui32FIFOSize parameter must be one of the values in the +//! \b USB_FIFO_SZ_ values. +//! +//! The \e ui32FIFOAddress value must be a multiple of 8 bytes and directly +//! indicates the starting address in the USB controller's FIFO RAM. For +//! example, a value of 64 indicates that the FIFO starts 64 bytes into +//! the USB controller's FIFO memory. The \e ui32Flags value specifies whether +//! the endpoint's OUT or IN FIFO must be configured. If in host mode, use +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN, and if in device mode, use +//! \b USB_EP_DEV_OUT or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32FIFOAddress, uint32_t ui32FIFOSize, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive FIFO is being configured. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Set the transmit FIFO location and size for this endpoint. + // + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_TXFIFOSZ, + ui32FIFOSize, 1U); + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_TXFIFOADD, + ui32FIFOAddress >> 3U, 2U); + } + else + { + // + // Set the receive FIFO location and size for this endpoint. + // + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_RXFIFOSZ, + ui32FIFOSize, 1U); + _USBIndexWrite(ui32Base, ui32Endpoint >> 4U, USB_O_RXFIFOADD, + ui32FIFOAddress >> 3U, 2U); + } +} + +//***************************************************************************** +// +//! Returns the FIFO configuration for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui32FIFOAddress is the starting address for the FIFO. +//! \param pui32FIFOSize is the size of the FIFO as specified by one of the +//! USB_FIFO_SZ_ values. +//! \param ui32Flags specifies what information to retrieve from the FIFO +//! configuration. +//! +//! This function returns the starting address and size of the FIFO for a +//! given endpoint. Endpoint zero does not have a dynamically configurable +//! FIFO, so this function must not be called for endpoint zero. The +//! \e ui32Flags parameter specifies whether the endpoint's OUT or IN FIFO must +//! be read. If in host mode, the \e ui32Flags parameter must be +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN, and if in device mode, the +//! \e ui32Flags parameter must be either \b USB_EP_DEV_OUT or +//! \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32FIFOAddress, uint32_t *pui32FIFOSize, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive FIFO is being configured. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Get the transmit FIFO location and size for this endpoint. + // + *pui32FIFOAddress = (_USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_TXFIFOADD, + 2U)) << 3U; + *pui32FIFOSize = _USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_TXFIFOSZ, 1U); + } + else + { + // + // Get the receive FIFO location and size for this endpoint. + // + *pui32FIFOAddress = (_USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_RXFIFOADD, + 2U)) << 3U; + *pui32FIFOSize = _USBIndexRead(ui32Base, ui32Endpoint >> 4U, + (uint32_t)USB_O_RXFIFOSZ, 1U); + } +} + +//***************************************************************************** +// +//! Configure the DMA settings for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Config specifies the configuration options for an endpoint. +//! +//! This function configures the DMA settings for a given endpoint without +//! changing other options that may already be configured. In order for the +//! DMA transfer to be enabled, the USBEndpointDMAEnable() function must be +//! called before starting the DMA transfer. The configuration +//! options are passed in the \e ui32Config parameter and can have the values +//! described below. +//! +//! One of the following values to specify direction: +//! - \b USB_EP_HOST_OUT or \b USB_EP_DEV_IN - This setting is used with +//! DMA transfers from memory to the USB controller. +//! - \b USB_EP_HOST_IN or \b USB_EP_DEV_OUT - This setting is used with +//! DMA transfers from the USB controller to memory. +//! +//! One of the following values: +//! - \b USB_EP_DMA_MODE_0(default) - This setting is typically used for +//! transfers that do not span multiple packets or when interrupts are +//! required for each packet. +//! - \b USB_EP_DMA_MODE_1 - This setting is typically used for +//! transfers that span multiple packets and do not require interrupts +//! between packets. +//! +//! Values only used with \b USB_EP_HOST_OUT or \b USB_EP_DEV_IN: +//! - \b USB_EP_AUTO_SET - This setting is used to allow transmit DMA transfers +//! to automatically be sent when a full packet is loaded into a FIFO. +//! This is needed with \b USB_EP_DMA_MODE_1 to ensure that packets go +//! out when the FIFO becomes full and the DMA has more data to send. +//! +//! Values only used with \b USB_EP_HOST_IN or \b USB_EP_DEV_OUT: +//! - \b USB_EP_AUTO_CLEAR - This setting is used to allow receive DMA +//! transfers to automatically be acknowledged as they are received. This is +//! needed with \b USB_EP_DMA_MODE_1 to ensure that packets continue to +//! be received and acknowledged when the FIFO is emptied by the DMA +//! transfer. +//! +//! Values only used with \b USB_EP_HOST_IN: +//! - \b USB_EP_AUTO_REQUEST - This setting is used to allow receive DMA +//! transfers to automatically request a new IN transaction when the +//! previous transfer has emptied the FIFO. This is typically used in +//! conjunction with \b USB_EP_AUTO_CLEAR so that receive DMA transfers +//! can continue without interrupting the main processor. +//! +//! \b Example: Set endpoint 1 receive endpoint to automatically acknowledge +//! request and automatically generate a new IN request in host mode. +//! +//! \verbatim +//! // +//! // Configure endpoint 1 for receiving multiple packets using DMA. +//! // +//! USBEndpointDMAConfigSet(USBA_BASE, USB_EP_1, USB_EP_HOST_IN | +//! USB_EP_DMA_MODE_1 | +//! USB_EP_AUTO_CLEAR | +//! USB_EP_AUTO_REQUEST); +//! \endverbatim +//! +//! \b Example: Set endpoint 2 transmit endpoint to automatically send each +//! packet in host mode when spanning multiple packets. +//! +//! \verbatim +//! // +//! // Configure endpoint 1 for transmitting multiple packets using DMA. +//! // +//! USBEndpointDMAConfigSet(USBA_BASE, USB_EP_2, USB_EP_HOST_OUT | +//! USB_EP_DMA_MODE_1 | +//! USB_EP_AUTO_SET); +//! \endverbatim +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMAConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Config) +{ + uint32_t ui32NewConfig; + + if(ui32Config & USB_EP_HOST_OUT) + { + // + // Clear mode and DMA enable. + // + ui32NewConfig = + (HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) & + ~(USB_TXCSRH1_DMAMOD | USB_TXCSRH1_AUTOSET)); + + if(ui32Config & USB_EP_DMA_MODE_1) + { + ui32NewConfig |= USB_TXCSRH1_DMAMOD; + } + + if(ui32Config & USB_EP_AUTO_SET) + { + ui32NewConfig |= USB_TXCSRH1_AUTOSET; + } + + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) = + ui32NewConfig; + } + else + { + ui32NewConfig = + (HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) & + ~(USB_RXCSRH1_AUTORQ | USB_RXCSRH1_AUTOCL | USB_RXCSRH1_DMAMOD)); + + if(ui32Config & USB_EP_DMA_MODE_1) + { + ui32NewConfig |= USB_RXCSRH1_DMAMOD; + } + + if(ui32Config & USB_EP_AUTO_CLEAR) + { + ui32NewConfig |= USB_RXCSRH1_AUTOCL; + } + if(ui32Config & USB_EP_AUTO_REQUEST) + { + ui32NewConfig |= USB_RXCSRH1_AUTORQ; + } + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) = + ui32NewConfig; + } +} + +//***************************************************************************** +// +//! Enable DMA on a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies which direction and what mode to use when +//! enabling DMA. +//! +//! This function enables DMA on a given endpoint and configures the mode +//! according to the values in the \e ui32Flags parameter. The \e ui32Flags +//! parameter must have \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT set. Once this +//! function is called the only DMA or error interrupts are generated by the +//! USB controller. +//! +//! \note If this function is called when an endpoint is configured in DMA +//! mode 0 the USB controller does not generate an interrupt. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMAEnable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // See if the transmit DMA is being enabled. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Enable DMA on the transmit endpoint. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) |= + USB_TXCSRH1_DMAEN; + } + else + { + // + // Enable DMA on the receive endpoint. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) |= + USB_RXCSRH1_DMAEN; + } +} + +//***************************************************************************** +// +//! Disable DMA on a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies which direction to disable. +//! +//! This function disables DMA on a given endpoint to allow non-DMA USB +//! transactions to generate interrupts normally. The \e ui32Flags parameter +//! must be \b USB_EP_DEV_IN or \b USB_EP_DEV_OUT; all other bits are ignored. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointDMADisable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags) +{ + // + // If this was a request to disable DMA on the IN portion of the endpoint + // then handle it. + // + if(ui32Flags & USB_EP_DEV_IN) + { + // + // Just disable DMA leave the mode setting. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_TXCSRH1) &= + ~USB_TXCSRH1_DMAEN; + } + else + { + // + // Just disable DMA leave the mode setting. + // + HWREGB(ui32Base + EP_OFFSET(ui32Endpoint) + USB_O_RXCSRH1) &= + ~USB_RXCSRH1_DMAEN; + } +} + +//***************************************************************************** +// +//! Determine the number of bytes of data available in a given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function returns the number of bytes of data currently available in +//! the FIFO for the given receive (OUT) endpoint. It may be used prior to +//! calling USBEndpointDataGet() to determine the size of buffer required to +//! hold the newly-received packet. +//! +//! \return This call returns the number of bytes available in a given endpoint +//! FIFO. +// +//***************************************************************************** +uint32_t +USBEndpointDataAvail(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the address of the receive status register to use, based on the + // endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Is there a packet ready in the FIFO? + // + if((HWREGH(ui32Base + ui32Register) & USB_CSRL0_RXRDY) == 0) + { + return(0); + } + + // + // Return the byte count in the FIFO. + // + return(HWREGH(ui32Base + USB_O_COUNT0 + ui32Endpoint)); +} + +//***************************************************************************** +// +//! Retrieves data from the given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui8Data is a pointer to the data area used to return the data from +//! the FIFO. +//! \param pui32Size is initially the size of the buffer passed into this call +//! via the \e pui8Data parameter. It is set to the amount of data returned in +//! the buffer. +//! +//! This function returns the data from the FIFO for the given endpoint. +//! The \e pui32Size parameter indicates the size of the buffer passed in +//! the \e pui32Data parameter. The data in the \e pui32Size parameter is +//! changed to match the amount of data returned in the \e pui8Data parameter. +//! If a zero-byte packet is received, this call does not return an error but +//! instead just returns a zero in the \e pui32Size parameter. The only error +//! case occurs when there is no data packet available. +//! +//! \return This call returns 0, or -1 if no packet was received. +// +//***************************************************************************** +int32_t +USBEndpointDataGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t *pui32Size) +{ + uint32_t ui32Register, ui32ByteCount, ui32FIFO; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the address of the receive status register to use, based on the + // endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Don't allow reading of data if the RxPktRdy bit is not set. + // + if((HWREGH(ui32Base + ui32Register) & USB_CSRL0_RXRDY) == 0) + { + // + // Can't read the data because none is available. + // + *pui32Size = 0; + + // + // Return a failure since there is no data to read. + // + return(-1); + } + + // + // Get the byte count in the FIFO. + // + ui32ByteCount = HWREGH(ui32Base + USB_O_COUNT0 + ui32Endpoint); + + // + // Determine how many bytes are copied. + // + ui32ByteCount = (ui32ByteCount < *pui32Size) ? ui32ByteCount : *pui32Size; + + // + // Return the number of bytes we are going to read. + // + *pui32Size = ui32ByteCount; + + // + // Calculate the FIFO address. + // + ui32FIFO = ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2); + + // + // Read the data out of the FIFO. + // + for(; ui32ByteCount > 0; ui32ByteCount--) + { + // + // Read a byte at a time from the FIFO. + // + *pui8Data++ = HWREGB(ui32FIFO); + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +//! Acknowledge that data was read from the given endpoint's FIFO in device +//! mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param bIsLastPacket indicates if this packet is the last one. +//! +//! This function acknowledges that the data was read from the endpoint's FIFO. +//! The \e bIsLastPacket parameter is set to a \b true value if this is the +//! last in a series of data packets on endpoint zero. The \e bIsLastPacket +//! parameter is not used for endpoints other than endpoint zero. This call +//! can be used if processing is required between reading the data and +//! acknowledging that the data has been read. +//! +//! \note This function must only be called in device mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bIsLastPacket) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Determine which endpoint is being acked. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Clear RxPktRdy, and optionally DataEnd, on endpoint zero. + // + HWREGB(ui32Base + USB_O_CSRL0) = + USB_CSRL0_RXRDYC | (bIsLastPacket ? USB_CSRL0_DATAEND : 0U); + } + else + { + // + // Clear RxPktRdy on all other endpoints. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_RXRDY); + } +} + +//***************************************************************************** +// +//! Acknowledge that data was read from the given endpoint's FIFO in host +//! mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function acknowledges that the data was read from the endpoint's FIFO. +//! This call is used if processing is required between reading the data and +//! acknowledging that the data has been read. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Clear RxPktRdy. + // + if(ui32Endpoint == USB_EP_0) + { + HWREGB(ui32Base + USB_O_CSRL0) &= ~USB_CSRL0_RXRDY; + } + else + { + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) &= + ~(USB_RXCSRL1_RXRDY); + } +} + +//***************************************************************************** +// +//! Puts data into the given endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param pui8Data is a pointer to the data area used as the source for the +//! data to put into the FIFO. +//! \param ui32Size is the amount of data to put into the FIFO. +//! +//! This function puts the data from the \e pui8Data parameter into the FIFO +//! for this endpoint. If a packet is already pending for transmission, then +//! this call does not put any of the data into the FIFO and returns -1. Care +//! must be taken to not write more data than can fit into the FIFO +//! allocated by the call to USBFIFOConfigSet(). +//! +//! \return This call returns 0 on success, or -1 to indicate that the FIFO +//! is in use and cannot be written. +// +//***************************************************************************** +int32_t +USBEndpointDataPut(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t ui32Size) +{ + uint32_t ui32FIFO; + uint8_t ui8TxPktRdy; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the bit position of TxPktRdy based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + ui8TxPktRdy = USB_CSRL0_TXRDY; + } + else + { + ui8TxPktRdy = USB_TXCSRL1_TXRDY; + } + + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) & ui8TxPktRdy) + { + return(-1); + } + + // + // Calculate the FIFO address. + // + ui32FIFO = ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2); + + // + // Write the data to the FIFO. + // + for(; ui32Size > 0U; ui32Size--) + { + HWREGB(ui32FIFO) = *pui8Data++; + } + + // + // Success. + // + return(0); +} + +//***************************************************************************** +// +//! Starts the transfer of data from an endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32TransType is set to indicate what type of data is being sent. +//! +//! This function starts the transfer of data from the FIFO for a given +//! endpoint. This function is called if the \b USB_EP_AUTO_SET bit was +//! not enabled for the endpoint. Setting the \e ui32TransType parameter +//! allows the appropriate signaling on the USB bus for the type of transaction +//! being requested. The \e ui32TransType parameter must be one of the +//! following: +//! +//! - \b USB_TRANS_OUT for OUT transaction on any endpoint in host mode. +//! - \b USB_TRANS_IN for IN transaction on any endpoint in device mode. +//! - \b USB_TRANS_IN_LAST for the last IN transaction on endpoint zero in a +//! sequence of IN transactions. +//! - \b USB_TRANS_SETUP for setup transactions on endpoint zero. +//! - \b USB_TRANS_STATUS for status results on endpoint zero. +//! +//! \return This call returns 0 on success, or -1 if a transmission is already +//! in progress. +// +//***************************************************************************** +int32_t +USBEndpointDataSend(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32TransType) +{ + uint32_t ui32TxPktRdy; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Get the bit position of TxPktRdy based on the endpoint. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0) & USB_CSRL0_TXRDY) + { + return(-1); + } + + ui32TxPktRdy = ui32TransType & 0xFFU; + } + else + { + // + // Don't allow transmit of data if the TxPktRdy bit is already set. + // + if(HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) & USB_TXCSRL1_TXRDY) + { + return(-1); + } + + ui32TxPktRdy = (ui32TransType >> 8U) & 0xFFU; + } + + // + // Set TxPktRdy in order to send the data. + // + HWREGB(ui32Base + USB_O_CSRL0 + ui32Endpoint) = ui32TxPktRdy; + + // + // Success. + // + return(0U); +} + +//***************************************************************************** +// +//! Forces a flush of an endpoint's FIFO. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags specifies if the IN or OUT endpoint is accessed. +//! +//! This function forces the USB controller to flush out the data in the FIFO. +//! The function can be called with either host or device controllers and +//! requires the \e ui32Flags parameter be one of \b USB_EP_HOST_OUT, +//! \b USB_EP_HOST_IN, \b USB_EP_DEV_OUT, or \b USB_EP_DEV_IN. +//! +//! \return None. +// +//***************************************************************************** +void +USBFIFOFlush(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero has a different register set for FIFO flushing. + // + if(ui32Endpoint == USB_EP_0) + { + // + // Nothing in the FIFO if neither of these bits are set. + // + if((HWREGB(ui32Base + USB_O_CSRL0) & + (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY)) != 0U) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_CSRH0) = USB_CSRH0_FLUSH; + } + } + else + { + // + // Only reset the IN or OUT FIFO. + // + if(ui32Flags & (USB_EP_HOST_OUT | USB_EP_DEV_IN)) + { + // + // Make sure the FIFO is not empty. + // + if(HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) & + USB_TXCSRL1_TXRDY) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_TXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_TXCSRL1_FLUSH; + } + } + else + { + // + // Make sure that the FIFO is not empty. + // + if(HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) & + USB_RXCSRL1_RXRDY) + { + // + // Hit the Flush FIFO bit. + // + HWREGB(ui32Base + USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint)) |= + USB_RXCSRL1_FLUSH; + } + } + } +} + +//***************************************************************************** +// +//! Schedules a request for an IN transaction on an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function schedules a request for an IN transaction. When the USB +//! device being communicated with responds with the data, the data can be +//! retrieved by calling USBEndpointDataGet() or via a DMA transfer. +//! +//! \note This function must only be called in host mode and only for IN +//! endpoints. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestIN(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero uses a different offset than the other endpoints. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Set the request for an IN transaction. + // + HWREGB(ui32Base + ui32Register) = USB_RXCSRL1_REQPKT; +} + +//***************************************************************************** +// +//! Clears a scheduled IN transaction for an endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! +//! This function clears a previously scheduled IN transaction if it is still +//! pending. This function is used to safely disable any scheduled IN +//! transactions if the endpoint specified by \e ui32Endpoint is reconfigured +//! for communications with other devices. +//! +//! \note This function must only be called in host mode and only for IN +//! endpoints. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestINClear(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + uint32_t ui32Register; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Endpoint zero uses a different offset than the other endpoints. + // + if(ui32Endpoint == USB_EP_0) + { + ui32Register = USB_O_CSRL0; + } + else + { + ui32Register = USB_O_RXCSRL1 + EP_OFFSET(ui32Endpoint); + } + + // + // Clear the request for an IN transaction. + // + HWREGB(ui32Base + ui32Register) &= ~USB_RXCSRL1_REQPKT; +} + +//***************************************************************************** +// +//! Issues a request for a status IN transaction on endpoint zero. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function is used to cause a request for a status IN transaction from +//! a device on endpoint zero. This function can only be used with endpoint +//! zero as that is the only control endpoint that supports this ability. This +//! function is used to complete the last phase of a control transaction to a +//! device and an interrupt is signaled when the status packet has been +//! received. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostRequestStatus(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the request for a status IN transaction. + // + HWREGB(ui32Base + USB_O_CSRL0) = USB_CSRL0_REQPKT | USB_CSRL0_STATUS; +} + +//***************************************************************************** +// +//! Sets the functional address for the device that is connected to an +//! endpoint in host mode. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Addr is the functional address for the controller to use for +//! this endpoint. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function configures the functional address for a device that is using +//! this endpoint for communication. This \e ui32Addr parameter is the address +//! of the target device that this endpoint is communicating with. The +//! \e ui32Flags parameter indicates if the IN or OUT endpoint is set. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Addr, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive address is set. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the transmit address. + // + HWREGB(ui32Base + USB_O_TXFUNCADDR0 + (ui32Endpoint >> 1U)) = ui32Addr; + } + else + { + // + // Set the receive address. + // + HWREGB(ui32Base + USB_O_TXFUNCADDR0 + 4U + (ui32Endpoint >> 1U)) = + ui32Addr; + } +} + +//***************************************************************************** +// +//! Gets the current functional device address for an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function returns the current functional address that an endpoint is +//! using to communicate with a device. The \e ui32Flags parameter determines +//! if the IN or OUT endpoint's device address is returned. +//! +//! \note This function must only be called in host mode. +//! +//! \return Returns the current function address being used by an endpoint. +// +//***************************************************************************** +uint32_t +USBHostAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the transmit or receive address is returned. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Return this endpoint's transmit address. + // + return(HWREGB(ui32Base + USB_O_TXFUNCADDR0 + (ui32Endpoint >> 1U))); + } + else + { + // + // Return this endpoint's receive address. + // + return(HWREGB(ui32Base + USB_O_TXFUNCADDR0 + 4U + (ui32Endpoint >> 1U))); + } +} + +//***************************************************************************** +// +//! Sets the hub address for the device that is connected to an endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Addr is the hub address and port for the device using this +//! endpoint. The hub address must be defined in bits 0 through 6 with the +//! port number in bits 8 through 14. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function configures the hub address for a device that is using this +//! endpoint for communication. The \e ui32Flags parameter determines if the +//! device address for the IN or the OUT endpoint is configured by this call +//! and sets the speed of the downstream device. Valid values are one of +//! \b USB_EP_HOST_OUT or \b USB_EP_HOST_IN optionally ORed with +//! \b USB_EP_SPEED_LOW. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostHubAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Addr, + uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the hub transmit or receive address is being set. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Set the hub transmit address and port number for this endpoint. + // + HWREGH(ui32Base + USB_O_TXHUBADDR0 + (ui32Endpoint >> 1U)) = ui32Addr; + } + else + { + // + // Set the hub receive address and port number for this endpoint. + // + HWREGH(ui32Base + USB_O_TXHUBADDR0 + 4U + (ui32Endpoint >> 1U)) = + ui32Addr; + } + + // + // Set the speed of communication for endpoint 0. This configuration is + // done here because it changes on a transaction-by-transaction basis for + // EP0. For other endpoints, this is set in USBHostEndpointConfig(). + // + if(ui32Endpoint == USB_EP_0) + { + if(ui32Flags & USB_EP_SPEED_FULL) + { + HWREGB(ui32Base + USB_O_TYPE0) = USB_TYPE0_SPEED_FULL; + } + else + { + HWREGB(ui32Base + USB_O_TYPE0) = USB_TYPE0_SPEED_LOW; + } + } +} + +//***************************************************************************** +// +//! Gets the current device hub address for this endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint to access. +//! \param ui32Flags determines if this is an IN or an OUT endpoint. +//! +//! This function returns the current hub address that an endpoint is using +//! to communicate with a device. The \e ui32Flags parameter determines if the +//! device address for the IN or OUT endpoint is returned. +//! +//! \note This function must only be called in host mode. +//! +//! \return This function returns the current hub address being used by an +//! endpoint. +// +//***************************************************************************** +uint32_t +USBHostHubAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // See if the hub transmit or receive address is returned. + // + if(ui32Flags & USB_EP_HOST_OUT) + { + // + // Return the hub transmit address for this endpoint. + // + return(HWREGB(ui32Base + USB_O_TXHUBADDR0 + (ui32Endpoint >> 1U))); + } + else + { + // + // Return the hub receive address for this endpoint. + // + return(HWREGB(ui32Base + USB_O_TXHUBADDR0 + 4U + (ui32Endpoint >> 1U))); + } +} + +//***************************************************************************** +// +//! Sets the configuration for USB power fault. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Flags specifies the configuration of the power fault. +//! +//! This function controls how the USB controller uses its external power +//! control pins (USBnPFLT and USBnEPEN). The flags specify the power +//! fault level sensitivity, the power fault action, and the power enable level +//! and source. +//! +//! One of the following can be selected as the power fault level sensitivity: +//! +//! - \b USB_HOST_PWRFLT_LOW - An external power fault is indicated by the pin +//! being driven low. +//! - \b USB_HOST_PWRFLT_HIGH - An external power fault is indicated by the pin +//! being driven high. +//! +//! One of the following can be selected as the power fault action: +//! +//! - \b USB_HOST_PWRFLT_EP_NONE - No automatic action when power fault +//! detected. +//! - \b USB_HOST_PWRFLT_EP_TRI - Automatically tri-state the USBnEPEN pin on a +//! power fault. +//! - \b USB_HOST_PWRFLT_EP_LOW - Automatically drive USBnEPEN pin low on a +//! power fault. +//! - \b USB_HOST_PWRFLT_EP_HIGH - Automatically drive USBnEPEN pin high on a +//! power fault. +//! +//! One of the following can be selected as the power enable level and source: +//! +//! - \b USB_HOST_PWREN_MAN_LOW - USBnEPEN is driven low by the USB controller +//! when USBHostPwrEnable() is called. +//! - \b USB_HOST_PWREN_MAN_HIGH - USBnEPEN is driven high by the USB +//! controller when USBHostPwrEnable() is +//! called. +//! - \b USB_HOST_PWREN_AUTOLOW - USBnEPEN is driven low by the USB controller +//! automatically if USBOTGSessionRequest() has +//! enabled a session. +//! - \b USB_HOST_PWREN_AUTOHIGH - USBnEPEN is driven high by the USB +//! controller automatically if +//! USBOTGSessionRequest() has enabled a +//! session. +//! +//! On devices that support the VBUS glitch filter, the +//! \b USB_HOST_PWREN_FILTER can be added to ignore small, short drops in VBUS +//! level caused by high power consumption. This feature is mainly used to +//! avoid causing VBUS errors caused by devices with high in-rush current. +//! +//! \note This function must only be called on microcontrollers that support +//! host mode or OTG operation. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrConfig(uint32_t ui32Base, uint32_t ui32Flags) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Flags & ~(USB_HOST_PWREN_FILTER | USB_EPC_PFLTACT_M | + USB_EPC_PFLTAEN | USB_EPC_PFLTSEN_HIGH | + USB_EPC_EPEN_M)) == 0U); + + // + // If requested, enable VBUS droop detection on parts that support this + // feature. + // + HWREG(ui32Base + USB_O_VDC) = ui32Flags >> 16U; + + // + // Set the power fault configuration as specified. This configuration + // does not change whether fault detection is enabled or not. + // + HWREGH(ui32Base + USB_O_EPC) = + (ui32Flags | (HWREGH(ui32Base + USB_O_EPC) & + ~(USB_EPC_PFLTACT_M | USB_EPC_PFLTAEN | + USB_EPC_PFLTSEN_HIGH | USB_EPC_EPEN_M))); +} + +//***************************************************************************** +// +//! Enables power fault detection. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function enables power fault detection in the USB controller. If the +//! USBnPFLT pin is not in use, this function must not be used. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrFaultEnable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable power fault input. + // + HWREGH(ui32Base + USB_O_EPC) |= USB_EPC_PFLTEN; +} + +//***************************************************************************** +// +//! Disables power fault detection. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function disables power fault detection in the USB controller. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrFaultDisable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable power fault input. + // + HWREGH(ui32Base + USB_O_EPC) &= ~USB_EPC_PFLTEN; +} + +//***************************************************************************** +// +//! Enables the external power pin. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function enables the USBnEPEN signal, which enables an external power +//! supply in host mode operation. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrEnable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Enable the external power supply enable signal. + // + HWREGH(ui32Base + USB_O_EPC) |= USB_EPC_EPENDE; +} + +//***************************************************************************** +// +//! Disables the external power pin. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function disables the USBnEPEN signal, which disables an external +//! power supply in host mode operation. +//! +//! \note This function must only be called in host mode. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostPwrDisable(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable the external power supply enable signal. + // + HWREGH(ui32Base + USB_O_EPC) &= ~USB_EPC_EPENDE; +} + +//***************************************************************************** +// +//! Get the current frame number. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the last frame number received. +//! +//! \return The last frame number received. +// +//***************************************************************************** +uint32_t +USBFrameNumberGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Return the most recent frame number. + // + return(HWREGH(ui32Base + USB_O_FRAME)); +} + +//***************************************************************************** +// +//! Starts or ends a session. +//! +//! \param ui32Base specifies the USB module base address. +//! \param bStart specifies if this call starts or ends a session. +//! +//! This function is used in OTG mode to start a session request or end a +//! session. If the \e bStart parameter is set to \b true, then this function +//! starts a session and if it is \b false it ends a session. +//! +//! \return None. +// +//***************************************************************************** +void +USBOTGSessionRequest(uint32_t ui32Base, bool bStart) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Start or end the session as directed. + // + if(bStart) + { + HWREGB(ui32Base + USB_O_DEVCTL) |= USB_DEVCTL_SESSION; + } + else + { + HWREGB(ui32Base + USB_O_DEVCTL) &= ~USB_DEVCTL_SESSION; + } +} + +//***************************************************************************** +// +//! Returns the absolute FIFO address for a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint's FIFO address to return. +//! +//! This function returns the actual physical address of the FIFO. This +//! address is needed when the USB is going to be used with the uDMA +//! controller and the source or destination address must be set to the +//! physical FIFO address for a given endpoint. +//! +//! \return None. +// +//***************************************************************************** +uint32_t +USBFIFOAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + // + // Return the FIFO address for this endpoint. + // + return(ui32Base + USB_O_FIFO0 + (ui32Endpoint >> 2U)); +} + +//***************************************************************************** +// +//! Returns the current operating mode of the controller. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the current operating mode on USB controllers with +//! OTG or Dual mode functionality. +//! +//! For OTG controllers: +//! +//! The function returns one of the following values on OTG controllers: +//! \b USB_OTG_MODE_ASIDE_HOST, \b USB_OTG_MODE_ASIDE_DEV, +//! \b USB_OTG_MODE_BSIDE_HOST, \b USB_OTG_MODE_BSIDE_DEV, +//! \b USB_OTG_MODE_NONE. +//! +//! \b USB_OTG_MODE_ASIDE_HOST indicates that the controller is in host mode +//! on the A-side of the cable. +//! +//! \b USB_OTG_MODE_ASIDE_DEV indicates that the controller is in device mode +//! on the A-side of the cable. +//! +//! \b USB_OTG_MODE_BSIDE_HOST indicates that the controller is in host mode +//! on the B-side of the cable. +//! +//! \b USB_OTG_MODE_BSIDE_DEV indicates that the controller is in device mode +//! on the B-side of the cable. If an OTG session request is started with no +//! cable in place, this mode is the default. +//! +//! \b USB_OTG_MODE_NONE indicates that the controller is not attempting to +//! determine its role in the system. +//! +//! For Dual Mode controllers: +//! +//! The function returns one of the following values: +//! \b USB_DUAL_MODE_HOST, \b USB_DUAL_MODE_DEVICE, or +//! \b USB_DUAL_MODE_NONE. +//! +//! \b USB_DUAL_MODE_HOST indicates that the controller is acting as a host. +//! +//! \b USB_DUAL_MODE_DEVICE indicates that the controller acting as a device. +//! +//! \b USB_DUAL_MODE_NONE indicates that the controller is not active as +//! either a host or device. +//! +//! \return Returns \b USB_OTG_MODE_ASIDE_HOST, \b USB_OTG_MODE_ASIDE_DEV, +//! \b USB_OTG_MODE_BSIDE_HOST, \b USB_OTG_MODE_BSIDE_DEV, +//! \b USB_OTG_MODE_NONE, \b USB_DUAL_MODE_HOST, \b USB_DUAL_MODE_DEVICE, or +//! \b USB_DUAL_MODE_NONE. +// +//***************************************************************************** +uint32_t +USBModeGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Checks the current mode in the USB_O_DEVCTL and returns the current + // mode. + // + // USB_OTG_MODE_ASIDE_HOST: USB_DEVCTL_HOST | USB_DEVCTL_SESSION + // USB_OTG_MODE_ASIDE_DEV: USB_DEVCTL_SESSION + // USB_OTG_MODE_BSIDE_HOST: USB_DEVCTL_DEV | USB_DEVCTL_SESSION | + // USB_DEVCTL_HOST + // USB_OTG_MODE_BSIDE_DEV: USB_DEVCTL_DEV | USB_DEVCTL_SESSION + // USB_OTG_MODE_NONE: USB_DEVCTL_DEV + // + return(HWREGB(ui32Base + USB_O_DEVCTL) & + (USB_DEVCTL_DEV | USB_DEVCTL_HOST | USB_DEVCTL_SESSION | + USB_DEVCTL_VBUS_M)); +} + +//***************************************************************************** +// +//! Sets the DMA channel to use for a given endpoint. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint specifies which endpoint's FIFO address to return. +//! \param ui32Channel specifies which DMA channel to use for which endpoint. +//! +//! This function is used to configure which DMA channel to use with a given +//! endpoint. Receive DMA channels can only be used with receive endpoints +//! and transmit DMA channels can only be used with transmit endpoints. As a +//! result, the 3 receive and 3 transmit DMA channels can be mapped to any +//! endpoint other than 0. The values that are passed into the +//! \e ui32Channel value are the UDMA_CHANNEL_USBEP* values defined in udma.h. +//! +//! \note This function only has an effect on microcontrollers that have the +//! ability to change the DMA channel for an endpoint. Calling this function +//! on other devices has no effect. +//! +//! \return None. +//! +//***************************************************************************** +void +USBEndpointDMAChannel(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Channel) +{ + uint32_t ui32Mask; + + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_1) || (ui32Endpoint == USB_EP_2) || + (ui32Endpoint == USB_EP_3) || (ui32Endpoint == USB_EP_4) || + (ui32Endpoint == USB_EP_5) || (ui32Endpoint == USB_EP_6) || + (ui32Endpoint == USB_EP_7) || (ui32Endpoint == USB_EP_8) || + (ui32Endpoint == USB_EP_9) || (ui32Endpoint == USB_EP_10) || + (ui32Endpoint == USB_EP_11) || (ui32Endpoint == USB_EP_12) || + (ui32Endpoint == USB_EP_13) || (ui32Endpoint == USB_EP_14) || + (ui32Endpoint == USB_EP_15)); + + // + // The input select mask must be shifted into the correct position + // based on the channel. + // + ui32Mask = (uint32_t)0xFU << (ui32Channel * 4U); + + // + // Clear out the current selection for the channel. + // + ui32Mask = HWREG(ui32Base + USB_O_DMASEL) & (~ui32Mask); + + // + // The input select is now shifted into the correct position based on the + // channel. + // + ui32Mask |= ((uint32_t)USBEPToIndex(ui32Endpoint)) << (ui32Channel * 4U); + + // + // Write the value out to the register. + // + HWREG(ui32Base + USB_O_DMASEL) = ui32Mask; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to host. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to host mode. +//! +//! \note This function must only be called on microcontrollers that support +//! OTG operation and have the DEVMODOTG bit in the USBGPCS register. +//! +//! \return None. +// +//***************************************************************************** +void +USBHostMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Force mode in OTG parts that support forcing USB controller mode. + // This bit is not writable in USB controllers that do not support + // forcing the mode. Not setting the USB_GPCS_DEVMOD bit makes this a + // force of host mode. + // + HWREGB(ui32Base + USB_O_GPCS) = USB_GPCS_DEVMODOTG; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to device. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to device mode. +//! +//! \note This function must only be called on microcontrollers that support +//! OTG operation and have the DEVMODOTG bit in the USBGPCS register. +//! +//! \return None. +// +//***************************************************************************** +void +USBDevMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the USB controller mode to device. + // + HWREGB(ui32Base + USB_O_GPCS) = USB_GPCS_DEVMODOTG | USB_GPCS_DEVMOD; +} + +//***************************************************************************** +// +//! Change the mode of the USB controller to OTG. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function changes the mode of the USB controller to OTG mode. This +//! function is only valid on microcontrollers that have the OTG capabilities. +//! +//! \return None. +// +//***************************************************************************** +void +USBOTGMode(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Disable the override of the USB controller mode when running on an OTG + // device. + // + HWREGB(ui32Base + USB_O_GPCS) = 0U; +} + +//***************************************************************************** +// +//! Powers off the USB PHY. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function powers off the USB PHY, reducing the current consuption +//! of the device. While in the powered-off state, the USB controller is +//! unable to operate. +//! +//! \return None. +// +//***************************************************************************** +void +USBPHYPowerOff(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Set the PWRDNPHY bit in the PHY, putting it into its low power mode. + // + HWREGB(ui32Base + USB_O_POWER) |= USB_POWER_PWRDNPHY; +} + +//***************************************************************************** +// +//! Powers on the USB PHY. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function powers on the USB PHY, enabling it return to normal +//! operation. By default, the PHY is powered on, so this function must +//! only be called if USBPHYPowerOff() has previously been called. +//! +//! \return None. +// +//***************************************************************************** +void +USBPHYPowerOn(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Clear the PWRDNPHY bit in the PHY, putting it into normal operating + // mode. + // + HWREGB(ui32Base + USB_O_POWER) &= ~USB_POWER_PWRDNPHY; +} + +//***************************************************************************** +// +//! Sets the number of packets to request when transferring multiple bulk +//! packets. +//! +//! \param ui32Base specifies the USB module base address. +//! \param ui32Endpoint is the endpoint index to target for this write. +//! \param ui32Count is the number of packets to request. +//! +//! This function sets the number of consecutive bulk packets to request +//! when transferring multiple bulk packets with DMA. +//! +//! \note This feature is not available on all Tiva devices. Please +//! check the data sheet to determine if the USB controller has a DMA +//! controller or if it must use the uDMA controller for DMA transfers. +//! +//! \return None. +// +//***************************************************************************** +void +USBEndpointPacketCountSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Count) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + ASSERT((ui32Endpoint == USB_EP_0) || (ui32Endpoint == USB_EP_1) || + (ui32Endpoint == USB_EP_2) || (ui32Endpoint == USB_EP_3) || + (ui32Endpoint == USB_EP_4) || (ui32Endpoint == USB_EP_5) || + (ui32Endpoint == USB_EP_6) || (ui32Endpoint == USB_EP_7) || + (ui32Endpoint == USB_EP_8) || (ui32Endpoint == USB_EP_9) || + (ui32Endpoint == USB_EP_10) || (ui32Endpoint == USB_EP_11) || + (ui32Endpoint == USB_EP_12) || (ui32Endpoint == USB_EP_13) || + (ui32Endpoint == USB_EP_14) || (ui32Endpoint == USB_EP_15)); + + HWREG(ui32Base + USB_O_RQPKTCOUNT1 + + (0x4U * (USBEPToIndex(ui32Endpoint) - 1U))) = ui32Count; +} + +//***************************************************************************** +// +//! Returns the number of USB endpoint pairs on the device. +//! +//! \param ui32Base specifies the USB module base address. +//! +//! This function returns the number of endpoint pairs supported by the USB +//! controller corresponding to the passed base address. The value returned is +//! the number of IN or OUT endpoints available and does not include endpoint 0 +//! (the control endpoint). For example, if 15 is returned, there are 15 IN +//! and 15 OUT endpoints available in addition to endpoint 0. +//! +//! \return Returns the number of IN or OUT endpoints available. +// +//***************************************************************************** +uint32_t +USBNumEndpointsGet(uint32_t ui32Base) +{ + // + // Check the arguments. + // + ASSERT(ui32Base == USBA_BASE); + + // + // Read the number of endpoints from the hardware. The number of TX and + // RX endpoints are always the same. + // + return(15U); +} + diff --git a/gpio_driverlib_cpu1/device/driverlib/usb.h b/gpio_driverlib_cpu1/device/driverlib/usb.h new file mode 100644 index 0000000..ae3c7ad --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/usb.h @@ -0,0 +1,560 @@ +//########################################################################### +// +// FILE: usb.h +// +// TITLE: Prototypes for the USB Interface Driver. +// +//########################################################################### +// +// +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### +#ifndef USB_H +#define USB_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup usb_api USB +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// The following are defines for the g_usUSBFlags variable +// +//***************************************************************************** +#define USB_VBUS_VALID 0x0001U +#define USB_ID_HOST 0x0002U +#define USB_ID_DEVICE 0x0000U +#define USB_PFLT_ACTIVE 0x0004U + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableControl() and +// USBIntDisableControl() as the ui32Flags parameter, and are returned from +// USBIntStatusControl(). +// +//***************************************************************************** +#define USB_INTCTRL_ALL 0x000003FFUL // All control interrupt sources +#define USB_INTCTRL_STATUS 0x000000FFUL // Status Interrupts +#define USB_INTCTRL_VBUS_ERR 0x00000080UL // VBUS Error +#define USB_INTCTRL_SESSION 0x00000040UL // Session Start Detected +#define USB_INTCTRL_SESSION_END 0x00000040UL // Session End Detected +#define USB_INTCTRL_DISCONNECT 0x00000020UL // Disconnect Detected +#define USB_INTCTRL_CONNECT 0x00000010UL // Device Connect Detected +#define USB_INTCTRL_SOF 0x00000008UL // Start of Frame Detected +#define USB_INTCTRL_BABBLE 0x00000004UL // Babble signaled +#define USB_INTCTRL_RESET 0x00000004UL // Reset signaled +#define USB_INTCTRL_RESUME 0x00000002UL // Resume detected +#define USB_INTCTRL_SUSPEND 0x00000001UL // Suspend detected +#define USB_INTCTRL_MODE_DETECT 0x00000200UL // Mode value valid +#define USB_INTCTRL_POWER_FAULT 0x00000100UL // Power Fault detected + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnableEndpoint() and +// USBIntDisableEndpoint() as the ui32Flags parameter, and are returned from +// USBIntStatusEndpoint(). +// +//***************************************************************************** +#define USB_INTEP_ALL 0xFFFFFFFFUL // Host IN Interrupts +#define USB_INTEP_HOST_IN 0xFFFE0000UL // Host IN Interrupts +#define USB_INTEP_HOST_IN_15 0x80000000UL // Endpoint 15 Host IN Interrupt +#define USB_INTEP_HOST_IN_14 0x40000000UL // Endpoint 14 Host IN Interrupt +#define USB_INTEP_HOST_IN_13 0x20000000UL // Endpoint 13 Host IN Interrupt +#define USB_INTEP_HOST_IN_12 0x10000000UL // Endpoint 12 Host IN Interrupt +#define USB_INTEP_HOST_IN_11 0x08000000UL // Endpoint 11 Host IN Interrupt +#define USB_INTEP_HOST_IN_10 0x04000000UL // Endpoint 10 Host IN Interrupt +#define USB_INTEP_HOST_IN_9 0x02000000UL // Endpoint 9 Host IN Interrupt +#define USB_INTEP_HOST_IN_8 0x01000000UL // Endpoint 8 Host IN Interrupt +#define USB_INTEP_HOST_IN_7 0x00800000UL // Endpoint 7 Host IN Interrupt +#define USB_INTEP_HOST_IN_6 0x00400000UL // Endpoint 6 Host IN Interrupt +#define USB_INTEP_HOST_IN_5 0x00200000UL // Endpoint 5 Host IN Interrupt +#define USB_INTEP_HOST_IN_4 0x00100000UL // Endpoint 4 Host IN Interrupt +#define USB_INTEP_HOST_IN_3 0x00080000UL // Endpoint 3 Host IN Interrupt +#define USB_INTEP_HOST_IN_2 0x00040000UL // Endpoint 2 Host IN Interrupt +#define USB_INTEP_HOST_IN_1 0x00020000UL // Endpoint 1 Host IN Interrupt + +#define USB_INTEP_DEV_OUT 0xFFFE0000UL // Device OUT Interrupts +#define USB_INTEP_DEV_OUT_15 0x80000000UL // Endpoint 15 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_14 0x40000000UL // Endpoint 14 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_13 0x20000000UL // Endpoint 13 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_12 0x10000000UL // Endpoint 12 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_11 0x08000000UL // Endpoint 11 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_10 0x04000000UL // Endpoint 10 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_9 0x02000000UL // Endpoint 9 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_8 0x01000000UL // Endpoint 8 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_7 0x00800000UL // Endpoint 7 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_6 0x00400000UL // Endpoint 6 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_5 0x00200000UL // Endpoint 5 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_4 0x00100000UL // Endpoint 4 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_3 0x00080000UL // Endpoint 3 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_2 0x00040000UL // Endpoint 2 Device OUT Interrupt +#define USB_INTEP_DEV_OUT_1 0x00020000UL // Endpoint 1 Device OUT Interrupt + +#define USB_INTEP_HOST_OUT 0x0000FFFEUL // Host OUT Interrupts +#define USB_INTEP_HOST_OUT_15 0x00008000UL // Endpoint 15 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_14 0x00004000UL // Endpoint 14 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_13 0x00002000UL // Endpoint 13 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_12 0x00001000UL // Endpoint 12 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_11 0x00000800UL // Endpoint 11 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_10 0x00000400UL // Endpoint 10 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_9 0x00000200UL // Endpoint 9 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_8 0x00000100UL // Endpoint 8 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_7 0x00000080UL // Endpoint 7 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_6 0x00000040UL // Endpoint 6 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_5 0x00000020UL // Endpoint 5 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_4 0x00000010UL // Endpoint 4 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_3 0x00000008UL // Endpoint 3 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_2 0x00000004UL // Endpoint 2 Host OUT Interrupt +#define USB_INTEP_HOST_OUT_1 0x00000002UL // Endpoint 1 Host OUT Interrupt + +#define USB_INTEP_DEV_IN 0x0000FFFEUL // Device IN Interrupts +#define USB_INTEP_DEV_IN_15 0x00008000UL // Endpoint 15 Device IN Interrupt +#define USB_INTEP_DEV_IN_14 0x00004000UL // Endpoint 14 Device IN Interrupt +#define USB_INTEP_DEV_IN_13 0x00002000UL // Endpoint 13 Device IN Interrupt +#define USB_INTEP_DEV_IN_12 0x00001000UL // Endpoint 12 Device IN Interrupt +#define USB_INTEP_DEV_IN_11 0x00000800UL // Endpoint 11 Device IN Interrupt +#define USB_INTEP_DEV_IN_10 0x00000400UL // Endpoint 10 Device IN Interrupt +#define USB_INTEP_DEV_IN_9 0x00000200UL // Endpoint 9 Device IN Interrupt +#define USB_INTEP_DEV_IN_8 0x00000100UL // Endpoint 8 Device IN Interrupt +#define USB_INTEP_DEV_IN_7 0x00000080UL // Endpoint 7 Device IN Interrupt +#define USB_INTEP_DEV_IN_6 0x00000040UL // Endpoint 6 Device IN Interrupt +#define USB_INTEP_DEV_IN_5 0x00000020UL // Endpoint 5 Device IN Interrupt +#define USB_INTEP_DEV_IN_4 0x00000010UL // Endpoint 4 Device IN Interrupt +#define USB_INTEP_DEV_IN_3 0x00000008UL // Endpoint 3 Device IN Interrupt +#define USB_INTEP_DEV_IN_2 0x00000004UL // Endpoint 2 Device IN Interrupt +#define USB_INTEP_DEV_IN_1 0x00000002UL // Endpoint 1 Device IN Interrupt + +#define USB_INTEP_0 0x00000001UL // Endpoint 0 Interrupt + +//***************************************************************************** +// +// The following are values that are returned from USBSpeedGet(). +// +//***************************************************************************** +#define USB_UNDEF_SPEED 0x80000000UL // Current speed is undefined +#define USB_FULL_SPEED 0x00000001UL // Current speed is Full Speed +#define USB_LOW_SPEED 0x00000000UL // Current speed is Low Speed + +//***************************************************************************** +// +// The following are values that are returned from USBEndpointStatus(). The +// USB_HOST_* values are used when the USB controller is in host mode and the +// USB_DEV_* values are used when the USB controller is in device mode. +// +//***************************************************************************** +#define USB_HOST_IN_STATUS 0xFFFF0000UL // Mask of all host IN interrupts +#define USB_HOST_IN_PID_ERROR 0x10000000UL // Stall on this endpoint received +#define USB_HOST_IN_NOT_COMP 0x01000000UL // Device failed to respond +#define USB_HOST_IN_STALL 0x00400000UL // Stall on this endpoint received +#define USB_HOST_IN_DATA_ERROR 0x00080000UL // CRC or bit-stuff error + // (ISOC Mode) +#define USB_HOST_IN_NAK_TO 0x00080000UL // NAK received for more than the + // specified timeout period +#define USB_HOST_IN_ERROR 0x00040000UL // Failed to communicate with a + // device +#define USB_HOST_IN_FIFO_FULL 0x00020000UL // RX FIFO full +#define USB_HOST_IN_PKTRDY 0x00010000UL // Data packet ready +#define USB_HOST_OUT_STATUS 0x0000FFFFUL // Mask of all host OUT interrupts +#define USB_HOST_OUT_NAK_TO 0x00000080UL // NAK received for more than the + // specified timeout period +#define USB_HOST_OUT_NOT_COMP 0x00000080UL // No response from device + // (ISOC mode) +#define USB_HOST_OUT_STALL 0x00000020UL // Stall on this endpoint received +#define USB_HOST_OUT_ERROR 0x00000004UL // Failed to communicate with a + // device +#define USB_HOST_OUT_FIFO_NE 0x00000002UL // TX FIFO is not empty +#define USB_HOST_OUT_PKTPEND 0x00000001UL // Transmit still being transmitted +#define USB_HOST_EP0_NAK_TO 0x00000080UL // NAK received for more than the + // specified timeout period +#define USB_HOST_EP0_STATUS 0x00000040UL // This was a status packet +#define USB_HOST_EP0_ERROR 0x00000010UL // Failed to communicate with a + // device +#define USB_HOST_EP0_RX_STALL 0x00000004UL // Stall on this endpoint received +#define USB_HOST_EP0_RXPKTRDY 0x00000001UL // Receive data packet ready +#define USB_DEV_RX_PID_ERROR 0x01000000UL // PID error in isochronous + // transfer +#define USB_DEV_RX_SENT_STALL 0x00400000UL // Stall was sent on this endpoint +#define USB_DEV_RX_DATA_ERROR 0x00080000UL // CRC error on the data +#define USB_DEV_RX_OVERRUN 0x00040000UL // OUT packet was not loaded due to + // a full FIFO +#define USB_DEV_RX_FIFO_FULL 0x00020000UL // RX FIFO full +#define USB_DEV_RX_PKT_RDY 0x00010000UL // Data packet ready +#define USB_DEV_TX_NOT_COMP 0x00000080UL // Large packet split up, more data + // to come +#define USB_DEV_TX_SENT_STALL 0x00000020UL // Stall was sent on this endpoint +#define USB_DEV_TX_UNDERRUN 0x00000004UL // IN received with no data ready +#define USB_DEV_TX_FIFO_NE 0x00000002UL // The TX FIFO is not empty +#define USB_DEV_TX_TXPKTRDY 0x00000001UL // Transmit still being transmitted +#define USB_DEV_EP0_SETUP_END 0x00000010UL // Control transaction ended before + // Data End seen +#define USB_DEV_EP0_SENT_STALL 0x00000004UL // Stall was sent on this endpoint +#define USB_DEV_EP0_IN_PKTPEND 0x00000002UL // Transmit data packet pending +#define USB_DEV_EP0_OUT_PKTRDY 0x00000001UL // Receive data packet ready + +//***************************************************************************** +// +// The following are values that can be passed to USBHostEndpointConfig() and +// USBDevEndpointConfigSet() as the ui32Flags parameter. +// +//***************************************************************************** +#define USB_EP_AUTO_SET 0x00000001UL // Auto set feature enabled +#define USB_EP_AUTO_REQUEST 0x00000002UL // Auto request feature enabled +#define USB_EP_AUTO_CLEAR 0x00000004UL // Auto clear feature enabled +#define USB_EP_DMA_MODE_0 0x00000008UL // Enable DMA access using mode 0 +#define USB_EP_DMA_MODE_1 0x00000010UL // Enable DMA access using mode 1 +#define USB_EP_MODE_ISOC 0x00000000UL // Isochronous endpoint +#define USB_EP_MODE_BULK 0x00000100UL // Bulk endpoint +#define USB_EP_MODE_INT 0x00000200UL // Interrupt endpoint +#define USB_EP_MODE_CTRL 0x00000300UL // Control endpoint +#define USB_EP_MODE_MASK 0x00000300UL // Mode Mask +#define USB_EP_SPEED_LOW 0x00000000UL // Low Speed +#define USB_EP_SPEED_FULL 0x00001000UL // Full Speed +#define USB_EP_HOST_IN 0x00000000UL // Host IN endpoint +#define USB_EP_HOST_OUT 0x00002000UL // Host OUT endpoint +#define USB_EP_DEV_IN 0x00002000UL // Device IN endpoint +#define USB_EP_DEV_OUT 0x00000000UL // Device OUT endpoint + +//***************************************************************************** +// +// The following are values that can be passed to USBHostPwrConfig() as the +// ui32Flags parameter. +// +//***************************************************************************** +#define USB_HOST_PWRFLT_LOW 0x00000010UL +#define USB_HOST_PWRFLT_HIGH 0x00000030UL +#define USB_HOST_PWRFLT_EP_NONE 0x00000000UL +#define USB_HOST_PWRFLT_EP_TRI 0x00000140UL +#define USB_HOST_PWRFLT_EP_LOW 0x00000240UL +#define USB_HOST_PWRFLT_EP_HIGH 0x00000340UL +#define USB_HOST_PWREN_MAN_LOW 0x00000000UL +#define USB_HOST_PWREN_MAN_HIGH 0x00000001UL +#define USB_HOST_PWREN_AUTOLOW 0x00000002UL +#define USB_HOST_PWREN_AUTOHIGH 0x00000003UL +#define USB_HOST_PWREN_FILTER 0x00010000UL + +//***************************************************************************** +// +// This value specifies the maximum size of transfers on endpoint 0 as 64 +// bytes. This value is fixed in hardware as the FIFO size for endpoint 0. +// +//***************************************************************************** +#define MAX_PACKET_SIZE_EP0 64U + +//***************************************************************************** +// +// These values are used to indicate which endpoint to access. +// +//***************************************************************************** +#define USB_EP_0 0x00000000UL // Endpoint 0 +#define USB_EP_1 0x00000010UL // Endpoint 1 +#define USB_EP_2 0x00000020UL // Endpoint 2 +#define USB_EP_3 0x00000030UL // Endpoint 3 +#define USB_EP_4 0x00000040UL // Endpoint 4 +#define USB_EP_5 0x00000050UL // Endpoint 5 +#define USB_EP_6 0x00000060UL // Endpoint 6 +#define USB_EP_7 0x00000070UL // Endpoint 7 +#define USB_EP_8 0x00000080UL // Endpoint 8 +#define USB_EP_9 0x00000090UL // Endpoint 9 +#define USB_EP_10 0x000000A0UL // Endpoint 10 +#define USB_EP_11 0x000000B0UL // Endpoint 11 +#define USB_EP_12 0x000000C0UL // Endpoint 12 +#define USB_EP_13 0x000000D0UL // Endpoint 13 +#define USB_EP_14 0x000000E0UL // Endpoint 14 +#define USB_EP_15 0x000000F0UL // Endpoint 15 +#define NUM_USB_EP 16U // Number of supported endpoints + +//***************************************************************************** +// +// These macros allow conversion between 0-based endpoint indices and the +// USB_EP_x values required when calling various USB APIs. +// +//***************************************************************************** +#define IndexToUSBEP(x) (((uint32_t)(x) << 4U) & 0xFFU) +#define USBEPToIndex(x) ((x) >> 4U) + +//***************************************************************************** +// +// The following are values that can be passed to USBFIFOConfigSet() as the +// ui32FIFOSize parameter. +// +//***************************************************************************** +#define USB_FIFO_SZ_8 0x00000000UL // 8 byte FIFO +#define USB_FIFO_SZ_16 0x00000001UL // 16 byte FIFO +#define USB_FIFO_SZ_32 0x00000002UL // 32 byte FIFO +#define USB_FIFO_SZ_64 0x00000003UL // 64 byte FIFO +#define USB_FIFO_SZ_128 0x00000004UL // 128 byte FIFO +#define USB_FIFO_SZ_256 0x00000005UL // 256 byte FIFO +#define USB_FIFO_SZ_512 0x00000006UL // 512 byte FIFO +#define USB_FIFO_SZ_1024 0x00000007UL // 1024 byte FIFO +#define USB_FIFO_SZ_2048 0x00000008UL // 2048 byte FIFO +#define USB_FIFO_SZ_4096 0x00000009UL // 4096 byte FIFO +#define USB_FIFO_SZ_8_DB 0x00000010UL // 8 byte double buffered FIFO + // (occupying 16 bytes) +#define USB_FIFO_SZ_16_DB 0x00000011UL // 16 byte double buffered FIFO + // (occupying 32 bytes) +#define USB_FIFO_SZ_32_DB 0x00000012UL // 32 byte double buffered FIFO + // (occupying 64 bytes) +#define USB_FIFO_SZ_64_DB 0x00000013UL // 64 byte double buffered FIFO + // (occupying 128 bytes) +#define USB_FIFO_SZ_128_DB 0x00000014UL // 128 byte double buffered FIFO + // (occupying 256 bytes) +#define USB_FIFO_SZ_256_DB 0x00000015UL // 256 byte double buffered FIFO + // (occupying 512 bytes) +#define USB_FIFO_SZ_512_DB 0x00000016UL // 512 byte double buffered FIFO + // (occupying 1024 bytes) +#define USB_FIFO_SZ_1024_DB 0x00000017UL // 1024 byte double buffered FIFO + // (occupying 2048 bytes) +#define USB_FIFO_SZ_2048_DB 0x00000018UL // 2048 byte double buffered FIFO + // (occupying 4096 bytes) + +//***************************************************************************** +// +// This macro allow conversion from a FIFO size label as defined above to +// a number of bytes +// +//***************************************************************************** +#define USB_FIFO_SIZE_DB_FLAG 0x00000010UL +#define USBFIFOSizeToBytes(x) ((uint32_t)8U << (x)) + +//***************************************************************************** +// +// The following are values that can be passed to USBEndpointDataSend() as the +// ui32TransType parameter. +// +//***************************************************************************** +#define USB_TRANS_OUT 0x00000102UL // Normal OUT transaction +#define USB_TRANS_IN 0x00000102UL // Normal IN transaction +#define USB_TRANS_IN_LAST 0x0000010AUL // Final IN transaction (for + // endpoint 0 in device mode) +#define USB_TRANS_SETUP 0x0000110AUL // Setup transaction (for endpoint + // 0) +#define USB_TRANS_STATUS 0x00000142UL // Status transaction (for endpoint + // 0) + +//***************************************************************************** +// +// The following are values are returned by the USBModeGet function. +// +//***************************************************************************** +#define USB_DUAL_MODE_HOST 0x00000001UL // Dual mode controller is in Host + // mode. +#define USB_DUAL_MODE_DEVICE 0x00000081UL // Dual mode controller is in + // Device mode. +#define USB_DUAL_MODE_NONE 0x00000080UL // Dual mode controller mode is not + // set. +#define USB_OTG_MODE_ASIDE_HOST 0x0000001DUL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_NPWR 0x00000001UL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_ASIDE_SESS 0x00000009UL // OTG controller on the A side of + // the cable Session Valid. +#define USB_OTG_MODE_ASIDE_AVAL 0x00000011UL // OTG controller on the A side of + // the cable A valid. +#define USB_OTG_MODE_ASIDE_DEV 0x00000019UL // OTG controller on the A side of + // the cable. +#define USB_OTG_MODE_BSIDE_HOST 0x0000009DUL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_DEV 0x00000099UL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_BSIDE_NPWR 0x00000081UL // OTG controller on the B side of + // the cable. +#define USB_OTG_MODE_NONE 0x00000080UL // OTG controller mode is not set. + + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern uint32_t USBDevAddrGet(uint32_t ui32Base); +extern void USBDevAddrSet(uint32_t ui32Base, uint32_t ui32Address); +extern void USBDevConnect(uint32_t ui32Base); +extern void USBDevDisconnect(uint32_t ui32Base); +extern void USBDevEndpointConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, + uint32_t ui32Flags); +extern void USBDevEndpointConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32MaxPacketSize, + uint32_t *pui32Flags); +extern void USBDevEndpointDataAck(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bIsLastPacket); +extern void USBDevEndpointStall(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBDevEndpointStallClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBDevEndpointStatusClear(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBEndpointDataAvail(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBEndpointDMAEnable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointDMADisable(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointDMAConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Config); +extern int32_t USBEndpointDataGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t *pui32Size); +extern int32_t USBEndpointDataPut(uint32_t ui32Base, uint32_t ui32Endpoint, + uint8_t *pui8Data, uint32_t ui32Size); +extern int32_t USBEndpointDataSend(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32TransType); +extern void USBEndpointDataToggleClear(uint32_t ui32Base, + uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBEndpointPacketCountSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Count); +extern uint32_t USBEndpointStatus(uint32_t ui32Base, uint32_t ui32Endpoint); +extern uint32_t USBFIFOAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBFIFOConfigGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t *pui32FIFOAddress, + uint32_t *pui32FIFOSize, uint32_t ui32Flags); +extern void USBFIFOConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32FIFOAddress, uint32_t ui32FIFOSize, + uint32_t ui32Flags); +extern void USBFIFOFlush(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBFrameNumberGet(uint32_t ui32Base); +extern uint32_t USBHostAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBHostAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Addr, uint32_t ui32Flags); +extern void USBHostEndpointConfig(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32MaxPacketSize, + uint32_t ui32NAKPollInterval, + uint32_t ui32TargetEndpoint, + uint32_t ui32Flags); +extern void USBHostEndpointDataAck(uint32_t ui32Base, + uint32_t ui32Endpoint); +extern void USBHostEndpointDataToggle(uint32_t ui32Base, uint32_t ui32Endpoint, + bool bDataToggle, uint32_t ui32Flags); +extern void USBHostEndpointStatusClear(uint32_t ui32Base, + uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern uint32_t USBHostHubAddrGet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Flags); +extern void USBHostHubAddrSet(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Addr, uint32_t ui32Flags); +extern void USBHostPwrDisable(uint32_t ui32Base); +extern void USBHostPwrEnable(uint32_t ui32Base); +extern void USBHostPwrConfig(uint32_t ui32Base, uint32_t ui32Flags); +extern void USBHostPwrFaultDisable(uint32_t ui32Base); +extern void USBHostPwrFaultEnable(uint32_t ui32Base); +extern void USBHostRequestIN(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBHostRequestINClear(uint32_t ui32Base, uint32_t ui32Endpoint); +extern void USBHostRequestStatus(uint32_t ui32Base); +extern void USBHostReset(uint32_t ui32Base, bool bStart); +extern void USBHostResume(uint32_t ui32Base, bool bStart); +extern uint32_t USBHostSpeedGet(uint32_t ui32Base); +extern void USBHostSuspend(uint32_t ui32Base); +extern void USBIntDisableControl(uint32_t ui32Base, uint32_t ui32IntFlags); +extern void USBIntEnableControl(uint32_t ui32Base, uint32_t ui32IntFlags); +extern uint32_t USBIntStatus(uint32_t ui32Base, uint32_t *ui32IntStatusEP); +extern uint32_t USBIntStatusControl(uint32_t ui32Base); +extern void USBIntDisableEndpoint(uint32_t ui32Base, uint32_t ui32IntFlags); +extern void USBIntEnableEndpoint(uint32_t ui32Base, uint32_t ui32IntFlags); +extern uint32_t USBIntStatusEndpoint(uint32_t ui32Base); +extern void USBOTGSessionRequest(uint32_t ui32Base, bool bStart); +extern uint32_t USBModeGet(uint32_t ui32Base); +extern void USBEndpointDMAChannel(uint32_t ui32Base, uint32_t ui32Endpoint, + uint32_t ui32Channel); +extern void USBHostMode(uint32_t ui32Base); +extern void USBDevMode(uint32_t ui32Base); +extern void USBOTGMode(uint32_t ui32Base); +extern void USBPHYPowerOff(uint32_t ui32Base); +extern void USBPHYPowerOn(uint32_t ui32Base); +extern uint32_t USBNumEndpointsGet(uint32_t ui32Base); + +//***************************************************************************** +// +// The following are values that can be passed to USBIntEnable() and +// USBIntDisable() as the ulIntFlags parameter, and are returned from +// USBIntStatus(). +// +//***************************************************************************** +#define USB_INT_ALL 0xFF030E0FUL // All Interrupt sources +#define USB_INT_STATUS 0xFF000000UL // Status Interrupts +#define USB_INT_VBUS_ERR 0x80000000UL // VBUS Error +#define USB_INT_SESSION_START 0x40000000UL // Session Start Detected +#define USB_INT_SESSION_END 0x20000000UL // Session End Detected +#define USB_INT_DISCONNECT 0x20000000UL // Disconnect Detected +#define USB_INT_CONNECT 0x10000000UL // Device Connect Detected +#define USB_INT_SOF 0x08000000UL // Start of Frame Detected +#define USB_INT_BABBLE 0x04000000UL // Babble signaled +#define USB_INT_RESET 0x04000000UL // Reset signaled +#define USB_INT_RESUME 0x02000000UL // Resume detected +#define USB_INT_SUSPEND 0x01000000UL // Suspend detected +#define USB_INT_MODE_DETECT 0x00020000UL // Mode value valid +#define USB_INT_POWER_FAULT 0x00010000UL // Power Fault detected +#define USB_INT_HOST_IN 0x00000E00UL // Host IN Interrupts +#define USB_INT_DEV_OUT 0x00000E00UL // Device OUT Interrupts +#define USB_INT_HOST_IN_EP3 0x00000800UL // Endpoint 3 Host IN Interrupt +#define USB_INT_HOST_IN_EP2 0x00000400UL // Endpoint 2 Host IN Interrupt +#define USB_INT_HOST_IN_EP1 0x00000200UL // Endpoint 1 Host IN Interrupt +#define USB_INT_DEV_OUT_EP3 0x00000800UL // Endpoint 3 Device OUT Interrupt +#define USB_INT_DEV_OUT_EP2 0x00000400UL // Endpoint 2 Device OUT Interrupt +#define USB_INT_DEV_OUT_EP1 0x00000200UL // Endpoint 1 Device OUT Interrupt +#define USB_INT_HOST_OUT 0x0000000EUL // Host OUT Interrupts +#define USB_INT_DEV_IN 0x0000000EUL // Device IN Interrupts +#define USB_INT_HOST_OUT_EP3 0x00000008UL // Endpoint 3 HOST_OUT Interrupt +#define USB_INT_HOST_OUT_EP2 0x00000004UL // Endpoint 2 HOST_OUT Interrupt +#define USB_INT_HOST_OUT_EP1 0x00000002UL // Endpoint 1 HOST_OUT Interrupt +#define USB_INT_DEV_IN_EP3 0x00000008UL // Endpoint 3 DEV_IN Interrupt +#define USB_INT_DEV_IN_EP2 0x00000004UL // Endpoint 2 DEV_IN Interrupt +#define USB_INT_DEV_IN_EP1 0x00000002UL // Endpoint 1 DEV_IN Interrupt +#define USB_INT_EP0 0x00000001UL // Endpoint 0 Interrupt + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // USB_H diff --git a/gpio_driverlib_cpu1/device/driverlib/version.c b/gpio_driverlib_cpu1/device/driverlib/version.c new file mode 100644 index 0000000..ced29c1 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/version.c @@ -0,0 +1,54 @@ +//########################################################################### +// +// FILE: version.c +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "version.h" + +//***************************************************************************** +// +// Version_getLibVersion +// +//***************************************************************************** +uint32_t +Version_getLibVersion(void) +{ + return(VERSION_NUMBER); +} diff --git a/gpio_driverlib_cpu1/device/driverlib/version.h b/gpio_driverlib_cpu1/device/driverlib/version.h new file mode 100644 index 0000000..8a3b431 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/version.h @@ -0,0 +1,101 @@ +//########################################################################### +// +// FILE: version.h +// +// TITLE: API to return the version number of the driverlib.lib in use. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef VERSION_H +#define VERSION_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup version_api Version +//! @{ +// +//***************************************************************************** +#include + +//! Version number to be returned by Version_getLibVersion() +//! +#define VERSION_NUMBER 26000000U + +//***************************************************************************** +// +//! Returns the driverlib version number +//! +//! This function can be used to check the version number of the driverlib.lib +//! that is in use. The version number will take the format yy.mm.pp.bb, so for +//! yy-Year, mm-Major Release version, pp-Patch Release Version, bb- Build Number. +//! example, if the function returns 26000000, the driverlib version being used +//! is 26.00.00.00. +//! +//! \return Returns an integer value indicating the driverlib version. +// +//***************************************************************************** +extern uint32_t +Version_getLibVersion(void); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // VERSION_H diff --git a/gpio_driverlib_cpu1/device/driverlib/xbar.c b/gpio_driverlib_cpu1/device/driverlib/xbar.c new file mode 100644 index 0000000..008145a --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/xbar.c @@ -0,0 +1,255 @@ +//########################################################################### +// +// FILE: xbar.c +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#include "xbar.h" + +//***************************************************************************** +// +// XBAR_setOutputMuxConfig +// +//***************************************************************************** +void +XBAR_setOutputMuxConfig(XBAR_OutputNum output, XBAR_OutputMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)output << 1U) + 2U; + } + else + { + offset = (uint16_t)output << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR output. + // + EALLOW; + + HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) = + (HWREG(XBAR_OUTPUT_CFG_REG_BASE + offset) & + ~((uint32_t)0x3U << shift)) | + (((uint32_t)muxConfig & 0x3U) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_setEPWMMuxConfig +// +//***************************************************************************** +void +XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)trip << 1U) + 2U; + } + else + { + offset = (uint16_t)trip << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR trip. + // + EALLOW; + + HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) = + (HWREG(XBAR_EPWM_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | + (((uint32_t)muxConfig & 0x3UL) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_setCLBMuxConfig +// +//***************************************************************************** +void +XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal, XBAR_CLBMuxConfig muxConfig) +{ + uint32_t shift; + uint16_t offset; + + // + // If the configuration is for MUX16-31, we'll need an odd value to index + // into the config registers. + // + if(((uint32_t)muxConfig & 0x2000U) != 0U) + { + offset = ((uint16_t)auxSignal << 1U) + 2U; + } + else + { + offset = (uint16_t)auxSignal << 1U; + } + + // + // Extract the shift from the input value. + // + shift = ((uint32_t)muxConfig >> 8U) & 0x1FU; + + // + // Write the requested muxing value for this XBAR auxSignal. + // + EALLOW; + + + HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) = + (HWREG(XBAR_CLB_CFG_REG_BASE + (uint32_t)offset) & ~(0x3UL << shift)) | + (((uint32_t)muxConfig & 0x3UL) << shift); + + EDIS; +} + +//***************************************************************************** +// +// XBAR_getInputFlagStatus +// +//***************************************************************************** +bool +XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag) +{ + uint32_t offset; + uint32_t inputMask; + + // + // Determine flag register offset. + // + switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) + { + case XBAR_INPUT_FLG_REG_1: + offset = XBAR_O_FLG1; + break; + + case XBAR_INPUT_FLG_REG_2: + offset = XBAR_O_FLG2; + break; + + case XBAR_INPUT_FLG_REG_3: + offset = XBAR_O_FLG3; + break; + + default: + // + // This should never happen if a valid inputFlag value is used. + // + offset = 0U; + break; + } + + // + // Get the status of the X-BAR input latch. + // + inputMask = (uint32_t)1U << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); + + return((HWREG(XBAR_BASE + offset) & inputMask) != 0U); +} + +//***************************************************************************** +// +// XBAR_clearInputFlag +// +//***************************************************************************** +void +XBAR_clearInputFlag(XBAR_InputFlag inputFlag) +{ + uint32_t offset; + uint32_t inputMask; + + // + // Determine flag clear register offset. + // + switch((uint16_t)inputFlag & XBAR_INPUT_FLG_REG_M) + { + case XBAR_INPUT_FLG_REG_1: + offset = XBAR_O_CLR1; + break; + + case XBAR_INPUT_FLG_REG_2: + offset = XBAR_O_CLR2; + break; + + case XBAR_INPUT_FLG_REG_3: + offset = XBAR_O_CLR3; + break; + + default: + // + // This should never happen if a valid inputFlag value is used. + // + offset = 0U; + break; + } + + // + // Set the bit that clears the X-BAR input latch. + // + inputMask = 1UL << ((uint32_t)inputFlag & XBAR_INPUT_FLG_INPUT_M); + HWREG(XBAR_BASE + offset) = inputMask; +} diff --git a/gpio_driverlib_cpu1/device/driverlib/xbar.h b/gpio_driverlib_cpu1/device/driverlib/xbar.h new file mode 100644 index 0000000..02e4e68 --- /dev/null +++ b/gpio_driverlib_cpu1/device/driverlib/xbar.h @@ -0,0 +1,1294 @@ +//########################################################################### +// +// FILE: xbar.h +// +// TITLE: C28x X-BAR driver. +// +//########################################################################### +// +// C2000Ware v26.00.00.00 +// +// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// Neither the name of Texas Instruments Incorporated nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// $ +//########################################################################### + +#ifndef XBAR_H +#define XBAR_H + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! \addtogroup xbar_api XBAR +//! @{ +// +//***************************************************************************** + +#include +#include +#include "inc/hw_clbxbar.h" +#include "inc/hw_epwmxbar.h" +#include "inc/hw_inputxbar.h" +#include "inc/hw_outputxbar.h" +#include "inc/hw_xbar.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "cpu.h" +#include "debug.h" + +//***************************************************************************** +// +// Useful defines used within the driver functions. +// Not intended for use by application code. +// +//***************************************************************************** +#define XBAR_OUTPUT_CFG_REG_BASE (OUTPUTXBAR_BASE + XBAR_O_OUTPUT1MUX0TO15CFG) +#define XBAR_OUTPUT_EN_REG_BASE (OUTPUTXBAR_BASE + XBAR_O_OUTPUT1MUXENABLE) +#define XBAR_EPWM_CFG_REG_BASE (EPWMXBAR_BASE + XBAR_O_TRIP4MUX0TO15CFG) +#define XBAR_EPWM_EN_REG_BASE (EPWMXBAR_BASE + XBAR_O_TRIP4MUXENABLE) +#define XBAR_CLB_CFG_REG_BASE (CLBXBAR_BASE + XBAR_O_AUXSIG0MUX0TO15CFG) +#define XBAR_CLB_EN_REG_BASE (CLBXBAR_BASE + XBAR_O_AUXSIG0MUXENABLE) +#define XBAR_INPUT_BASE (INPUTXBAR_BASE + XBAR_O_INPUT1SELECT) + +#define XBAR_INPUT_FLG_INPUT_M 0x00FFU +#define XBAR_INPUT_FLG_REG_M 0xFF00U +#define XBAR_INPUT_FLG_REG_1 0x0000U +#define XBAR_INPUT_FLG_REG_2 0x0100U +#define XBAR_INPUT_FLG_REG_3 0x0200U + +#define XBAR_GPIO_MAX_CNT 168U + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +// The following values define the muxes parameter for XBAR_enableEPWMMux(), +// XBAR_enableOutputMux(), XBAR_disableEPWMMux(), and +// XBAR_disableOutputMux(). +// +//***************************************************************************** +#define XBAR_MUX00 0x00000001U //!< Mask for X-BAR mux 0 +#define XBAR_MUX01 0x00000002U //!< Mask for X-BAR mux 1 +#define XBAR_MUX02 0x00000004U //!< Mask for X-BAR mux 2 +#define XBAR_MUX03 0x00000008U //!< Mask for X-BAR mux 3 +#define XBAR_MUX04 0x00000010U //!< Mask for X-BAR mux 4 +#define XBAR_MUX05 0x00000020U //!< Mask for X-BAR mux 5 +#define XBAR_MUX06 0x00000040U //!< Mask for X-BAR mux 6 +#define XBAR_MUX07 0x00000080U //!< Mask for X-BAR mux 7 +#define XBAR_MUX08 0x00000100U //!< Mask for X-BAR mux 8 +#define XBAR_MUX09 0x00000200U //!< Mask for X-BAR mux 9 +#define XBAR_MUX10 0x00000400U //!< Mask for X-BAR mux 10 +#define XBAR_MUX11 0x00000800U //!< Mask for X-BAR mux 11 +#define XBAR_MUX12 0x00001000U //!< Mask for X-BAR mux 12 +#define XBAR_MUX13 0x00002000U //!< Mask for X-BAR mux 13 +#define XBAR_MUX14 0x00004000U //!< Mask for X-BAR mux 14 +#define XBAR_MUX15 0x00008000U //!< Mask for X-BAR mux 15 +#define XBAR_MUX16 0x00010000U //!< Mask for X-BAR mux 16 +#define XBAR_MUX17 0x00020000U //!< Mask for X-BAR mux 17 +#define XBAR_MUX18 0x00040000U //!< Mask for X-BAR mux 18 +#define XBAR_MUX19 0x00080000U //!< Mask for X-BAR mux 19 +#define XBAR_MUX20 0x00100000U //!< Mask for X-BAR mux 20 +#define XBAR_MUX21 0x00200000U //!< Mask for X-BAR mux 21 +#define XBAR_MUX22 0x00400000U //!< Mask for X-BAR mux 22 +#define XBAR_MUX23 0x00800000U //!< Mask for X-BAR mux 23 +#define XBAR_MUX24 0x01000000U //!< Mask for X-BAR mux 24 +#define XBAR_MUX25 0x02000000U //!< Mask for X-BAR mux 25 +#define XBAR_MUX26 0x04000000U //!< Mask for X-BAR mux 26 +#define XBAR_MUX27 0x08000000U //!< Mask for X-BAR mux 27 +#define XBAR_MUX28 0x10000000U //!< Mask for X-BAR mux 28 +#define XBAR_MUX29 0x20000000U //!< Mask for X-BAR mux 29 +#define XBAR_MUX30 0x40000000U //!< Mask for X-BAR mux 30 +#define XBAR_MUX31 0x80000000U //!< Mask for X-BAR mux 31 +#endif + +//***************************************************************************** +// +//! The following values define the \e output parameter for +//! XBAR_setOutputMuxConfig(), XBAR_enableOutputMux(), and +//! XBAR_disableOutputMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_OUTPUT1 = 0, //!< OUTPUT1 of the Output X-BAR + XBAR_OUTPUT2 = 2, //!< OUTPUT2 of the Output X-BAR + XBAR_OUTPUT3 = 4, //!< OUTPUT3 of the Output X-BAR + XBAR_OUTPUT4 = 6, //!< OUTPUT4 of the Output X-BAR + XBAR_OUTPUT5 = 8, //!< OUTPUT5 of the Output X-BAR + XBAR_OUTPUT6 = 10, //!< OUTPUT6 of the Output X-BAR + XBAR_OUTPUT7 = 12, //!< OUTPUT7 of the Output X-BAR + XBAR_OUTPUT8 = 14, //!< OUTPUT8 of the Output X-BAR +} XBAR_OutputNum; + +//***************************************************************************** +// +//! The following values define the \e trip parameter for +//! XBAR_setEPWMMuxConfig(), XBAR_invertEPWMSignal(), XBAR_enableEPWMMux(), +//! and XBAR_disableEPWMMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_TRIP4 = 0, //!< TRIP4 of the ePWM X-BAR + XBAR_TRIP5 = 2, //!< TRIP5 of the ePWM X-BAR + XBAR_TRIP7 = 4, //!< TRIP7 of the ePWM X-BAR + XBAR_TRIP8 = 6, //!< TRIP8 of the ePWM X-BAR + XBAR_TRIP9 = 8, //!< TRIP9 of the ePWM X-BAR + XBAR_TRIP10 = 10, //!< TRIP10 of the ePWM X-BAR + XBAR_TRIP11 = 12, //!< TRIP11 of the ePWM X-BAR + XBAR_TRIP12 = 14 //!< TRIP12 of the ePWM X-BAR +} XBAR_TripNum; + +//***************************************************************************** +// +// The following values define the trip parameter for XBAR_setCLBMuxConfig(), +// XBAR_enableCLBMux(), and XBAR_disableCLBMux(). +// +//***************************************************************************** +typedef enum +{ + XBAR_AUXSIG0 = 0, + XBAR_AUXSIG1 = 2, + XBAR_AUXSIG2 = 4, + XBAR_AUXSIG3 = 6, + XBAR_AUXSIG4 = 8, + XBAR_AUXSIG5 = 10, + XBAR_AUXSIG6 = 12, + XBAR_AUXSIG7 = 14 +} XBAR_AuxSigNum; + +//***************************************************************************** +// +//! The following values define the \e input parameter for XBAR_setInputPin(). +// +//***************************************************************************** +typedef enum +{ + XBAR_INPUT1, //!< ePWM[TZ1], ePWM[TRIP1], X-BARs + XBAR_INPUT2, //!< ePWM[TZ2], ePWM[TRIP2], X-BARs + XBAR_INPUT3, //!< ePWM[TZ3], ePWM[TRIP3], X-BARs + XBAR_INPUT4, //!< ADC wrappers, X-BARs, XINT1 + XBAR_INPUT5, //!< EXTSYNCIN1, X-BARs, XINT2 + XBAR_INPUT6, //!< EXTSYNCIN2, ePWM[TRIP6], X-BARs, XINT3 + XBAR_INPUT7, //!< eCAP1, X-BARs + XBAR_INPUT8, //!< eCAP2, X-BARs + XBAR_INPUT9, //!< eCAP3, X-BARs + XBAR_INPUT10, //!< eCAP4, X-BARs + XBAR_INPUT11, //!< eCAP5, X-BARs + XBAR_INPUT12, //!< eCAP6, X-BARs + XBAR_INPUT13, //!< XINT4, X-BARs + XBAR_INPUT14 //!< XINT5, X-BARs +} XBAR_InputNum; + +#ifndef DOXYGEN_PDF_IGNORE +//***************************************************************************** +// +//! The following values define the \e muxConfig parameter for +//! XBAR_setOutputMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + // + //OUTPUTXBAR + // + XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH = 0x0000, + XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH_OR_L = 0x0001, + XBAR_OUT_MUX00_ADCAEVT1 = 0x0002, + XBAR_OUT_MUX00_ECAP1_OUT = 0x0003, + XBAR_OUT_MUX01_CMPSS1_CTRIPOUTL = 0x0200, + XBAR_OUT_MUX01_INPUTXBAR1 = 0x0201, + XBAR_OUT_MUX01_CLB1_OUT4 = 0x0202, + XBAR_OUT_MUX01_ADCCEVT1 = 0x0203, + XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH = 0x0400, + XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH_OR_L = 0x0401, + XBAR_OUT_MUX02_ADCAEVT2 = 0x0402, + XBAR_OUT_MUX02_ECAP2_OUT = 0x0403, + XBAR_OUT_MUX03_CMPSS2_CTRIPOUTL = 0x0600, + XBAR_OUT_MUX03_INPUTXBAR2 = 0x0601, + XBAR_OUT_MUX03_CLB1_OUT5 = 0x0602, + XBAR_OUT_MUX03_ADCCEVT2 = 0x0603, + XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH = 0x0800, + XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH_OR_L = 0x0801, + XBAR_OUT_MUX04_ADCAEVT3 = 0x0802, + XBAR_OUT_MUX04_ECAP3_OUT = 0x0803, + XBAR_OUT_MUX05_CMPSS3_CTRIPOUTL = 0x0A00, + XBAR_OUT_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_OUT_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_OUT_MUX05_ADCCEVT3 = 0x0A03, + XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH = 0x0C00, + XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH_OR_L = 0x0C01, + XBAR_OUT_MUX06_ADCAEVT4 = 0x0C02, + XBAR_OUT_MUX06_ECAP4_OUT = 0x0C03, + XBAR_OUT_MUX07_CMPSS4_CTRIPOUTL = 0x0E00, + XBAR_OUT_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_OUT_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_OUT_MUX07_ADCCEVT4 = 0x0E03, + XBAR_OUT_MUX08_CMPSS5_CTRIPOUTH = 0x1000, + XBAR_OUT_MUX08_CMPSS5_CTRIPOUTH_OR_L = 0x1001, + XBAR_OUT_MUX08_ADCBEVT1 = 0x1002, + XBAR_OUT_MUX08_ECAP5_OUT = 0x1003, + XBAR_OUT_MUX09_CMPSS5_CTRIPOUTL = 0x1200, + XBAR_OUT_MUX09_INPUTXBAR5 = 0x1201, + XBAR_OUT_MUX09_CLB3_OUT4 = 0x1202, + XBAR_OUT_MUX09_ADCDEVT1 = 0x1203, + XBAR_OUT_MUX10_CMPSS6_CTRIPOUTH = 0x1400, + XBAR_OUT_MUX10_CMPSS6_CTRIPOUTH_OR_L = 0x1401, + XBAR_OUT_MUX10_ADCBEVT2 = 0x1402, + XBAR_OUT_MUX10_ECAP6_OUT = 0x1403, + XBAR_OUT_MUX11_CMPSS6_CTRIPOUTL = 0x1600, + XBAR_OUT_MUX11_INPUTXBAR6 = 0x1601, + XBAR_OUT_MUX11_CLB3_OUT5 = 0x1602, + XBAR_OUT_MUX11_ADCDEVT2 = 0x1603, + XBAR_OUT_MUX12_CMPSS7_CTRIPOUTH = 0x1800, + XBAR_OUT_MUX12_CMPSS7_CTRIPOUTH_OR_L = 0x1801, + XBAR_OUT_MUX12_ADCBEVT3 = 0x1802, + XBAR_OUT_MUX13_CMPSS7_CTRIPOUTL = 0x1A00, + XBAR_OUT_MUX13_ADCSOCA = 0x1A01, + XBAR_OUT_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_OUT_MUX13_ADCDEVT3 = 0x1A03, + XBAR_OUT_MUX14_CMPSS8_CTRIPOUTH = 0x1C00, + XBAR_OUT_MUX14_CMPSS8_CTRIPOUTH_OR_L = 0x1C01, + XBAR_OUT_MUX14_ADCBEVT4 = 0x1C02, + XBAR_OUT_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_OUT_MUX15_CMPSS8_CTRIPOUTL = 0x1E00, + XBAR_OUT_MUX15_ADCSOCB = 0x1E01, + XBAR_OUT_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_OUT_MUX15_ADCDEVT4 = 0x1E03, + XBAR_OUT_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_OUT_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_OUT_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_OUT_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_OUT_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_OUT_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_OUT_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_OUT_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_OUT_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_OUT_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_OUT_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_OUT_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_OUT_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_OUT_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_OUT_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_OUT_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_OUT_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_OUT_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_OUT_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_OUT_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_OUT_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_OUT_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_OUT_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_OUT_MUX31_SD2FLT4_COMPL = 0x3E00, + +} XBAR_OutputMuxConfig; + +//***************************************************************************** +// +//! The following values define the \e muxConfig parameter for +//! XBAR_setEPWMMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + XBAR_EPWM_MUX00_CMPSS1_CTRIPH = 0x0000, + XBAR_EPWM_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001, + XBAR_EPWM_MUX00_ADCAEVT1 = 0x0002, + XBAR_EPWM_MUX00_ECAP1_OUT = 0x0003, + XBAR_EPWM_MUX01_CMPSS1_CTRIPL = 0x0200, + XBAR_EPWM_MUX01_INPUTXBAR1 = 0x0201, + XBAR_EPWM_MUX01_CLB1_OUT4 = 0x0202, + XBAR_EPWM_MUX01_ADCCEVT1 = 0x0203, + XBAR_EPWM_MUX02_CMPSS2_CTRIPH = 0x0400, + XBAR_EPWM_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401, + XBAR_EPWM_MUX02_ADCAEVT2 = 0x0402, + XBAR_EPWM_MUX02_ECAP2_OUT = 0x0403, + XBAR_EPWM_MUX03_CMPSS2_CTRIPL = 0x0600, + XBAR_EPWM_MUX03_INPUTXBAR2 = 0x0601, + XBAR_EPWM_MUX03_CLB1_OUT5 = 0x0602, + XBAR_EPWM_MUX03_ADCCEVT2 = 0x0603, + XBAR_EPWM_MUX04_CMPSS3_CTRIPH = 0x0800, + XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801, + XBAR_EPWM_MUX04_ADCAEVT3 = 0x0802, + XBAR_EPWM_MUX04_ECAP3_OUT = 0x0803, + XBAR_EPWM_MUX05_CMPSS3_CTRIPL = 0x0A00, + XBAR_EPWM_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_EPWM_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_EPWM_MUX05_ADCCEVT3 = 0x0A03, + XBAR_EPWM_MUX06_CMPSS4_CTRIPH = 0x0C00, + XBAR_EPWM_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01, + XBAR_EPWM_MUX06_ADCAEVT4 = 0x0C02, + XBAR_EPWM_MUX06_ECAP4_OUT = 0x0C03, + XBAR_EPWM_MUX07_CMPSS4_CTRIPL = 0x0E00, + XBAR_EPWM_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_EPWM_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_EPWM_MUX07_ADCCEVT4 = 0x0E03, + XBAR_EPWM_MUX08_CMPSS5_CTRIPH = 0x1000, + XBAR_EPWM_MUX08_CMPSS5_CTRIPH_OR_L = 0x1001, + XBAR_EPWM_MUX08_ADCBEVT1 = 0x1002, + XBAR_EPWM_MUX08_ECAP5_OUT = 0x1003, + XBAR_EPWM_MUX09_CMPSS5_CTRIPL = 0x1200, + XBAR_EPWM_MUX09_INPUTXBAR5 = 0x1201, + XBAR_EPWM_MUX09_CLB3_OUT4 = 0x1202, + XBAR_EPWM_MUX09_ADCDEVT1 = 0x1203, + XBAR_EPWM_MUX10_CMPSS6_CTRIPH = 0x1400, + XBAR_EPWM_MUX10_CMPSS6_CTRIPH_OR_L = 0x1401, + XBAR_EPWM_MUX10_ADCBEVT2 = 0x1402, + XBAR_EPWM_MUX10_ECAP6_OUT = 0x1403, + XBAR_EPWM_MUX11_CMPSS6_CTRIPL = 0x1600, + XBAR_EPWM_MUX11_INPUTXBAR6 = 0x1601, + XBAR_EPWM_MUX11_CLB3_OUT5 = 0x1602, + XBAR_EPWM_MUX11_ADCDEVT2 = 0x1603, + XBAR_EPWM_MUX12_CMPSS7_CTRIPH = 0x1800, + XBAR_EPWM_MUX12_CMPSS7_CTRIPH_OR_L = 0x1801, + XBAR_EPWM_MUX12_ADCBEVT3 = 0x1802, + XBAR_EPWM_MUX13_CMPSS7_CTRIPL = 0x1A00, + XBAR_EPWM_MUX13_ADCSOCA = 0x1A01, + XBAR_EPWM_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_EPWM_MUX13_ADCDEVT3 = 0x1A03, + XBAR_EPWM_MUX14_CMPSS8_CTRIPH = 0x1C00, + XBAR_EPWM_MUX14_CMPSS8_CTRIPH_OR_L = 0x1C01, + XBAR_EPWM_MUX14_ADCBEVT4 = 0x1C02, + XBAR_EPWM_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_EPWM_MUX15_CMPSS8_CTRIPL = 0x1E00, + XBAR_EPWM_MUX15_ADCSOCB = 0x1E01, + XBAR_EPWM_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_EPWM_MUX15_ADCDEVT4 = 0x1E03, + XBAR_EPWM_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_EPWM_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_EPWM_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_EPWM_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_EPWM_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_EPWM_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_EPWM_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_EPWM_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_EPWM_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_EPWM_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_EPWM_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_EPWM_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_EPWM_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_EPWM_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_EPWM_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_EPWM_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_EPWM_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_EPWM_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_EPWM_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_EPWM_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_EPWM_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_EPWM_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_EPWM_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_EPWM_MUX31_SD2FLT4_COMPL = 0x3E00 +} XBAR_EPWMMuxConfig; + +//***************************************************************************** +// +// The following values define the muxConfig parameter for +// XBAR_setCLBMuxConfig(). +// +//***************************************************************************** +typedef enum +{ + XBAR_CLB_MUX00_CMPSS1_CTRIPH = 0x0000, + XBAR_CLB_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001, + XBAR_CLB_MUX00_ADCAEVT1 = 0x0002, + XBAR_CLB_MUX00_ECAP1_OUT = 0x0003, + XBAR_CLB_MUX01_CMPSS1_CTRIPL = 0x0200, + XBAR_CLB_MUX01_INPUTXBAR1 = 0x0201, + XBAR_CLB_MUX01_CLB1_OUT4 = 0x0202, + XBAR_CLB_MUX01_ADCCEVT1 = 0x0203, + XBAR_CLB_MUX02_CMPSS2_CTRIPH = 0x0400, + XBAR_CLB_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401, + XBAR_CLB_MUX02_ADCAEVT2 = 0x0402, + XBAR_CLB_MUX02_ECAP2_OUT = 0x0403, + XBAR_CLB_MUX03_CMPSS2_CTRIPL = 0x0600, + XBAR_CLB_MUX03_INPUTXBAR2 = 0x0601, + XBAR_CLB_MUX03_CLB1_OUT5 = 0x0602, + XBAR_CLB_MUX03_ADCCEVT2 = 0x0603, + XBAR_CLB_MUX04_CMPSS3_CTRIPH = 0x0800, + XBAR_CLB_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801, + XBAR_CLB_MUX04_ADCAEVT3 = 0x0802, + XBAR_CLB_MUX04_ECAP3_OUT = 0x0803, + XBAR_CLB_MUX05_CMPSS3_CTRIPL = 0x0A00, + XBAR_CLB_MUX05_INPUTXBAR3 = 0x0A01, + XBAR_CLB_MUX05_CLB2_OUT4 = 0x0A02, + XBAR_CLB_MUX05_ADCCEVT3 = 0x0A03, + XBAR_CLB_MUX06_CMPSS4_CTRIPH = 0x0C00, + XBAR_CLB_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01, + XBAR_CLB_MUX06_ADCAEVT4 = 0x0C02, + XBAR_CLB_MUX06_ECAP4_OUT = 0x0C03, + XBAR_CLB_MUX07_CMPSS4_CTRIPL = 0x0E00, + XBAR_CLB_MUX07_INPUTXBAR4 = 0x0E01, + XBAR_CLB_MUX07_CLB2_OUT5 = 0x0E02, + XBAR_CLB_MUX07_ADCCEVT4 = 0x0E03, + XBAR_CLB_MUX08_CMPSS5_CTRIPH = 0x1000, + XBAR_CLB_MUX08_CMPSS5_CTRIPH_OR_L = 0x1001, + XBAR_CLB_MUX08_ADCBEVT1 = 0x1002, + XBAR_CLB_MUX08_ECAP5_OUT = 0x1003, + XBAR_CLB_MUX09_CMPSS5_CTRIPL = 0x1200, + XBAR_CLB_MUX09_INPUTXBAR5 = 0x1201, + XBAR_CLB_MUX09_CLB3_OUT4 = 0x1202, + XBAR_CLB_MUX09_ADCDEVT1 = 0x1203, + XBAR_CLB_MUX10_CMPSS6_CTRIPH = 0x1400, + XBAR_CLB_MUX10_CMPSS6_CTRIPH_OR_L = 0x1401, + XBAR_CLB_MUX10_ADCBEVT2 = 0x1402, + XBAR_CLB_MUX10_ECAP6_OUT = 0x1403, + XBAR_CLB_MUX11_CMPSS6_CTRIPL = 0x1600, + XBAR_CLB_MUX11_INPUTXBAR6 = 0x1601, + XBAR_CLB_MUX11_CLB3_OUT5 = 0x1602, + XBAR_CLB_MUX11_ADCDEVT2 = 0x1603, + XBAR_CLB_MUX12_CMPSS7_CTRIPH = 0x1800, + XBAR_CLB_MUX12_CMPSS7_CTRIPH_OR_L = 0x1801, + XBAR_CLB_MUX12_ADCBEVT3 = 0x1802, + XBAR_CLB_MUX13_CMPSS7_CTRIPL = 0x1A00, + XBAR_CLB_MUX13_ADCSOCA = 0x1A01, + XBAR_CLB_MUX13_CLB4_OUT4 = 0x1A02, + XBAR_CLB_MUX13_ADCDEVT3 = 0x1A03, + XBAR_CLB_MUX14_CMPSS8_CTRIPH = 0x1C00, + XBAR_CLB_MUX14_CMPSS8_CTRIPH_OR_L = 0x1C01, + XBAR_CLB_MUX14_ADCBEVT4 = 0x1C02, + XBAR_CLB_MUX14_EXTSYNCOUT = 0x1C03, + XBAR_CLB_MUX15_CMPSS8_CTRIPL = 0x1E00, + XBAR_CLB_MUX15_ADCSOCB = 0x1E01, + XBAR_CLB_MUX15_CLB4_OUT5 = 0x1E02, + XBAR_CLB_MUX15_ADCDEVT4 = 0x1E03, + XBAR_CLB_MUX16_SD1FLT1_COMPH = 0x2000, + XBAR_CLB_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001, + XBAR_CLB_MUX17_SD1FLT1_COMPL = 0x2200, + XBAR_CLB_MUX18_SD1FLT2_COMPH = 0x2400, + XBAR_CLB_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401, + XBAR_CLB_MUX19_SD1FLT2_COMPL = 0x2600, + XBAR_CLB_MUX20_SD1FLT3_COMPH = 0x2800, + XBAR_CLB_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801, + XBAR_CLB_MUX21_SD1FLT3_COMPL = 0x2A00, + XBAR_CLB_MUX22_SD1FLT4_COMPH = 0x2C00, + XBAR_CLB_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01, + XBAR_CLB_MUX23_SD1FLT4_COMPL = 0x2E00, + XBAR_CLB_MUX24_SD2FLT1_COMPH = 0x3000, + XBAR_CLB_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001, + XBAR_CLB_MUX25_SD2FLT1_COMPL = 0x3200, + XBAR_CLB_MUX26_SD2FLT2_COMPH = 0x3400, + XBAR_CLB_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401, + XBAR_CLB_MUX27_SD2FLT2_COMPL = 0x3600, + XBAR_CLB_MUX28_SD2FLT3_COMPH = 0x3800, + XBAR_CLB_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801, + XBAR_CLB_MUX29_SD2FLT3_COMPL = 0x3A00, + XBAR_CLB_MUX30_SD2FLT4_COMPH = 0x3C00, + XBAR_CLB_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01, + XBAR_CLB_MUX31_SD2FLT4_COMPL = 0x3E00, +} XBAR_CLBMuxConfig; + + +//***************************************************************************** +// +//! The following values define the \e inputFlag parameter for +//! XBAR_getInputFlagStatus() and XBAR_clearInputFlag(). +// +//***************************************************************************** +typedef enum +{ + // + // XBARFLG1 + // + XBAR_INPUT_FLG_CMPSS1_CTRIPL = 0x0000, + XBAR_INPUT_FLG_CMPSS1_CTRIPH = 0x0001, + XBAR_INPUT_FLG_CMPSS2_CTRIPL = 0x0002, + XBAR_INPUT_FLG_CMPSS2_CTRIPH = 0x0003, + XBAR_INPUT_FLG_CMPSS3_CTRIPL = 0x0004, + XBAR_INPUT_FLG_CMPSS3_CTRIPH = 0x0005, + XBAR_INPUT_FLG_CMPSS4_CTRIPL = 0x0006, + XBAR_INPUT_FLG_CMPSS4_CTRIPH = 0x0007, + XBAR_INPUT_FLG_CMPSS5_CTRIPL = 0x0008, + XBAR_INPUT_FLG_CMPSS5_CTRIPH = 0x0009, + XBAR_INPUT_FLG_CMPSS6_CTRIPL = 0x000A, + XBAR_INPUT_FLG_CMPSS6_CTRIPH = 0x000B, + XBAR_INPUT_FLG_CMPSS7_CTRIPL = 0x000C, + XBAR_INPUT_FLG_CMPSS7_CTRIPH = 0x000D, + XBAR_INPUT_FLG_CMPSS8_CTRIPL = 0x000E, + XBAR_INPUT_FLG_CMPSS8_CTRIPH = 0x000F, + XBAR_INPUT_FLG_CMPSS1_CTRIPOUTL = 0x0010, + XBAR_INPUT_FLG_CMPSS1_CTRIPOUTH = 0x0011, + XBAR_INPUT_FLG_CMPSS2_CTRIPOUTL = 0x0012, + XBAR_INPUT_FLG_CMPSS2_CTRIPOUTH = 0x0013, + XBAR_INPUT_FLG_CMPSS3_CTRIPOUTL = 0x0014, + XBAR_INPUT_FLG_CMPSS3_CTRIPOUTH = 0x0015, + XBAR_INPUT_FLG_CMPSS4_CTRIPOUTL = 0x0016, + XBAR_INPUT_FLG_CMPSS4_CTRIPOUTH = 0x0017, + XBAR_INPUT_FLG_CMPSS5_CTRIPOUTL = 0x0018, + XBAR_INPUT_FLG_CMPSS5_CTRIPOUTH = 0x0019, + XBAR_INPUT_FLG_CMPSS6_CTRIPOUTL = 0x001A, + XBAR_INPUT_FLG_CMPSS6_CTRIPOUTH = 0x001B, + XBAR_INPUT_FLG_CMPSS7_CTRIPOUTL = 0x001C, + XBAR_INPUT_FLG_CMPSS7_CTRIPOUTH = 0x001D, + XBAR_INPUT_FLG_CMPSS8_CTRIPOUTL = 0x001E, + XBAR_INPUT_FLG_CMPSS8_CTRIPOUTH = 0x001F, + // + // XBARFLG2 + // + XBAR_INPUT_FLG_INPUT1 = 0x0100, + XBAR_INPUT_FLG_INPUT2 = 0x0101, + XBAR_INPUT_FLG_INPUT3 = 0x0102, + XBAR_INPUT_FLG_INPUT4 = 0x0103, + XBAR_INPUT_FLG_INPUT5 = 0x0104, + XBAR_INPUT_FLG_INPUT6 = 0x0105, + XBAR_INPUT_FLG_ADCSOCA = 0x0106, + XBAR_INPUT_FLG_ADCSOCB = 0x0107, + XBAR_INPUT_FLG_CLB1_OUT4 = 0x0108, + XBAR_INPUT_FLG_CLB1_OUT5 = 0x0109, + XBAR_INPUT_FLG_CLB2_OUT4 = 0x010A, + XBAR_INPUT_FLG_CLB2_OUT5 = 0x010B, + XBAR_INPUT_FLG_CLB3_OUT4 = 0x010C, + XBAR_INPUT_FLG_CLB3_OUT5 = 0x010D, + XBAR_INPUT_FLG_CLB4_OUT4 = 0x010E, + XBAR_INPUT_FLG_CLB4_OUT5 = 0x010F, + XBAR_INPUT_FLG_ECAP1_OUT = 0x0110, + XBAR_INPUT_FLG_ECAP2_OUT = 0x0111, + XBAR_INPUT_FLG_ECAP3_OUT = 0x0112, + XBAR_INPUT_FLG_ECAP4_OUT = 0x0113, + XBAR_INPUT_FLG_ECAP5_OUT = 0x0114, + XBAR_INPUT_FLG_ECAP6_OUT = 0x0115, + XBAR_INPUT_FLG_EXTSYNCOUT = 0x0116, + XBAR_INPUT_FLG_ADCAEVT1 = 0x0117, + XBAR_INPUT_FLG_ADCAEVT2 = 0x0118, + XBAR_INPUT_FLG_ADCAEVT3 = 0x0119, + XBAR_INPUT_FLG_ADCAEVT4 = 0x011A, + XBAR_INPUT_FLG_ADCBEVT1 = 0x011B, + XBAR_INPUT_FLG_ADCBEVT2 = 0x011C, + XBAR_INPUT_FLG_ADCBEVT3 = 0x011D, + XBAR_INPUT_FLG_ADCBEVT4 = 0x011E, + XBAR_INPUT_FLG_ADCCEVT1 = 0x011F, + // + // XBARFLG3 + // + XBAR_INPUT_FLG_ADCCEVT2 = 0x0200, + XBAR_INPUT_FLG_ADCCEVT3 = 0x0201, + XBAR_INPUT_FLG_ADCCEVT4 = 0x0202, + XBAR_INPUT_FLG_ADCDEVT1 = 0x0203, + XBAR_INPUT_FLG_ADCDEVT2 = 0x0204, + XBAR_INPUT_FLG_ADCDEVT3 = 0x0205, + XBAR_INPUT_FLG_ADCDEVT4 = 0x0206, + XBAR_INPUT_FLG_SD1FLT1_COMPL = 0x0207, + XBAR_INPUT_FLG_SD1FLT1_COMPH = 0x0208, + XBAR_INPUT_FLG_SD1FLT2_COMPL = 0x0209, + XBAR_INPUT_FLG_SD1FLT2_COMPH = 0x020A, + XBAR_INPUT_FLG_SD1FLT3_COMPL = 0x020B, + XBAR_INPUT_FLG_SD1FLT3_COMPH = 0x020C, + XBAR_INPUT_FLG_SD1FLT4_COMPL = 0x020D, + XBAR_INPUT_FLG_SD1FLT4_COMPH = 0x020E, + XBAR_INPUT_FLG_SD2FLT1_COMPL = 0x020F, + XBAR_INPUT_FLG_SD2FLT1_COMPH = 0x0210, + XBAR_INPUT_FLG_SD2FLT2_COMPL = 0x0211, + XBAR_INPUT_FLG_SD2FLT2_COMPH = 0x0212, + XBAR_INPUT_FLG_SD2FLT3_COMPL = 0x0213, + XBAR_INPUT_FLG_SD2FLT3_COMPH = 0x0214, + XBAR_INPUT_FLG_SD2FLT4_COMPL = 0x0215, + XBAR_INPUT_FLG_SD2FLT4_COMPH = 0x0216 +} XBAR_InputFlag; +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +//***************************************************************************** +// +//! Enables the Output X-BAR mux values to be passed to the output signal. +//! +//! \param output is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR output +//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is +//! the output number between 1 and 8 inclusive. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be OR'd together to enable several +//! muxes on an output at the same time. For example, passing this function +//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would enable muxes 4 and 10. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableOutputMux(XBAR_OutputNum output, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_OUTPUT_EN_REG_BASE + (uint16_t)output) |= muxes; + + EDIS; + + +} + +//***************************************************************************** +// +//! Disables the Output X-BAR mux values from being passed to the output. +//! +//! \param output is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values from being passed to the X-BAR output +//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is +//! the output number between 1 and 8 inclusive. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be OR'd together to disable several +//! muxes on an output at the same time. For example, passing this function +//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would disable muxes 4 and 10. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableOutputMux(XBAR_OutputNum output, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_OUTPUT_EN_REG_BASE + (uint16_t)output) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Enables or disables the output latch to drive the selected output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! \param enable is a flag that determines whether or not the latch is +//! selected to drive the X-BAR output. +//! +//! This function sets the Output X-BAR output signal latch mode. If the +//! \e enable parameter is \b true, the output specified by \e output will be +//! driven by the output latch. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_setOutputLatchMode(XBAR_OutputNum output, bool enable) +{ + EALLOW; + + // + // Set or clear the latch setting bit based on the enable parameter. + // + if(enable) + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHENABLE) |= + 0x1U << ((uint16_t)output / 2U); + } + else + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHENABLE) &= + ~(0x1U << ((uint16_t)output / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Returns the status of the output latch +//! +//! \param output is the X-BAR output being checked. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! \return Returns \b true if the output corresponding to \e output was +//! triggered. If not, it will return \b false. +// +//***************************************************************************** +static inline bool +XBAR_getOutputLatchStatus(XBAR_OutputNum output) +{ + // + // Get the status of the Output X-BAR output latch. + // + return((HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCH) & + (0x1U << ((uint16_t)output / 2U))) != 0U); +} + +//***************************************************************************** +// +//! Clears the output latch for the specified output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! This function clears the Output X-BAR output latch. The output to be +//! configured is specified by the \e output parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_clearOutputLatch(XBAR_OutputNum output) +{ + // + // Set the bit that clears the corresponding OUTPUTLATCH bit. + // + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHCLR) |= + 0x1U << ((uint16_t)output / 2U); +} + +//***************************************************************************** +// +//! Forces the output latch for the specified output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! +//! This function forces the Output X-BAR output latch. The output to be +//! configured is specified by the \e output parameter. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_forceOutputLatch(XBAR_OutputNum output) +{ + // + // Set the bit that forces the corresponding OUTPUTLATCH bit. + // + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLATCHFRC) = + (uint16_t)0x1U << ((uint16_t)output / 2U); +} + +//***************************************************************************** +// +//! Configures the polarity of an Output X-BAR output. +//! +//! \param output is the X-BAR output being configured. +//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the Output X-BAR signal if the \e invert parameter is +//! \b true. If \e invert is \b false, the signal will be passed as is. The +//! \e output parameter is a value \b XBAR_OUTPUTy where y is the output +//! number between 1 and 8 inclusive. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertOutputSignal(XBAR_OutputNum output, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTINV) |= + 0x1U << ((uint16_t)output / 2U); + } + else + { + HWREGH(OUTPUTXBAR_BASE + XBAR_O_OUTPUTINV) &= + ~(0x1U << ((uint16_t)output / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Enables the ePWM X-BAR mux values to be passed to an ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR trip +//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! enable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableEPWMMux(XBAR_TripNum trip, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_EPWM_EN_REG_BASE + (uint32_t)trip) |= muxes; + EDIS; +} + +//***************************************************************************** +// +//! Disables the ePWM X-BAR mux values to be passed to an ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values to be passed to the X-BAR trip +//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! disable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableEPWMMux(XBAR_TripNum trip, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_EPWM_EN_REG_BASE + (uint32_t)trip) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the polarity of an ePWM X-BAR output. +//! +//! \param trip is the X-BAR output being configured. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the ePWM X-BAR trip signal if the \e invert +//! parameter is \b true. If \e invert is \b false, the signal will be passed +//! as is. The \e trip parameter is a value \b XBAR_TRIPy where y is +//! the number of the trip signal on the ePWM X-BAR that is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertEPWMSignal(XBAR_TripNum trip, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(EPWMXBAR_BASE + XBAR_O_TRIPOUTINV) |= + 0x1U << ((uint16_t)trip / 2U); + } + else + { + HWREGH(EPWMXBAR_BASE + XBAR_O_TRIPOUTINV) &= + ~(0x1U << ((uint16_t)trip / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Sets the GPIO pin for an Input X-BAR input. +//! +//! \param input is the X-BAR input being configured. +//! \param pin is the identifying number of the pin. +//! +//! This function configures which GPIO is assigned to an Input X-BAR input. +//! The \e input parameter is a value in the form of a define \b XBAR_INPUTy +//! where y is a the input number for the Input X-BAR. +//! +//! The pin is specified by its numerical value. For example, GPIO34 is +//! specified by passing 34 as \e pin. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_setInputPin(XBAR_InputNum input, uint16_t pin) +{ + // + // Check the argument. + // + ASSERT(pin <= XBAR_GPIO_MAX_CNT); + + // + // Write the requested pin to the appropriate input select register. + // + EALLOW; + + HWREGH(XBAR_INPUT_BASE + (uint16_t)input) = pin; + + EDIS; +} + +//***************************************************************************** +// +//! Locks an input to the Input X-BAR. +//! +//! \param input is an input to the Input X-BAR. +//! +//! This function locks the specific input on the Input X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockInput(XBAR_InputNum input) +{ + // + // lock the input in the INPUTSELECTLOCK register. + // + EALLOW; + HWREG(INPUTXBAR_BASE + XBAR_O_INPUTSELECTLOCK) = + 1UL << (uint16_t)input; + EDIS; +} + +//***************************************************************************** +// +//! Locks the Output X-BAR. +//! +//! This function locks the Output X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockOutput(void) +{ + // + // Lock the Output X-BAR with the OUTPUTLOCK register. + // Write key 0x5A5A to the KEY bits and 1 to LOCK bit. + // + EALLOW; + + HWREG(OUTPUTXBAR_BASE + XBAR_O_OUTPUTLOCK) = + ((uint32_t)0x5A5A << XBAR_OUTPUTLOCK_KEY_S) | + (uint32_t)XBAR_OUTPUTLOCK_LOCK; + + EDIS; +} + +//***************************************************************************** +// +//! Locks the ePWM X-BAR. +//! +//! This function locks the ePWM X-BAR. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_lockEPWM(void) +{ + // + // Lock the ePWM X-BAR with the TRIPLOCK register. + // Write key 0x5A5A to the KEY bits and 1 to LOCK bit. + // + EALLOW; + + HWREG(EPWMXBAR_BASE + XBAR_O_TRIPLOCK) = + ((uint32_t)0x5A5A << XBAR_TRIPLOCK_KEY_S) | + (uint32_t)XBAR_TRIPLOCK_LOCK; + EDIS; +} + +//***************************************************************************** +// +//! Enables the CLB X-BAR mux values to be passed to an CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be enabled. +//! +//! This function enables the mux values to be passed to the X-BAR auxSignal +//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB. +//! +//! The \e muxes parameter is a bit field of the muxes being enabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! enable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_enableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes) +{ + // + // Set the enable bit. + // + EALLOW; + + HWREG(XBAR_CLB_EN_REG_BASE + (uint32_t)auxSignal) |= muxes; + + EDIS; +} + +//***************************************************************************** +// +//! Disables the CLB X-BAR mux values to be passed to an CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxes is a bit field of the muxes to be disabled. +//! +//! This function disables the mux values to be passed to the X-BAR auxSignal +//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB. +//! +//! The \e muxes parameter is a bit field of the muxes being disabled where bit +//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided +//! in the form of \b XBAR_MUXnn that can be logically OR'd together to +//! disable several muxes on an output at the same time. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_disableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes) +{ + // + // Clear the enable bit. + // + EALLOW; + + HWREG(XBAR_CLB_EN_REG_BASE + (uint32_t)auxSignal) &= ~(muxes); + + EDIS; +} + +//***************************************************************************** +// +//! Configures the polarity of an CLB X-BAR output. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param invert is a flag that determines whether the output is active-high +//! or active-low. +//! +//! This function inverts the CLB X-BAR auxSignal signal if the \e invert +//! parameter is \b true. If \e invert is \b false, the signal will be passed +//! as is. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is +//! the number of the signal on the CLB X-BAR that is being configured. +//! +//! \return None. +// +//***************************************************************************** +static inline void +XBAR_invertCLBSignal(XBAR_AuxSigNum auxSignal, bool invert) +{ + // + // Set or clear the polarity setting bit based on the invert parameter. + // + EALLOW; + + if(invert) + { + HWREGH(CLBXBAR_BASE + XBAR_O_AUXSIGOUTINV) |= + 0x1U << ((uint16_t)auxSignal / 2U); + } + else + { + HWREGH(CLBXBAR_BASE + XBAR_O_AUXSIGOUTINV) &= + ~(0x1U << ((uint16_t)auxSignal / 2U)); + } + + EDIS; +} + +//***************************************************************************** +// +//! Configures the Output X-BAR mux that determines the signals passed to an +//! output. +//! +//! \param output is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an Output X-BAR mux. This determines which +//! signal(s) should be passed through the X-BAR to a GPIO. The \e output +//! parameter is a value \b XBAR_OUTPUTy where y is a the output number +//! between 1 and 8 inclusive. +//! +//! The \e muxConfig parameter for OUTPUT XBAR is the mux configuration +//! value that specifies which signal will be passed from the mux. The +//! values have the format of \b XBAR_OUT_MUXnn_xx where the 'xx' is +//! the signal and nn is the mux number. +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the output signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_OUT_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_OUT_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_setOutputMuxConfig(XBAR_OutputNum output, XBAR_OutputMuxConfig muxConfig); + +//***************************************************************************** +// +//! Configures the ePWM X-BAR mux that determines the signals passed to an +//! ePWM module. +//! +//! \param trip is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an ePWM X-BAR mux. This determines which signal(s) +//! should be passed through the X-BAR to an ePWM module. The \e trip +//! parameter is a value \b XBAR_TRIPy where y is a the number of the trip +//! signal on the ePWM. +//! +//! The \e muxConfig parameter is the mux configuration value that specifies +//! which signal will be passed from the mux. The values have the format of +//! \b XBAR_EPWM_MUXnn_xx where the 'xx' is the signal and nn is the mux +//! number (0 through 31). The possible values are found in xbar.h +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the trip signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_EPWM_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_EPWM_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig); + +//***************************************************************************** +// +//! Returns the status of the input latch. +//! +//! \param inputFlag is the X-BAR input latch being checked. Values are in the +//! format of /b XBAR_INPUT_FLG_XXXX where "XXXX" is name of the signal. +//! +//! \return Returns \b true if the X-BAR input corresponding to the +//! \e inputFlag has been triggered. If not, it will return \b false. +// +//***************************************************************************** +extern bool +XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag); + +//***************************************************************************** +// +//! Clears the input latch for the specified input latch. +//! +//! \param inputFlag is the X-BAR input latch being cleared. +//! +//! This function clears the Input X-BAR input latch. The input latch to be +//! cleared is specified by the \e inputFlag parameter. +//! +//! \return None. +// +//***************************************************************************** +extern void +XBAR_clearInputFlag(XBAR_InputFlag inputFlag); + +//***************************************************************************** +// +//! Configures the CLB X-BAR mux that determines the signals passed to a +//! CLB module. +//! +//! \param auxSignal is the X-BAR output being configured. +//! \param muxConfig is mux configuration that specifies the signal. +//! +//! This function configures an CLB X-BAR mux. This determines which signal(s) +//! should be passed through the X-BAR to an CLB module. The \e auxSignal +//! parameter is a value \b XBAR_AUXSIGy where y is a the number of the +//! signal on the CLB. +//! +//! The \e muxConfig parameter is the mux configuration value that specifies +//! which signal will be passed from the mux. The values have the format of +//! \b XBAR_CLB_MUXnn_xx where the 'xx' is the signal and nn is the mux +//! number (0 through 31). The possible values are found in xbar.h +//! +//! This function may be called for each mux of an output and their values will +//! be logically OR'd before being passed to the signal. This means that +//! this function may be called, for example, with the argument +//! \b XBAR_CLB_MUX00_ECAP1_OUT and then with the argument +//! \b XBAR_CLB_MUX03_INPUTXBAR2, resulting in the values of MUX00 and MUX03 +//! being logically OR'd if both are enabled. Calling the function twice for +//! the same mux on the output will result in the configuration in the second +//! call overwriting the first. +//! +//! \return None. +// +//***************************************************************************** +extern void XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal, + XBAR_CLBMuxConfig muxConfig); + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +#endif // XBAR_H diff --git a/gpio_driverlib_cpu1/gpio_driverlib_cpu1.c b/gpio_driverlib_cpu1/gpio_driverlib_cpu1.c new file mode 100644 index 0000000..e69de29 diff --git a/gpio_driverlib_cpu1/targetConfigs/TMS320F28377D.ccxml b/gpio_driverlib_cpu1/targetConfigs/TMS320F28377D.ccxml new file mode 100644 index 0000000..79dd5cc --- /dev/null +++ b/gpio_driverlib_cpu1/targetConfigs/TMS320F28377D.ccxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/gpio_driverlib_cpu1/targetConfigs/readme.txt b/gpio_driverlib_cpu1/targetConfigs/readme.txt new file mode 100644 index 0000000..af97b62 --- /dev/null +++ b/gpio_driverlib_cpu1/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file